$ docker pull registry.redhat.io/ocp-tools-4/jenkins-rhel8:<image_tag>
OpenShift Container Platform提供一个用作Jenkins代理的基础镜像。
Jenkins代理的基础镜像执行以下操作:
引入必需的工具、无头Java、Jenkins JNLP客户端以及有用的工具,包括git
、tar
、zip
和nss
等。
将JNLP代理设置为入口点。
包含oc
客户端工具,用于从Jenkins作业内部调用命令行操作。
为Red Hat Enterprise Linux (RHEL)和localdev
镜像提供Dockerfile。
使用适合您的OpenShift Container Platform发行版本的代理镜像版本。嵌入与OpenShift Container Platform版本不兼容的 |
OpenShift Container Platform Jenkins镜像还定义了以下示例java-builder
Pod模板,以说明如何将代理镜像与Jenkins Kubernetes插件一起使用。
java-builder
Pod模板采用两个容器:
一个jnlp
容器,它使用OpenShift Container Platform基础代理镜像并处理JNLP合约以启动和停止Jenkins代理。
一个java
容器,它使用java
OpenShift Container Platform示例ImageStream,其中包含各种Java二进制文件,包括用于构建代码的Maven二进制文件mvn
。
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-agent-base-rhel8:<image_tag>
要使用这些镜像,您可以直接从Quay.io或registry.redhat.io访问它们,或者将它们推送到您的OpenShift Container Platform容器镜像注册表中。
每个Jenkins代理容器都可以使用以下环境变量进行配置。
变量 | 定义 | 示例值和设置 |
---|---|---|
|
这些值控制Jenkins JVM的最大堆大小。如果设置了 默认情况下,Jenkins JVM的最大堆大小设置为容器内存限制的50%,无上限。 |
|
|
这些值控制Jenkins JVM的初始堆大小。如果设置了 默认情况下,JVM设置初始堆大小。 |
|
|
如果设置,则指定用于调整内部JVM线程数量的内核数。 |
示例设置: |
|
指定要应用于此容器中运行的所有JVM的选项。不建议覆盖此值。 |
默认值: |
|
指定Jenkins JVM垃圾收集参数。不建议覆盖此值。 |
默认值: |
|
指定 Jenkins JVM 的附加选项。这些选项将附加到所有其他选项(包括上述 Java 选项),如有必要,可用于覆盖任何选项。每个附加选项之间用空格隔开,如果任何选项包含空格字符,则使用反斜杠对其进行转义。 |
示例设置: |
|
指定用于在其容器中运行代理的 Java 版本。容器基础镜像安装了两个版本的 Java: |
默认值为 示例设置: |
所有 Jenkins 代理都使用 JVM 来托管 Jenkins JNLP 代理,以及运行任何 Java 应用程序,例如 javac
、Maven 或 Gradle。
默认情况下,Jenkins JNLP 代理 JVM 使用容器内存限制的 50% 作为其堆大小。此值可以通过 CONTAINER_HEAP_PERCENT
环境变量修改。它也可以限制在上限或完全覆盖。
默认情况下,在 Jenkins 代理容器中运行的任何其他进程(例如从管道运行的 shell 脚本或 oc
命令)都不能使用超过剩余 50% 的内存限制,否则会引发 OOM 终止。
默认情况下,在 Jenkins 代理容器中运行的每个其他 JVM 进程最多使用容器内存限制的 25% 作为其堆大小。对于许多构建工作负载,可能需要调整此限制。
在 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 参数。
Jenkins 代理 Pod 默认在构建完成或停止后删除。此行为可以通过 Kubernetes 插件的 Pod 保留设置来更改。可以为所有 Jenkins 构建设置 Pod 保留,并为每个 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 可能会继续运行并计入资源配额。 |