12.3. Jenkins 代理
OpenShift Container Platform 提供了适合用作 Jenkins 代理的三种镜像: Base
、Maven
和 Node.js
镜像。
第一个是适用于 Jenkins 代理的基础镜像:
-
它会拉取(pull)所需工具、无头 Java、Jenkins JNLP 客户端以及一些实用工具,其中包括
git
、tar
、zip
和nss
等。 - 它将 JNLP 代理设立为入口点。
-
它包含
oc
客户端工具,用于从 Jenkins 任务调用命令行操作。 -
它为 Red Hat Enterprise Linux (RHEL) 和
localdev
镜像提供 Dockerfile。
另外还提供了扩展基础镜像的两个镜像:
- Maven v3.5 镜像
- Node.js v10 镜像和 Node.js v12 镜像
Maven 和 Node.js Jenkins 代理镜像为通用基础镜像 (UBI) 提供 Dockerfile,您可在构建新代理镜像时引用。另请注意 contrib
和 contrib/bin
子目录。这些子目录可用于为您的镜像插入配置文件和可执行脚本。
为 OpenShift Container Platform 使用并扩展适当的代理镜像版本。如果嵌入至该代理镜像的 oc
客户端版本与 OpenShift Container Platform 版本不兼容,则可能引发意外行为。
12.3.1. Jenkins 代理镜像
OpenShift Container Platform Jenkins 代理镜像在 Quay.io 或 registry.redhat.io 上提供。
Jenkins 镜像通过 Red Hat Registry 提供:
$ docker pull registry.redhat.io/openshift4/ose-jenkins:<v4.5.0>
$ docker pull registry.redhat.io/openshift4/jenkins-agent-nodejs-10-rhel7:<v4.5.0>
$ docker pull registry.redhat.io/openshift4/jenkins-agent-nodejs-12-rhel7:<v4.5.0>
$ docker pull registry.redhat.io/openshift4/ose-jenkins-agent-maven:<v4.5.0>
$ docker pull registry.redhat.io/openshift4/ose-jenkins-agent-base:<v4.5.0>
要使用这些镜像,您可直接从 Quay.io 或 registry.redhat.io 访问或将其推送(push)到 OpenShift Container Platform 容器镜像 registry 中。
12.3.2. Jenkins 代理环境变量
每个 Jenkins 代理容器均可通过以下环境变量进行配置。
变量 | 定义 | 值和设置示例 |
---|---|---|
|
这些值控制 Jenkins JVM 的最大堆大小。如果设置了 默认情况下,Jenkins JVM 的最大堆大小设置为容器内存限值的 50%,且无上限。 |
|
|
这些值控制 Jenkins JVM 的初始堆大小。如果设置了 默认情况下,JVM 设置初始堆大小。 |
|
| 如果设置,请将用于调整内部 JVM 线程数的内核数指定为整数。 |
示例设置: |
| 指定应用于该容器中运行的所有 JVM 的选项。不建议覆盖该值。 |
默认: |
| 指定 Jenkins JVM 垃圾回收参数。不建议覆盖该值。 |
默认: |
| 指定适用于 Jenkins JVM 的附加选项。这些选项附加至所有其他选项中,包括上面的 Java 选项,必要时可用于覆盖其中任何一个选项。用空格分开各个附加选项;如有任意选项包含空格字符,请使用反斜杠转义。 |
示例设置: |
|
指定用来在容器中运行代理的 Java 版本版本。容器基础镜像安装了两个 java 版本: |
默认值为
示例设置: |
12.3.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% 的容器内存限值用于其堆。对于很多构建工作负载,可能还需调整此限值。
12.3.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 参数。
12.3.5. Jenkins 代理 pod 保留
构建完成后或停止后会默认删除 Jenkins 代理 pod。此行为可通过 Kubernetes 插件 pod 保留设置来更改。Pod 保留可针对所有 Jenkins 构建设置,并覆盖每个 pod 模板。支持以下行为:
-
Always
保留构建 pod,不受构建结果的限制。 -
Default
使用插件值,即仅限 pod 模板。 -
Never
始终删除 pod。 -
On Failure
如果构建过程中失败,则保留 pod。
您可覆盖管道 Jenkinsfile 中的 pod 保留:
podTemplate(label: "mypod",
cloud: "openshift",
inheritFrom: "maven",
podRetention: onFailure(), 1
containers: [
...
]) {
node("mypod") {
...
}
}
- 1
podRetention
允许的值为never()
、onFailure()
、always()
和default()
。
保留的 Pod 可能会根据资源配额继续运行和计数。