5.2. Jenkins 代理
OpenShift Container Platform 提供了一个基础镜像,用作 Jenkins 代理。
Jenkins 代理的 Base 镜像执行以下操作:
-
拉取(pull)所需工具、无头 Java、Jenkins JNLP 客户端以及有用的工具,包括
git、tar、zip和nss等。 - 建立 JNLP 代理作为入口点。
-
包括
oc客户端工具,用于从 Jenkins 任务调用命令行操作。 -
为 Red Hat Enterprise Linux(RHEL)和
localdev镜像提供 Dockerfile。
使用适合您的 OpenShift Container Platform 发行版本的代理镜像版本。嵌入了与 OpenShift Container Platform 版本不兼容的 oc 客户端版本可能会导致意外行为。
OpenShift Container Platform Jenkins 镜像还定义了以下示例 java-builder pod 模板,以说明如何将代理镜像用于 Jenkins Kubernetes 插件。
java-builder pod 模板采用两个容器:*其中一个是 jnlp 容器,它使用 OpenShift Container Platform Base agent 镜像并处理 JNLP 合同来启动和停止 Jenkins 代理。* 一个是 java 容器,它使用 java OpenShift Container Platform Sample ImageStream,其包含各种 Java 二进制文件,包括 Maven 二进制文件 mvn,用于构建代码。
5.2.1. Jenkins 代理镜像 复制链接链接已复制到粘贴板!
OpenShift Container Platform Jenkins 代理镜像在 Quay.io 或 registry.redhat.io 上提供。
Jenkins 镜像通过 Red Hat Registry 提供:
docker pull registry.redhat.io/ocp-tools-4/jenkins-rhel8:<image_tag>
$ docker pull registry.redhat.io/ocp-tools-4/jenkins-rhel8:<image_tag>
docker pull registry.redhat.io/ocp-tools-4/jenkins-agent-base-rhel8:<image_tag>
$ docker pull registry.redhat.io/ocp-tools-4/jenkins-agent-base-rhel8:<image_tag>
要使用这些镜像,您可直接从 Quay.io 或 registry.redhat.io 访问或将其推送(push)到 OpenShift Container Platform 容器镜像 registry 中。
5.2.2. Jenkins 代理环境变量 复制链接链接已复制到粘贴板!
每个 Jenkins 代理容器均可通过以下环境变量进行配置。
| 变量 | 定义 | 值和设置示例 |
|---|---|---|
|
|
这些值控制 Jenkins JVM 的最大堆大小。如果设置了 默认情况下,Jenkins JVM 的最大堆大小设置为容器内存限值的 50%,且无上限。 |
|
|
|
这些值控制 Jenkins JVM 的初始堆大小。如果设置了 默认情况下,JVM 设置初始堆大小。 |
|
|
| 如果设置,请将用于调整内部 JVM 线程数的内核数指定为整数。 |
示例设置: |
|
| 指定应用于该容器中运行的所有 JVM 的选项。不建议覆盖该值。 |
默认: |
|
| 指定 Jenkins JVM 垃圾回收参数。不建议覆盖该值。 |
默认: |
|
| 指定适用于 Jenkins JVM 的附加选项。这些选项附加至所有其他选项中,包括上面的 Java 选项,必要时可用于覆盖其中任何一个选项。用空格分开各个附加选项;如有任意选项包含空格字符,请使用反斜杠转义。 |
示例设置: |
|
|
指定用来在容器中运行代理的 Java 版本版本。容器基础镜像安装了两个 java 版本: |
默认值为
示例设置: |
5.2.3. Jenkins 代理内存要求 复制链接链接已复制到粘贴板!
所有 Jenkins 代理均使用 JVM 来托管 Jenkins JNLP 代理和运行任何 Java 应用程序,如 javac、Maven 或 Gradle。
默认情况下,Jenkins JNLP 代理 JVM 会将容器内存限值的 50% 用于其堆。该值可通过 CONTAINER_HEAP_PERCENT 环境变量修改,还可设置上限或整个覆盖。
默认情况下,Jenkins 代理容器中运行的其它进程(如 shell 脚本或从管道运行的 oc 命令)在不引发 OOM 终止的情况下,所用内存均不得超过剩余的 50% 内存限值。
默认情况下,Jenkins 代理容器中运行的每个其他 JVM 进程最多可将 25% 的容器内存限值用于其堆。对于很多构建工作负载,可能还需调整此限值。
5.2.4. Jenkins 代理 Gradle 构建 复制链接链接已复制到粘贴板!
在 OpenShift Container Platform 上的 Jenkins 代理中托管 Gradle 构建会出现其他复杂情况,因为除了 Jenkins JNLP 代理和 Gradle JVM 外,Gradle 还会生成第三个 JVM 来运行测试(若已指定)。
建议将以下设置作为起始点,在 OpenShift Container Platform 上内存受限的 Jenkins 代理中运行 Gradle 构建。您还可按需修改这些设置。
-
通过将
org.gradle.daemon=false添加到gradle.properties文件中来确保禁用长期 Gradle 守护进程。 -
通过确保
gradle.properties文件中未设置org.gradle.parallel=true且--parallel未设置为命令行参数来禁用并行构建执行。 -
要防止 Java 编译超出进程范围,请在
build.gradle文件中设置java { options.fork = false }。 -
通过确保在
build.gradle文件中设置test { maxParallelForks = 1 }来禁用多个附加测试进程。 -
使用
GRADLE_OPTS、JAVA_OPTS或JAVA_TOOL_OPTIONS环境变量覆盖 Gradle JVM 内存参数。 -
通过在
build.gradle中定义maxHeapSize和jvmArgs设置,或通过-Dorg.gradle.jvmargs命令行参数来为任何 Gradle 测试 JVM 设置最大堆大小和 JVM 参数。
5.2.5. Jenkins 代理 pod 保留 复制链接链接已复制到粘贴板!
构建完成后或停止后会默认删除 Jenkins 代理 pod。此行为可通过 Kubernetes 插件 pod 保留设置来更改。Pod 保留可针对所有 Jenkins 构建设置,并覆盖每个 pod 模板。支持以下行为:
-
Always保留构建 pod,不受构建结果的限制。 -
Default使用插件值,即仅限 pod 模板。 -
Never始终删除 pod。 -
On Failure如果构建过程中失败,则保留 pod。
您可覆盖管道 Jenkinsfile 中的 pod 保留:
- 1
podRetention允许的值为never()、onFailure()、always()和default()。
保留的 Pod 可能会根据资源配额继续运行和计数。