×

OpenShift Dedicated 提供一个用作 Jenkins 代理的基础镜像。

Jenkins 代理的基础镜像执行以下操作:

  • 引入必需的工具、无头 Java、Jenkins JNLP 客户端以及有用的工具,包括gittarzipnss 等。

  • 将 JNLP 代理设置为入口点。

  • 包含用于从 Jenkins 作业内部调用命令行操作的oc 客户端工具。

  • 提供 Red Hat Enterprise Linux (RHEL) 和localdev 镜像的 Dockerfile。

使用适合您的 OpenShift Dedicated 版本的代理镜像版本。嵌入与 OpenShift Dedicated 版本不兼容的oc 客户端版本可能会导致意外行为。

OpenShift Dedicated Jenkins 镜像还定义了以下示例java-builder Pod 模板,以说明如何将代理镜像与 Jenkins Kubernetes 插件一起使用。

java-builder Pod 模板采用两个容器:

  • 一个jnlp 容器,它使用 OpenShift Dedicated 基础代理镜像并处理用于启动和停止 Jenkins 代理的 JNLP 协定。

  • 一个java 容器,它使用java OpenShift Dedicated 示例 ImageStream,其中包含各种 Java 二进制文件,包括用于构建代码的 Maven 二进制文件mvn

Jenkins 代理镜像

OpenShift Dedicated Jenkins 代理镜像可在Quay.ioregistry.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.ioregistry.redhat.io 访问它们,也可以将它们推送到您的 OpenShift Dedicated 容器镜像注册表中。

Jenkins 代理环境变量

每个 Jenkins 代理容器都可以使用以下环境变量进行配置。

变量 定义 示例值和设置

JAVA_MAX_HEAP_PARAMCONTAINER_HEAP_PERCENTJENKINS_MAX_HEAP_UPPER_BOUND_MB

这些值控制 Jenkins JVM 的最大堆大小。如果设置了JAVA_MAX_HEAP_PARAM,则其值优先。否则,最大堆大小将动态计算为容器内存限制的CONTAINER_HEAP_PERCENT,可选地限制在JENKINS_MAX_HEAP_UPPER_BOUND_MB MiB。

默认情况下,Jenkins JVM 的最大堆大小设置为容器内存限制的 50%,且无上限。

JAVA_MAX_HEAP_PARAM 示例设置:-Xmx512m

CONTAINER_HEAP_PERCENT 默认值:0.5 或 50%

JENKINS_MAX_HEAP_UPPER_BOUND_MB 示例设置:512 MiB

JAVA_INITIAL_HEAP_PARAMCONTAINER_INITIAL_PERCENT

这些值控制 Jenkins JVM 的初始堆大小。如果设置了JAVA_INITIAL_HEAP_PARAM,则其值优先。否则,初始堆大小将动态计算为动态计算的最大堆大小的CONTAINER_INITIAL_PERCENT

默认情况下,JVM 设置初始堆大小。

JAVA_INITIAL_HEAP_PARAM 示例设置:-Xms32m

CONTAINER_INITIAL_PERCENT 示例设置:0.1 或 10%

CONTAINER_CORE_LIMIT

如果设置,则指定用于确定内部 JVM 线程数量的内核整数。

示例设置:2

JAVA_TOOL_OPTIONS

指定应用于此容器中运行的所有 JVM 的选项。不建议覆盖此值。

默认值:-XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap -Dsun.zip.disableMemoryMapping=true

JAVA_GC_OPTS

指定 Jenkins JVM 垃圾收集参数。不建议覆盖此值。

默认值:-XX:+UseParallelGC -XX:MinHeapFreeRatio=5 -XX:MaxHeapFreeRatio=10 -XX:GCTimeRatio=4 -XX:AdaptiveSizePolicyWeight=90

JENKINS_JAVA_OVERRIDES

指定 Jenkins JVM 的附加选项。这些选项将附加到所有其他选项(包括上述 Java 选项),如果需要,可用于覆盖任何选项。每个附加选项用空格分隔,如果任何选项包含空格字符,则用反斜杠对其进行转义。

示例设置:-Dfoo -Dbar-Dfoo=first\ value -Dbar=second\ value

USE_JAVA_VERSION

指定在容器中运行代理程序时要使用的 Java 版本。容器基础镜像安装了两个版本的 Java:java-11java-1.8.0。如果扩展容器基础镜像,可以使用其关联的后缀指定任何其他版本的 Java。

默认值为 java-11

示例设置:java-1.8.0

Jenkins 代理内存需求

所有 Jenkins 代理程序都使用 JVM 来托管 Jenkins JNLP 代理程序,以及运行任何 Java 应用程序,例如 javac、Maven 或 Gradle。

默认情况下,Jenkins JNLP 代理程序 JVM 使用容器内存限制的 50% 作为其堆大小。此值可以通过 CONTAINER_HEAP_PERCENT 环境变量修改。它也可以限制在上限或完全覆盖。

默认情况下,在 Jenkins 代理容器中运行的任何其他进程(例如从管道运行的 shell 脚本或 oc 命令)都不能使用超过剩余 50% 的内存限制,否则会引发 OOM 终止。

默认情况下,在 Jenkins 代理容器中运行的每个其他 JVM 进程最多使用容器内存限制的 25% 作为其堆大小。对于许多构建工作负载,可能需要调整此限制。

Jenkins 代理 Gradle 构建

在 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_OPTSJAVA_OPTSJAVA_TOOL_OPTIONS 环境变量覆盖 Gradle JVM 内存参数。

  • 通过在 build.gradle 中定义 maxHeapSizejvmArgs 设置,或通过 -Dorg.gradle.jvmargs 命令行参数,为任何 Gradle 测试 JVM 设置最大堆大小和 JVM 参数。

Jenkins 代理 Pod 保留

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 可能会继续运行并占用资源配额。