$ podman pull registry.redhat.io/ocp-tools-4/jenkins-rhel8:<image_tag>
OpenShift Dedicated提供一个用于运行Jenkins的容器镜像。此镜像提供一个Jenkins服务器实例,可用于设置持续测试、集成和交付的基本流程。
该镜像基于Red Hat通用基础镜像 (UBI)。
OpenShift Dedicated遵循Jenkins的LTS版本。OpenShift Dedicated提供包含Jenkins 2.x的镜像。
OpenShift Dedicated Jenkins镜像可在Quay.io或registry.redhat.io上获取。
例如
$ podman pull registry.redhat.io/ocp-tools-4/jenkins-rhel8:<image_tag>
要使用这些镜像,您可以直接从这些注册表访问它们,或将它们推送到您的OpenShift Dedicated容器镜像注册表中。此外,您可以创建一个指向镜像的镜像流,该镜像位于您的容器镜像注册表或外部位置。然后,您的OpenShift Dedicated资源可以引用该镜像流。
但为了方便起见,OpenShift Dedicated在`openshift`命名空间中提供了核心Jenkins镜像以及为OpenShift Dedicated与Jenkins集成提供的示例Agent镜像的镜像流。
您可以通过两种方式管理Jenkins身份验证
OpenShift Dedicated OAuth身份验证,由OpenShift Dedicated登录插件提供。
Jenkins提供的标准身份验证。
通过在Jenkins UI的**配置全局安全**面板上配置选项,或将Jenkins**部署配置**中的`OPENSHIFT_ENABLE_OAUTH`环境变量设置为`false`以外的任何值来激活OAuth身份验证。这将激活OpenShift Dedicated登录插件,该插件从pod数据中检索配置信息,或通过与OpenShift Dedicated API服务器交互来检索配置信息。
有效凭据由OpenShift Dedicated身份提供商控制。
Jenkins支持浏览器和非浏览器访问。
有效的用户会在登录时自动添加到Jenkins授权矩阵中,其中OpenShift Dedicated角色决定用户拥有的特定Jenkins权限。默认使用的角色是预定义的`admin`、`edit`和`view`。登录插件针对Jenkins运行所在项目或命名空间中的这些角色执行自我SAR请求。
具有`admin`角色的用户拥有传统的Jenkins管理员用户权限。具有`edit`或`view`角色的用户权限逐渐减少。
默认的OpenShift Dedicated `admin`、`edit`和`view`角色以及在Jenkins实例中分配给这些角色的Jenkins权限是可配置的。
在OpenShift Dedicated pod中运行Jenkins时,登录插件会在Jenkins运行的命名空间中查找名为`openshift-jenkins-login-plugin-config`的配置映射。
如果此插件找到并可以读取该配置映射,则可以定义角色与Jenkins权限的映射。具体来说:
登录插件将配置映射中的键值对视为Jenkins权限到OpenShift Dedicated角色的映射。
键是Jenkins权限组短ID和Jenkins权限短ID,两者用连字符分隔。
如果要将`Overall Jenkins Administer`权限添加到OpenShift Dedicated角色,则键应为`Overall-Administer`。
要了解哪些权限组和权限ID可用,请转到Jenkins控制台中的矩阵授权页面,并在其提供的表格中查找组和各个权限的ID。
键值对的值是应应用权限的OpenShift Dedicated角色列表,每个角色用逗号分隔。
如果要将`Overall Jenkins Administer`权限同时添加到默认的`admin`和`edit`角色以及您创建的新Jenkins角色,则键`Overall-Administer`的值将为`admin,edit,jenkins`。
使用OpenShift Dedicated OAuth时,预先填充在OpenShift Dedicated Jenkins镜像中的具有管理员权限的`admin`用户不会获得这些权限。要授予这些权限,OpenShift Dedicated集群管理员必须在OpenShift Dedicated身份提供程序中显式定义该用户,并将`admin`角色分配给该用户。 |
在用户最初建立后,可以更改存储的Jenkins用户权限。OpenShift Dedicated登录插件会轮询OpenShift Dedicated API服务器以获取权限,并使用从OpenShift Dedicated检索到的权限更新Jenkins中为每个用户存储的权限。如果使用Jenkins UI更新Jenkins用户的权限,则下次插件轮询OpenShift Dedicated时,权限更改将被覆盖。
您可以使用`OPENSHIFT_PERMISSIONS_POLL_INTERVAL`环境变量来控制轮询的频率。默认轮询间隔为五分钟。
使用OAuth身份验证创建新Jenkins服务的最简单方法是使用模板。
Jenkins服务器可以使用以下环境变量进行配置
变量 | 定义 | 示例值和设置 |
---|---|---|
|
确定登录Jenkins时OpenShift Dedicated登录插件是否管理身份验证。要启用,请设置为`true`。 |
默认值:`false` |
|
使用标准Jenkins身份验证时`admin`用户的密码。当`OPENSHIFT_ENABLE_OAUTH`设置为`true`时不适用。 |
默认值:`password` |
`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% |
|
如果设置,则指定用于确定内部JVM线程数量的内核数量。 |
示例设置:`2` |
|
指定要应用于此容器中运行的所有JVM的选项。不建议覆盖此值。 |
默认值:`-XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap -Dsun.zip.disableMemoryMapping=true` |
|
指定Jenkins JVM垃圾回收参数。不建议覆盖此值。 |
默认值:`-XX:+UseParallelGC -XX:MinHeapFreeRatio=5 -XX:MaxHeapFreeRatio=10 -XX:GCTimeRatio=4 -XX:AdaptiveSizePolicyWeight=90` |
|
指定Jenkins JVM的其他选项。这些选项将附加到所有其他选项(包括上面的Java选项),如果需要,可以用来覆盖任何选项。用空格分隔每个附加选项;如果任何选项包含空格字符,请使用反斜杠对其进行转义。 |
示例设置:`-Dfoo -Dbar`;`-Dfoo=first\ value -Dbar=second\ value`。 |
|
指定Jenkins的参数。 |
|
|
指定在容器首次运行或将`OVERRIDE_PV_PLUGINS_WITH_IMAGE_PLUGINS`设置为`true`时要安装的其他Jenkins插件。插件指定为名称:版本对的逗号分隔列表。 |
示例设置:`git:3.7.0,subversion:2.10.2`。 |
|
指定 OpenShift Dedicated 登录插件轮询 OpenShift Dedicated 的时间间隔(毫秒),以获取 Jenkins 中定义的每个用户的关联权限。 |
默认值: |
|
使用 OpenShift Dedicated 持久卷 (PV) 作为 Jenkins 配置目录运行此镜像时,仅在镜像首次启动时(因为 PV 是在创建持久卷声明 (PVC) 时分配的)才执行从镜像到 PV 的配置传输。如果您创建扩展此镜像的自定义镜像并在初始启动后更新自定义镜像中的配置,则除非您将此环境变量设置为 |
默认值:`false` |
|
使用 OpenShift Dedicated PV 作为 Jenkins 配置目录运行此镜像时,仅在镜像首次启动时(因为 PV 是在创建 PVC 时分配的)才执行从镜像到 PV 的插件传输。如果您创建扩展此镜像的自定义镜像并在初始启动后更新自定义镜像中的插件,则除非您将此环境变量设置为 |
默认值:`false` |
|
使用 OpenShift Dedicated PVC 作为 Jenkins 配置目录运行此镜像时,此环境变量允许在发生致命错误时保留致命错误日志文件。致命错误文件保存在 |
默认值:`false` |
|
设置此值将覆盖此镜像提供的示例 Kubernetes 插件 Pod 模板中用于 |
默认值: |
|
设置此值将覆盖此镜像提供的 |
默认值: |
|
设置此值控制 JVM 在 FIPS 节点上运行时的操作方式。更多信息,请参见 在 FIPS 模式下配置 Red Hat OpenJDK 11 版本。 |
默认值: |
如果您要在项目之外运行 Jenkins,则必须向 Jenkins 提供访问令牌才能访问您的项目。
通过输入以下命令来确定具有访问 Jenkins 必须访问的项目所需权限的服务帐户的密钥:
$ oc describe serviceaccount jenkins
Name: default
Labels: <none>
Secrets: { jenkins-token-uyswp }
{ jenkins-dockercfg-xcr3d }
Tokens: jenkins-token-izv1u
jenkins-token-uyswp
在本例中,密钥名为 jenkins-token-uyswp
。
通过输入以下命令来检索密钥中的令牌:
$ oc describe secret <secret name from above>
Name: jenkins-token-uyswp
Labels: <none>
Annotations: kubernetes.io/service-account.name=jenkins,kubernetes.io/service-account.uid=32f5b661-2a8f-11e5-9528-3c970e3bf0b7
Type: kubernetes.io/service-account-token
Data
====
ca.crt: 1066 bytes
token: eyJhbGc..<content cut>....wRA
token 参数包含 Jenkins 访问项目所需的令牌值。
要自定义官方 OpenShift Dedicated Jenkins 镜像,您可以将该镜像用作 source-to-image (S2I) 构建器。
您可以使用 S2I 来复制自定义 Jenkins 作业定义,添加其他插件,或将提供的 config.xml
文件替换为您自己的自定义配置。
要在 Jenkins 镜像中包含您的修改,您必须拥有具有以下目录结构的 Git 仓库:
plugins
此目录包含您要复制到 Jenkins 的二进制 Jenkins 插件。
plugins.txt
此文件列出了您要使用以下语法安装的插件:
pluginId:pluginVersion
configuration/jobs
此目录包含 Jenkins 作业定义。
configuration/config.xml
此文件包含您的自定义 Jenkins 配置。
configuration/
目录的内容将复制到 /var/lib/jenkins/
目录,因此您也可以在那里包含其他文件,例如 credentials.xml
。
apiVersion: build.openshift.io/v1
kind: BuildConfig
metadata:
name: custom-jenkins-build
spec:
source: (1)
git:
uri: https://github.com/custom/repository
type: Git
strategy: (2)
sourceStrategy:
from:
kind: ImageStreamTag
name: jenkins:2
namespace: openshift
type: Source
output: (3)
to:
kind: ImageStreamTag
name: custom-jenkins:latest
1 | source 参数定义具有上述布局的源 Git 仓库。 |
2 | strategy 参数定义用作构建源镜像的原始 Jenkins 镜像。 |
3 | output 参数定义生成的自定义 Jenkins 镜像,您可以在部署配置中使用它来代替官方 Jenkins 镜像。 |
OpenShift Jenkins 镜像预安装了 Jenkins 的 Kubernetes 插件,以便可以使用 Kubernetes 和 OpenShift Dedicated 在多个容器主机上动态配置 Jenkins 代理。
为了使用 Kubernetes 插件,OpenShift Dedicated 提供了一个适合用作 Jenkins 代理的 OpenShift Agent Base 镜像。
OpenShift Dedicated 4.11 将 OpenShift Jenkins 和 OpenShift Agent Base 镜像移动到 OpenShift Dedicated 4.11 有效负载中已删除 OpenShift Jenkins Maven 和 NodeJS Agent 镜像。Red Hat 不再生成这些镜像,并且它们也无法从 更多信息,请参见以下“其他资源”部分中的“OpenShift Jenkins 镜像的重要更改”链接。 |
Maven 和 Node.js 代理镜像在 OpenShift Dedicated Jenkins 镜像配置中作为 Kubernetes Pod 模板镜像自动配置,用于 Kubernetes 插件。该配置包含您可以应用于其“限制此项目可在何处运行”设置下的任何 Jenkins 作业的每个镜像的标签。如果应用了该标签,则作业将在运行相应代理镜像的 OpenShift Dedicated Pod 下运行。
在 OpenShift Dedicated 4.10 及更高版本中,使用 Kubernetes 插件运行 Jenkins 代理的推荐模式是使用同时包含 |
Jenkins镜像还提供Kubernetes插件的附加agent镜像的自动发现和自动配置功能。
使用OpenShift Dedicated同步插件,在Jenkins启动时,Jenkins镜像会在其运行的项目中,或插件配置中列出的项目中搜索以下项目:
role
标签设置为jenkins-agent
的镜像流。
role
注解设置为jenkins-agent
的镜像流标签。
role
标签设置为jenkins-agent
的配置映射。
当Jenkins镜像找到具有相应标签的镜像流,或具有相应注解的镜像流标签时,它会生成相应的Kubernetes插件配置。这样,您可以将Jenkins作业分配到运行由镜像流提供的容器镜像的Pod中。
镜像流或镜像流标签的名称和镜像引用会映射到Kubernetes插件Pod模板中的名称和镜像字段。您可以通过在镜像流或镜像流标签对象上设置键为agent-label
的注解来控制Kubernetes插件Pod模板的标签字段。否则,将使用名称作为标签。
请勿登录Jenkins控制台并更改Pod模板配置。如果您在创建Pod模板后这样做,并且OpenShift Dedicated同步插件检测到与镜像流或镜像流标签关联的镜像已更改,它将替换Pod模板并覆盖这些配置更改。您无法将新配置与现有配置合并。 如果您有更复杂的配置需求,请考虑使用配置映射方法。 |
当它找到具有相应标签的配置映射时,Jenkins镜像会假设配置映射的键值数据有效负载中的任何值都包含与Jenkins和Kubernetes插件Pod模板的配置格式一致的可扩展标记语言(XML)。与镜像流和镜像流标签相比,配置映射的一个主要优点是您可以控制所有Kubernetes插件Pod模板参数。
jenkins-agent
的示例配置映射kind: ConfigMap
apiVersion: v1
metadata:
name: jenkins-agent
labels:
role: jenkins-agent
data:
template1: |-
<org.csanchez.jenkins.plugins.kubernetes.PodTemplate>
<inheritFrom></inheritFrom>
<name>template1</name>
<instanceCap>2147483647</instanceCap>
<idleMinutes>0</idleMinutes>
<label>template1</label>
<serviceAccount>jenkins</serviceAccount>
<nodeSelector></nodeSelector>
<volumes/>
<containers>
<org.csanchez.jenkins.plugins.kubernetes.ContainerTemplate>
<name>jnlp</name>
<image>openshift/jenkins-agent-maven-35-centos7:v3.10</image>
<privileged>false</privileged>
<alwaysPullImage>true</alwaysPullImage>
<workingDir>/tmp</workingDir>
<command></command>
<args>${computer.jnlpmac} ${computer.name}</args>
<ttyEnabled>false</ttyEnabled>
<resourceRequestCpu></resourceRequestCpu>
<resourceRequestMemory></resourceRequestMemory>
<resourceLimitCpu></resourceLimitCpu>
<resourceLimitMemory></resourceLimitMemory>
<envVars/>
</org.csanchez.jenkins.plugins.kubernetes.ContainerTemplate>
</containers>
<envVars/>
<annotations/>
<imagePullSecrets/>
<nodeProperties/>
</org.csanchez.jenkins.plugins.kubernetes.PodTemplate>
以下示例显示了两个引用openshift
命名空间中镜像流的容器。一个容器处理用于启动Pod作为Jenkins Agent的JNLP协定。另一个容器使用具有用于构建特定编程语言代码的工具的镜像。
kind: ConfigMap
apiVersion: v1
metadata:
name: jenkins-agent
labels:
role: jenkins-agent
data:
template2: |-
<org.csanchez.jenkins.plugins.kubernetes.PodTemplate>
<inheritFrom></inheritFrom>
<name>template2</name>
<instanceCap>2147483647</instanceCap>
<idleMinutes>0</idleMinutes>
<label>template2</label>
<serviceAccount>jenkins</serviceAccount>
<nodeSelector></nodeSelector>
<volumes/>
<containers>
<org.csanchez.jenkins.plugins.kubernetes.ContainerTemplate>
<name>jnlp</name>
<image>image-registry.openshift-image-registry.svc:5000/openshift/jenkins-agent-base-rhel8:latest</image>
<privileged>false</privileged>
<alwaysPullImage>true</alwaysPullImage>
<workingDir>/home/jenkins/agent</workingDir>
<command></command>
<args>\$(JENKINS_SECRET) \$(JENKINS_NAME)</args>
<ttyEnabled>false</ttyEnabled>
<resourceRequestCpu></resourceRequestCpu>
<resourceRequestMemory></resourceRequestMemory>
<resourceLimitCpu></resourceLimitCpu>
<resourceLimitMemory></resourceLimitMemory>
<envVars/>
</org.csanchez.jenkins.plugins.kubernetes.ContainerTemplate>
<org.csanchez.jenkins.plugins.kubernetes.ContainerTemplate>
<name>java</name>
<image>image-registry.openshift-image-registry.svc:5000/openshift/java:latest</image>
<privileged>false</privileged>
<alwaysPullImage>true</alwaysPullImage>
<workingDir>/home/jenkins/agent</workingDir>
<command>cat</command>
<args></args>
<ttyEnabled>true</ttyEnabled>
<resourceRequestCpu></resourceRequestCpu>
<resourceRequestMemory></resourceRequestMemory>
<resourceLimitCpu></resourceLimitCpu>
<resourceLimitMemory></resourceLimitMemory>
<envVars/>
</org.csanchez.jenkins.plugins.kubernetes.ContainerTemplate>
</containers>
<envVars/>
<annotations/>
<imagePullSecrets/>
<nodeProperties/>
</org.csanchez.jenkins.plugins.kubernetes.PodTemplate>
请勿登录Jenkins控制台并更改Pod模板配置。如果您在创建Pod模板后这样做,并且OpenShift Dedicated同步插件检测到与镜像流或镜像流标签关联的镜像已更改,它将替换Pod模板并覆盖这些配置更改。您无法将新配置与现有配置合并。 如果您有更复杂的配置需求,请考虑使用配置映射方法。 |
安装后,OpenShift Dedicated同步插件会监控OpenShift Dedicated的API服务器以获取镜像流、镜像流标签和配置映射的更新,并调整Kubernetes插件的配置。
适用以下规则:
从配置映射、镜像流或镜像流标签中删除标签或注解会删除Kubernetes插件配置中任何现有的PodTemplate
。
如果删除这些对象,则相应的配置将从Kubernetes插件中删除。
如果您创建了带有相应标签或注解的ConfigMap
、ImageStream
或ImageStreamTag
对象,或在初始创建后添加了标签,则会导致在Kubernetes插件配置中创建PodTemplate
。
对于通过配置映射创建的PodTemplate
,对PodTemplate
的配置映射数据的更改将应用于Kubernetes插件配置中的PodTemplate
设置。这些更改还会覆盖在更改配置映射期间通过Jenkins UI对PodTemplate
进行的任何更改。
要将容器镜像用作Jenkins agent,镜像必须运行agent作为入口点。有关更多详细信息,请参阅官方Jenkins文档。
如果在配置映射中,Pod模板XML的<serviceAccount>
元素是用于生成的Pod的OpenShift Dedicated服务帐户,则服务帐户凭据将被挂载到Pod中。权限与服务帐户相关联,并控制允许从Pod对OpenShift Dedicated主机的哪些操作。
考虑以下使用服务帐户的场景,该服务帐户用于由在OpenShift Dedicated Jenkins镜像中运行的Kubernetes插件启动的Pod。
如果您使用OpenShift Dedicated提供的Jenkins示例模板,则jenkins
服务帐户将为Jenkins运行的项目定义edit
角色,并且主Jenkins Pod已挂载该服务帐户。
注入到Jenkins配置中的两个默认Maven和NodeJS Pod模板也设置为使用与Jenkins主服务器相同的服务帐户。
由于其镜像流或镜像流标签具有所需的标签或注解,因此OpenShift Dedicated同步插件自动发现的任何Pod模板都配置为使用Jenkins主服务帐户作为其服务帐户。
对于您可以将Pod模板定义提供给Jenkins和Kubernetes插件的其他方法,您必须显式指定要使用的服务帐户。这些其他方法包括Jenkins控制台、Kubernetes插件提供的podTemplate
管道DSL或标记其数据是Pod模板XML配置的配置映射。
如果您未为服务帐户指定值,则将使用default
服务帐户。
确保使用的任何服务帐户都具有在OpenShift Dedicated中定义的必要权限、角色等,以便操作您选择在Pod内操作的任何项目。
模板提供参数字段以使用预定义的默认值定义所有环境变量。OpenShift Dedicated提供模板,使创建新的Jenkins服务变得容易。Jenkins模板应在集群管理员在初始集群设置期间在默认的openshift
项目中注册。
两个可用的模板都定义了部署配置和服务。这些模板在其存储策略方面有所不同,这会影响Jenkins内容在Pod重新启动后是否持久存在。
当Pod移动到另一个节点或部署配置的更新触发重新部署时,Pod可能会重新启动。 |
jenkins-ephemeral
使用临时存储。Pod重新启动后,所有数据都会丢失。此模板仅适用于开发或测试。
jenkins-persistent
使用持久卷(PV)存储。数据会在Pod重新启动后保留。
要使用PV存储,集群管理员必须在OpenShift Dedicated部署中定义PV池。
选择所需模板后,必须实例化模板才能使用Jenkins。
使用以下方法之一创建新的Jenkins应用程序:
持久卷(PV)
$ oc new-app jenkins-persistent
或者使用emptyDir
类型的卷,在这种情况下,配置不会在 Pod 重启后持久化。
$ oc new-app jenkins-ephemeral
对于这两个模板,您都可以运行oc describe
命令查看所有可覆盖的参数。
例如
$ oc describe jenkins-ephemeral
在以下示例中,openshift-jee-sample
BuildConfig
对象会动态配置一个 Jenkins Maven agent Pod。该 Pod 会克隆一些 Java 源代码,构建一个 WAR 文件,并运行第二个BuildConfig
,即openshift-jee-sample-docker
。第二个BuildConfig
将新的 WAR 文件添加到容器镜像中。
OpenShift Dedicated 4.11 已将其负载中的 OpenShift Jenkins Maven 和 NodeJS Agent 镜像移除。Red Hat 不再生成这些镜像,并且它们在 更多信息,请参见以下“其他资源”部分中的“OpenShift Jenkins 镜像的重要更改”链接。 |
BuildConfig
kind: List
apiVersion: v1
items:
- kind: ImageStream
apiVersion: image.openshift.io/v1
metadata:
name: openshift-jee-sample
- kind: BuildConfig
apiVersion: build.openshift.io/v1
metadata:
name: openshift-jee-sample-docker
spec:
strategy:
type: Docker
source:
type: Docker
dockerfile: |-
FROM openshift/wildfly-101-centos7:latest
COPY ROOT.war /wildfly/standalone/deployments/ROOT.war
CMD $STI_SCRIPTS_PATH/run
binary:
asFile: ROOT.war
output:
to:
kind: ImageStreamTag
name: openshift-jee-sample:latest
- kind: BuildConfig
apiVersion: build.openshift.io/v1
metadata:
name: openshift-jee-sample
spec:
strategy:
type: JenkinsPipeline
jenkinsPipelineStrategy:
jenkinsfile: |-
node("maven") {
sh "git clone https://github.com/openshift/openshift-jee-sample.git ."
sh "mvn -B -Popenshift package"
sh "oc start-build -F openshift-jee-sample-docker --from-file=target/ROOT.war"
}
triggers:
- type: ConfigChange
也可以覆盖动态创建的 Jenkins agent Pod 的规范。以下是前面示例的修改版本,它覆盖了容器内存并指定了一个环境变量。
BuildConfig
,指定内存限制和环境变量kind: BuildConfig
apiVersion: build.openshift.io/v1
metadata:
name: openshift-jee-sample
spec:
strategy:
type: JenkinsPipeline
jenkinsPipelineStrategy:
jenkinsfile: |-
podTemplate(label: "mypod", (1)
cloud: "openshift", (2)
inheritFrom: "maven", (3)
containers: [
containerTemplate(name: "jnlp", (4)
image: "openshift/jenkins-agent-maven-35-centos7:v3.10", (5)
resourceRequestMemory: "512Mi", (6)
resourceLimitMemory: "512Mi", (7)
envVars: [
envVar(key: "CONTAINER_HEAP_PERCENT", value: "0.25") (8)
])
]) {
node("mypod") { (9)
sh "git clone https://github.com/openshift/openshift-jee-sample.git ."
sh "mvn -B -Popenshift package"
sh "oc start-build -F openshift-jee-sample-docker --from-file=target/ROOT.war"
}
}
triggers:
- type: ConfigChange
1 | 动态定义了一个名为mypod 的新 Pod 模板。节点段中引用了新的 Pod 模板名称。 |
2 | cloud 值必须设置为openshift 。 |
3 | 新的 Pod 模板可以继承其配置自现有的 Pod 模板。在本例中,继承自 OpenShift Dedicated 预定义的 Maven Pod 模板。 |
4 | 此示例覆盖了预先存在的容器中的值,并且必须按名称指定。OpenShift Dedicated 附带的所有 Jenkins agent 镜像都使用容器名称jnlp 。 |
5 | 再次指定容器镜像名称。这是一个已知问题。 |
6 | 指定了512 Mi 的内存请求。 |
7 | 指定了512 Mi 的内存限制。 |
8 | 指定了一个环境变量CONTAINER_HEAP_PERCENT ,其值为0.25 。 |
9 | 节点段引用了已定义的 Pod 模板的名称。 |
默认情况下,构建完成后会删除 Pod。可以使用插件或在 pipeline Jenkinsfile 中修改此行为。
上游 Jenkins 最近引入了 YAML 声明性格式,用于在 pipeline 中内联定义podTemplate
pipeline DSL。以下示例使用在 OpenShift Dedicated Jenkins 镜像中定义的示例java-builder
Pod 模板。
def nodeLabel = 'java-buidler'
pipeline {
agent {
kubernetes {
cloud 'openshift'
label nodeLabel
yaml """
apiVersion: v1
kind: Pod
metadata:
labels:
worker: ${nodeLabel}
spec:
containers:
- name: jnlp
image: image-registry.openshift-image-registry.svc:5000/openshift/jenkins-agent-base-rhel8:latest
args: ['\$(JENKINS_SECRET)', '\$(JENKINS_NAME)']
- name: java
image: image-registry.openshift-image-registry.svc:5000/openshift/java:latest
command:
- cat
tty: true
"""
}
}
options {
timeout(time: 20, unit: 'MINUTES')
}
stages {
stage('Build App') {
steps {
container("java") {
sh "mvn --version"
}
}
}
}
}
通过提供的 Jenkins Ephemeral 或 Jenkins Persistent 模板部署时,默认内存限制为1 Gi
。
默认情况下,在 Jenkins 容器中运行的所有其他进程总共不能使用超过512 MiB
的内存。如果它们需要更多内存,则容器将停止运行。因此,强烈建议尽可能在 agent 容器中运行 pipeline 的外部命令。
如果Project
配额允许,请参阅 Jenkins 文档中关于 Jenkins master 从内存角度应该具备什么的建议。这些建议规定为 Jenkins master 分配更多内存。
建议为 Jenkins Kubernetes 插件创建的 agent 容器指定内存请求和限制值。管理员用户可以通过 Jenkins 配置为每个 agent 镜像设置默认值。内存请求和限制参数也可以在每个容器的基础上进行覆盖。
您可以通过在实例化 Jenkins Ephemeral 或 Jenkins Persistent 模板时覆盖MEMORY_LIMIT
参数来增加 Jenkins 可用的内存量。