×

Red Hat OpenShift Service on AWS提供一个用作Jenkins代理的基础镜像。

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

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

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

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

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

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

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

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

  • 一个jnlp容器,它使用Red Hat OpenShift Service on AWS基础代理镜像并处理JNLP契约以启动和停止Jenkins代理。

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

Jenkins代理镜像

Red Hat OpenShift Service on AWS 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访问它们,或者将它们推送到您的Red Hat OpenShift Service on AWS容器镜像注册表中。

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命令)在没有引发OOM终止的情况下,不能使用超过剩余50%的内存限制。

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

Jenkins代理Gradle构建

在Red Hat OpenShift Service on AWS上的Jenkins代理中托管Gradle构建会带来额外的复杂性,因为除了Jenkins JNLP代理和Gradle JVM之外,Gradle还会生成第三个JVM来运行测试(如果指定了测试)。

以下设置建议作为在Red Hat OpenShift Service on AWS上内存受限的Jenkins代理中运行Gradle构建的起点。您可以根据需要修改这些设置。

  • 通过将org.gradle.daemon=false添加到gradle.properties文件来确保禁用长期运行的Gradle守护进程。

  • 通过确保org.gradle.parallel=true未在gradle.properties文件中设置且--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 agent pod 保留策略

默认情况下,Jenkins agent pod会在构建完成或停止后被删除。可以通过Kubernetes插件的pod保留设置更改此行为。可以为所有Jenkins构建设置pod保留策略,并为每个pod模板进行覆盖。支持以下行为:

  • Always 保留构建pod,无论构建结果如何。

  • Default 使用插件值,即仅使用pod模板。

  • Never 始终删除pod。

  • On Failure 如果构建失败,则保留pod。

您可以在pipeline Jenkinsfile中覆盖pod保留策略。

podTemplate(label: "mypod",
  cloud: "openshift",
  inheritFrom: "maven",
  podRetention: onFailure(), (1)
  containers: [
    ...
  ]) {
  node("mypod") {
    ...
  }
}
1 podRetention 的允许值是 never()onFailure()always()default()

保留的pod可能会继续运行,并占用资源配额。