×

Red Hat OpenShift Service on AWS 提供一个用于运行 Jenkins 的容器镜像。此镜像提供一个 Jenkins 服务器实例,可用于设置持续测试、集成和交付的基本流程。

此镜像基于 Red Hat 通用基础镜像 (UBI)。

Red Hat OpenShift Service on AWS 遵循 Jenkins 的 LTS 版本。Red Hat OpenShift Service on AWS 提供包含 Jenkins 2.x 的镜像。

Red Hat OpenShift Service on AWS Jenkins 镜像可在 Quay.ioregistry.redhat.io 获取。

例如

$ podman pull registry.redhat.io/ocp-tools-4/jenkins-rhel8:<image_tag>

要使用这些镜像,您可以直接从这些注册表访问它们,也可以将它们推送到您的 Red Hat OpenShift Service on AWS 容器镜像注册表中。此外,您可以创建一个指向镜像的镜像流,该镜像位于您的容器镜像注册表或外部位置。然后,您的 Red Hat OpenShift Service on AWS 资源可以引用该镜像流。

但为了方便起见,Red Hat OpenShift Service on AWS 在 `openshift` 命名空间中提供了核心 Jenkins 镜像以及为 Red Hat OpenShift Service on AWS 与 Jenkins 集成提供的示例 Agent 镜像的镜像流。

配置和定制

您可以通过两种方式管理 Jenkins 身份验证

  • Red Hat OpenShift Service on AWS OAuth 身份验证,由 Red Hat OpenShift Service on AWS 登录插件提供。

  • Jenkins 提供的标准身份验证。

Red Hat OpenShift Service on AWS OAuth 身份验证

通过在 Jenkins UI 的“配置全局安全”面板上配置选项,或将 Jenkins **部署配置** 中的 `OPENSHIFT_ENABLE_OAUTH` 环境变量设置为 `false` 以外的任何值来激活 OAuth 身份验证。这将激活 Red Hat OpenShift Service on AWS 登录插件,该插件从 Pod 数据中检索配置信息,或通过与 Red Hat OpenShift Service on AWS API 服务器交互来检索配置信息。

有效的凭据由 Red Hat OpenShift Service on AWS 身份提供者控制。

Jenkins 支持浏览器和非浏览器访问。

有效的用户会在登录时自动添加到 Jenkins 授权矩阵中,其中 Red Hat OpenShift Service on AWS 角色决定用户拥有的特定 Jenkins 权限。默认使用的角色是预定义的 `admin`、`edit` 和 `view`。登录插件针对 Jenkins 运行所在的项目或命名空间中的这些角色执行自我 SAR 请求。

具有 `admin` 角色的用户具有传统的 Jenkins 管理员用户权限。具有 `edit` 或 `view` 角色的用户权限逐渐减少。

默认的 Red Hat OpenShift Service on AWS `admin`、`edit` 和 `view` 角色以及这些角色在 Jenkins 实例中被赋予的 Jenkins 权限是可配置的。

在 Red Hat OpenShift Service on AWS Pod 中运行 Jenkins 时,登录插件会在 Jenkins 运行的命名空间中查找名为 `openshift-jenkins-login-plugin-config` 的配置映射。

如果此插件找到并可以读取该配置映射,则可以定义角色与 Jenkins 权限的映射。具体来说:

  • 登录插件将配置映射中的键值对视为 Jenkins 权限到 Red Hat OpenShift Service on AWS 角色的映射。

  • 键是 Jenkins 权限组短 ID 和 Jenkins 权限短 ID,两者用连字符分隔。

  • 如果要将 `Overall Jenkins Administer` 权限添加到 Red Hat OpenShift Service on AWS 角色,则键应为 `Overall-Administer`。

  • 要了解哪些权限组和权限 ID 可用,请转到 Jenkins 控制台中的矩阵授权页面,以及他们提供的表中组和单个权限的 ID。

  • 键值对的值是应应用权限的 Red Hat OpenShift Service on AWS 角色列表,每个角色用逗号分隔。

  • 如果要将 `Overall Jenkins Administer` 权限同时添加到默认的 `admin` 和 `edit` 角色以及您创建的新 Jenkins 角色,则键 `Overall-Administer` 的值将为 `admin,edit,jenkins`。

使用 Red Hat OpenShift Service on AWS OAuth 时,Red Hat OpenShift Service on AWS Jenkins 镜像中预先填充的具有管理权限的 `admin` 用户不会获得这些权限。要授予这些权限,Red Hat OpenShift Service on AWS 集群管理员必须在 Red Hat OpenShift Service on AWS 身份提供者中显式定义该用户,并将 `admin` 角色分配给该用户。

Jenkins用户的权限存储信息可以在用户初始创建后进行修改。AWS上的Red Hat OpenShift Service登录插件会轮询AWS上的Red Hat OpenShift Service API服务器以获取权限,并使用从AWS上的Red Hat OpenShift Service检索到的权限更新Jenkins中每个用户的权限存储信息。如果使用Jenkins UI更新Jenkins用户的权限,则这些权限更改将在插件下次轮询AWS上的Red Hat OpenShift Service时被覆盖。

您可以使用OPENSHIFT_PERMISSIONS_POLL_INTERVAL环境变量来控制轮询的频率。默认轮询间隔为五分钟。

使用OAuth身份验证创建新的Jenkins服务最简单的方法是使用模板。

Jenkins身份验证

如果直接运行镜像(不使用模板),则默认情况下使用Jenkins身份验证。

Jenkins首次启动时,将创建配置以及管理员用户和密码。默认用户凭据为adminpassword。仅当且仅当使用标准Jenkins身份验证时,请通过设置JENKINS_PASSWORD环境变量来配置默认密码。

步骤
  • 通过输入以下命令创建使用标准Jenkins身份验证的Jenkins应用程序:

    $ oc new-app -e \
        JENKINS_PASSWORD=<password> \
        ocp-tools-4/jenkins-rhel8

Jenkins环境变量

Jenkins服务器可以使用以下环境变量进行配置:

变量 定义 示例值和设置

OPENSHIFT_ENABLE_OAUTH

确定AWS上的Red Hat OpenShift Service登录插件在登录Jenkins时是否管理身份验证。要启用,请设置为true

默认值:false

JENKINS_PASSWORD

使用标准Jenkins身份验证时,admin用户的密码。当OPENSHIFT_ENABLE_OAUTH设置为true时,此变量不适用。

默认值:password

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线程数量的CPU核心数。

示例设置: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

JENKINS_OPTS

指定Jenkins的参数。

INSTALL_PLUGINS

指定在容器首次运行或OVERRIDE_PV_PLUGINS_WITH_IMAGE_PLUGINS设置为true时要安装的其他Jenkins插件。插件指定为名称:版本对的逗号分隔列表。

示例设置:git:3.7.0,subversion:2.10.2

OPENSHIFT_PERMISSIONS_POLL_INTERVAL

指定AWS上的Red Hat OpenShift Service登录插件轮询AWS上的Red Hat OpenShift Service以获取与Jenkins中定义的每个用户关联的权限的间隔(毫秒)。

默认值:300000 - 5分钟

OVERRIDE_PV_CONFIG_WITH_IMAGE_CONFIG

当使用AWS上的Red Hat OpenShift Service持久卷 (PV) 运行此镜像来存储Jenkins配置目录时,只有在镜像首次启动时(因为在创建持久卷声明 (PVC) 时分配了PV)才会执行从镜像到PV的配置传输。如果您创建了一个扩展此镜像并更新了自定义镜像中配置的自定义镜像,除非您将此环境变量设置为true,否则配置不会被复制。

默认值:false

OVERRIDE_PV_PLUGINS_WITH_IMAGE_PLUGINS

当使用AWS上的Red Hat OpenShift Service持久卷 (PV) 运行此镜像来存储Jenkins配置目录时,只有在镜像首次启动时(因为在创建持久卷声明 (PVC) 时分配了PV)才会执行从镜像到PV的插件传输。如果您创建了一个扩展此镜像并在初始启动后更新了自定义镜像中插件的自定义镜像,除非您将此环境变量设置为true,否则插件不会被复制。

默认值:false

ENABLE_FATAL_ERROR_LOG_FILE

当使用AWS上的Red Hat OpenShift Service PVC 运行此镜像来存储Jenkins配置目录时,此环境变量允许在发生严重错误时保留严重错误日志文件。严重错误文件保存在/var/lib/jenkins/logs

默认值:false

AGENT_BASE_IMAGE

设置此值将覆盖此镜像提供的示例Kubernetes插件pod模板中用于jnlp容器的镜像。否则,将使用openshift命名空间中jenkins-agent-base-rhel8:latest镜像流标签中的镜像。

默认值:image-registry.openshift-image-registry.svc:5000/openshift/jenkins-agent-base-rhel8:latest

JAVA_BUILDER_IMAGE

设置此值将覆盖此镜像提供的java-builder示例Kubernetes插件pod模板中用于java-builder容器的镜像。否则,将使用openshift命名空间中java:latest镜像流标签中的镜像。

默认值:image-registry.openshift-image-registry.svc:5000/openshift/java:latest

JAVA_FIPS_OPTIONS

设置此值可以控制JVM在FIPS节点上运行时的操作方式。更多信息,请参见在FIPS模式下配置Red Hat OpenJDK 11版本

默认值:-Dcom.redhat.fips=false

提供Jenkins跨项目访问

如果您要在项目之外运行Jenkins,则必须向Jenkins提供访问令牌以访问您的项目。

步骤
  1. 通过输入以下命令,找到具有访问 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

  2. 通过输入以下命令检索密钥中的令牌。

    $ 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 访问项目所需的令牌值。

Jenkins 卷挂载点

Jenkins 镜像可以与挂载的卷一起运行,以启用配置的持久存储。

  • /var/lib/jenkins 是 Jenkins 存储配置文件(包括作业定义)的数据目录。

通过 Source-to-Image 自定义 Jenkins 镜像

要自定义 AWS 上的 Red Hat OpenShift 服务的官方 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

自定义 AWS 上 Red Hat OpenShift 服务中 Jenkins 镜像的示例构建配置
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 镜像。

配置 Jenkins Kubernetes 插件

OpenShift Jenkins 镜像包含预安装的Jenkins Kubernetes 插件,以便可以使用 Kubernetes 和 AWS 上的 Red Hat OpenShift 服务在多个容器主机上动态配置 Jenkins 代理。

要使用 Kubernetes 插件,AWS 上的 Red Hat OpenShift 服务提供了一个 OpenShift 代理基础镜像,适合用作 Jenkins 代理。

AWS 上的 Red Hat OpenShift 服务 4.11 将 OpenShift Jenkins 和 OpenShift 代理基础镜像移至registry.redhat.io上的ocp-tools-4存储库,以便 Red Hat 可以在 AWS 上的 Red Hat OpenShift 服务生命周期之外生成和更新这些镜像。以前,这些镜像位于 AWS 上的 Red Hat OpenShift 服务安装有效负载和registry.redhat.io上的openshift4存储库中。

OpenShift Jenkins Maven 和 NodeJS 代理镜像已从 AWS 上的 Red Hat OpenShift 服务 4.11 有效负载中移除。Red Hat 不再生成这些镜像,并且它们无法从registry.redhat.io上的ocp-tools-4存储库获得。Red Hat 维护这些镜像的 4.10 和更早版本,以修复任何重大错误或安全 CVE,遵循AWS 上 Red Hat OpenShift 服务生命周期策略

有关更多信息,请参阅以下“其他资源”部分中的“OpenShift Jenkins 镜像的重要更改”链接。

Maven 和 Node.js 代理镜像在 AWS 上的 Red Hat OpenShift 服务 Jenkins 镜像配置中,作为 Kubernetes 插件内的 Kubernetes pod 模板镜像自动配置。该配置包含您可以应用于其“限制此项目可在何处运行”设置下的任何 Jenkins 作业的每个镜像的标签。如果应用了标签,则作业将在运行相应代理镜像的 AWS 上的 Red Hat OpenShift 服务 pod 下运行。

在 AWS 上的 Red Hat OpenShift 服务 4.10 及更高版本中,使用 Kubernetes 插件运行 Jenkins 代理的推荐模式是使用同时包含jnlpsidecar容器的 pod 模板。jnlp容器使用 AWS 上的 Red Hat OpenShift 服务 Jenkins 基础代理镜像来促进为您的构建启动单独的 pod。sidecar容器镜像具有在启动的单独 pod 中以特定语言构建所需的工具。Red Hat 容器目录中的许多容器镜像都在openshift命名空间中的示例镜像流中引用。AWS 上的 Red Hat OpenShift 服务 Jenkins 镜像有一个名为java-build的 pod 模板,其中包含演示此方法的 sidecar 容器。此 pod 模板使用openshift命名空间中的java镜像流提供的最新 Java 版本。

Jenkins 镜像还为 Kubernetes 插件提供其他代理镜像的自动发现和自动配置。

使用 AWS 上的 Red Hat OpenShift 服务同步插件,在 Jenkins 启动时,Jenkins 镜像会在其运行的项目或插件配置中列出的项目中搜索以下项目:

  • role标签设置为jenkins-agent的镜像流。

  • role注释设置为jenkins-agent的镜像流标签。

  • role标签设置为jenkins-agent的配置映射。

当 Jenkins 镜像找到具有相应标签的镜像流或具有相应注释的镜像流标签时,它会生成相应的 Kubernetes 插件配置。这样,您可以将 Jenkins 作业分配到在镜像流提供的容器镜像下运行的 pod 中运行。

镜像流或镜像流标签的名称和镜像引用将映射到 Kubernetes 插件 pod 模板中的名称和镜像字段。您可以通过使用键agent-label在镜像流或镜像流标签对象上设置注释来控制 Kubernetes 插件 pod 模板的标签字段。否则,将使用名称作为标签。

不要登录到 Jenkins 控制台并更改 pod 模板配置。如果您在创建 pod 模板后这样做,并且 AWS 上的 Red Hat OpenShift 服务同步插件检测到与镜像流或镜像流标签关联的镜像已更改,它将替换 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 模板后这样做,并且 AWS 上的 Red Hat OpenShift 服务同步插件检测到与镜像流或镜像流标签关联的镜像已更改,它将替换 pod 模板并覆盖这些配置更改。您无法将新配置与现有配置合并。

如果您有更复杂的配置需求,请考虑配置映射方法。

安装后,Red Hat OpenShift Service on AWS 同步插件会监控 Red Hat OpenShift Service on AWS 的 API 服务器以获取镜像流、镜像流标签和配置映射的更新,并调整 Kubernetes 插件的配置。

适用以下规则:

  • 从配置映射、镜像流或镜像流标签中删除标签或注释会删除 Kubernetes 插件配置中任何现有的 PodTemplate

  • 如果这些对象被删除,相应的配置将从 Kubernetes 插件中删除。

  • 如果您创建了带有适当标签或注释的 ConfigMapImageStreamImageStreamTag 对象,或者在初始创建后添加了标签,这将导致在 Kubernetes 插件配置中创建一个 PodTemplate

  • 对于通过配置映射表单创建的 PodTemplatePodTemplate 的配置映射数据更改将应用于 Kubernetes 插件配置中的 PodTemplate 设置。这些更改还会覆盖在更改配置映射之间通过 Jenkins UI 对 PodTemplate 所做的任何更改。

要将容器镜像用作 Jenkins 代理,镜像必须运行代理作为入口点。有关更多详细信息,请参阅官方 Jenkins 文档

Jenkins 权限

如果在配置映射中,Pod 模板 XML 的 <serviceAccount> 元素是用于生成的 Pod 的 Red Hat OpenShift Service on AWS 服务帐户,则服务帐户凭据将被挂载到 Pod 中。权限与服务帐户相关联,并控制允许从 Pod 对 Red Hat OpenShift Service on AWS 主服务器执行哪些操作。

考虑以下场景:使用服务帐户用于 Pod,该 Pod 由在 Red Hat OpenShift Service on AWS Jenkins 镜像中运行的 Kubernetes 插件启动。

如果您使用 Red Hat OpenShift Service on AWS 提供的 Jenkins 示例模板,则 jenkins 服务帐户将使用项目 Jenkins 运行的 edit 角色进行定义,并且主 Jenkins Pod 已挂载该服务帐户。

注入 Jenkins 配置的两个默认 Maven 和 NodeJS Pod 模板也设置为使用与 Jenkins 主服务器相同的服务帐户。

  • 任何由 Red Hat OpenShift Service on AWS 同步插件自动发现的 Pod 模板(因为它们的镜像流或镜像流标签具有所需的标签或注释)都配置为使用 Jenkins 主服务器服务帐户作为其服务帐户。

  • 对于您可以将 Pod 模板定义提供给 Jenkins 和 Kubernetes 插件的其他方法,您必须显式指定要使用的服务帐户。这些其他方法包括 Jenkins 控制台、Kubernetes 插件提供的 podTemplate 管道 DSL,或标记其数据是 Pod 模板 XML 配置的配置映射。

  • 如果您未指定服务帐户的值,则将使用 default 服务帐户。

  • 确保使用的任何服务帐户都在 Red Hat OpenShift Service on AWS 中定义了必要的权限、角色等,以便操作您选择在 Pod 中操作的任何项目。

从模板创建 Jenkins 服务

模板提供参数字段来定义所有环境变量,并具有预定义的默认值。Red Hat OpenShift Service on AWS 提供模板,使创建新的 Jenkins 服务变得容易。Jenkins 模板应在集群管理员在初始集群设置期间在默认的 openshift 项目中注册。

这两个可用模板都定义了部署配置和服务。这些模板在存储策略方面有所不同,这会影响 Jenkins 内容在 Pod 重启后是否持久存在。

当 Pod 移动到另一个节点或部署配置的更新触发重新部署时,可能会重新启动 Pod。

  • jenkins-ephemeral 使用临时存储。Pod 重启后,所有数据都会丢失。此模板仅适用于开发或测试。

  • jenkins-persistent 使用持久卷 (PV) 存储。数据会在 Pod 重启后保留。

要使用 PV 存储,集群管理员必须在 Red Hat OpenShift Service on AWS 部署中定义 PV 池。

选择所需的模板后,必须实例化模板才能使用 Jenkins。

步骤
  • 使用以下方法之一创建新的 Jenkins 应用程序:

    • PV

      $ oc new-app jenkins-persistent
    • emptyDir 类型卷,其中配置不会在 Pod 重启后持久保存。

      $ oc new-app jenkins-ephemeral

对于这两个模板,您都可以对其运行 oc describe 以查看可用于覆盖的所有参数。

例如

$ oc describe jenkins-ephemeral

使用 Jenkins Kubernetes 插件

在以下示例中,openshift-jee-sample BuildConfig 对象会导致动态配置 Jenkins Maven 代理 Pod。Pod 克隆一些 Java 源代码,构建 WAR 文件,并导致第二个 BuildConfigopenshift-jee-sample-docker)运行。第二个 BuildConfig 将新的 WAR 文件分层到容器镜像中。

Red Hat OpenShift Service on AWS 4.11 从其有效负载中删除了 OpenShift Jenkins Maven 和 NodeJS 代理镜像。Red Hat 不再生成这些镜像,并且它们在 registry.redhat.io 上的 ocp-tools-4 存储库中不可用。Red Hat 维护这些镜像的 4.10 和更早版本,以修复任何重大错误或安全 CVE,遵循 Red Hat OpenShift Service on AWS 生命周期策略

有关更多信息,请参阅以下“其他资源”部分中的“OpenShift Jenkins 镜像的重要更改”链接。

使用 Jenkins Kubernetes 插件的示例 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 代理 Pod 的规范。以下是前面示例的修改,它覆盖了容器内存并指定了环境变量。

使用 Jenkins Kubernetes 插件的示例 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 模板继承其配置。在这种情况下,继承自 Red Hat OpenShift Service on AWS 预定义的 Maven Pod 模板。
4 此示例覆盖了预先存在的容器中的值,并且必须按名称指定。Red Hat OpenShift Service on AWS 附带的所有 Jenkins 代理镜像都使用容器名称 jnlp
5 再次指定容器镜像名称。这是一个已知问题。
6 指定了 512 Mi 的内存请求。
7 指定了 512 Mi 的内存限制。
8 指定了一个环境变量 CONTAINER_HEAP_PERCENT,其值为 0.25
9 节点节引用了已定义的 Pod 模板的名称。

默认情况下,构建完成后会删除 Pod。可以使用插件或在管道 Jenkinsfile 中修改此行为。

上游 Jenkins 最近引入了 YAML 声明式格式,用于在您的流水线中内联定义podTemplate 流水线 DSL。这是一个示例格式,使用了在 AWS Jenkins 镜像的 Red Hat OpenShift Service 中定义的示例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 内存需求

当通过提供的 Jenkins 临时模板或 Jenkins 持久模板部署时,默认内存限制为1 Gi

默认情况下,在 Jenkins 容器中运行的所有其他进程最多只能使用512 MiB的内存。如果它们需要更多内存,则容器将停止运行。因此,强烈建议流水线尽可能在 agent 容器中运行外部命令。

如果Project 配额允许,请参阅 Jenkins 文档中关于 Jenkins master 内存方面的建议。这些建议规定为 Jenkins master 分配更多内存。

建议为 Jenkins Kubernetes 插件创建的 agent 容器指定内存请求和限制值。管理员用户可以通过 Jenkins 配置为每个 agent 镜像设置默认值。内存请求和限制参数也可以在每个容器的基础上覆盖。

您可以通过在实例化 Jenkins 临时模板或 Jenkins 持久模板时覆盖MEMORY_LIMIT参数来增加 Jenkins 可用内存量。