$ docker pull registry.redhat.io/ocp-tools-4/jenkins-rhel8:<image_tag>
OpenShift Dedicated 提供一个用作 Jenkins 代理的基础镜像。
Jenkins 代理的基础镜像执行以下操作:
引入必需的工具、无头 Java、Jenkins JNLP 客户端以及有用的工具,包括git
、tar
、zip
和nss
等。
将 JNLP 代理设置为入口点。
包含用于从 Jenkins 作业内部调用命令行操作的oc
客户端工具。
提供 Red Hat Enterprise Linux (RHEL) 和localdev
镜像的 Dockerfile。
使用适合您的 OpenShift Dedicated 版本的代理镜像版本。嵌入与 OpenShift Dedicated 版本不兼容的 |
OpenShift Dedicated Jenkins 镜像还定义了以下示例java-builder
Pod 模板,以说明如何将代理镜像与 Jenkins Kubernetes 插件一起使用。
java-builder
Pod 模板采用两个容器:
一个jnlp
容器,它使用 OpenShift Dedicated 基础代理镜像并处理用于启动和停止 Jenkins 代理的 JNLP 协定。
一个java
容器,它使用java
OpenShift Dedicated 示例 ImageStream,其中包含各种 Java 二进制文件,包括用于构建代码的 Maven 二进制文件mvn
。
OpenShift Dedicated 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 Dedicated 容器镜像注册表中。
每个 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 Dedicated 上的 Jenkins 代理程序中托管 Gradle 构建会带来额外的复杂性,因为除了 Jenkins JNLP 代理程序和 Gradle JVM 之外,Gradle 还会生成第三个 JVM 来运行测试(如果已指定)。
以下设置建议作为在 OpenShift Dedicated 上内存受限的 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 可能会继续运行并占用资源配额。 |