12.3. Jenkins 代理
OpenShift Container Platform 提供 Base、Maven 和 Node.js 镜像,以用作 Jenkins 代理。
Jenkins 代理的 Base 镜像执行以下操作:
-
拉取(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 镜像扩展 Base 镜像。它们为通用基础镜像(UBI)提供 Dockerfile,您可以在构建新代理镜像时引用。另请注意 contrib
和 contrib/bin
子目录,它可让您为镜像插入配置文件和可执行脚本。
使用适合您的 OpenShift Container Platform 发行版本的代理镜像版本。嵌入了与 OpenShift Container Platform 版本不兼容的 oc
客户端版本可能会导致意外行为。
OpenShift Container Platform Jenkins 镜像还定义了以下示例 Pod 模板,以说明如何将这些代理镜像用于 Jenkins Kubernetes 插件:
-
maven
Pod 模板,它使用一个使用了 OpenShift Container Platform Maven Jenkins 代理镜像的单个容器。 -
nodejs
pod 模板,它使用单一容器,该容器使用 OpenShift Container Platform Node.js Jenkins 代理镜像。 -
java-builder
pod 模板,它采用两个容器。其中一个是jnlp
容器,它使用 OpenShift Container Platform Base agent 镜像并处理 JNLP 合同来启动和停止 Jenkins 代理。其二是java
容器,它使用java
OpenShift Container Platform Sample ImageStream,其包含各种 Java 二进制文件,包括 Maven 二进制文件mvn
,用于构建代码。 -
nodejs-builder
Pod 模板,它采用两个容器。其中一个是jnlp
容器,它使用 OpenShift Container Platform Base agent 镜像并处理 JNLP 合同来启动和停止 Jenkins 代理。第二个是nodejs
容器,它使用nodejs
OpenShift Container Platform Sample ImageStream,其中包含各种 Node.js 二进制文件,包括npm
二进制文件用于构建代码。
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 可能会根据资源配额继续运行和计数。