×

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

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

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

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

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

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

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

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

Jenkins代理镜像

OpenShift Container Platform 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 Container Platform容器镜像注册表中。

Jenkins代理环境变量

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

变量 定义 示例值和设置

JAVA_MAX_HEAP_PARAM, CONTAINER_HEAP_PERCENT, JENKINS_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_PARAM, CONTAINER_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 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_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 可能会继续运行并计入资源配额。