Kubernetes 集群 pods 作为 Jenkins 构建代理

Kubernetes cluster pods as Jenkins Build Agents

我已经在我们的 Jenkins 中安装了 Kubernetes plugin - 1.23.3 并且能够在 kubernetes pod(Dynamic Jenkins Slave)上执行 shell 命令。这是默认的 jnlp & jenkins/jnlp-slave:latest

假设我将下面的“名称”和“Docker 图片”部分更改为使用我们在

下的私有注册表和图片
Manage Jenkins --> Configure System--> Cloud --> Pod Template --> Container Template

Name: sonatype
Docker image:sonatype:4546/ubuntu-16.04

它不使用我们的私人 docker 图像,甚至不 运行 pod 容器上的 shell 命令。这个想法是在 Kubernetes 集群 pods 上使用我们自己的 docker 图像作为动态 Jenkins 构建代理来执行 build + static analysis

如何使用我们私有的 docker 注册表镜像并将它们作为 kubernetes 集群中的 Jenkins slave 执行?我有下面的脚本管道代码。 K8S 工作节点的第 1 阶段“SCM 代码检出”正在运行,下一个第 2 阶段构建将从 template Kubernetes Pod Template 启动 pod 代理。但如果失败 docker: not found。它似乎试图在 pod 中拉取我们的注册表映像。我们的工作节点系统的代码需要安装在动态 Jenkins slave pods 中并执行构建和下一阶段。任何实现方向都会有所帮助。

node ("kubupods") { 
       stage('Code Compile') { 
          sh 'hostname'
        }
                
      stage('Code Analysis') {    
         sh 'hostname'
    }
    }
    
 

Jenkins 默认会从 dockerhub 拉取镜像。在你的情况下图像 sonatype:4546/ubuntu-16.04 。如果您正在管道中构建,则为了使用私有注册表,您需要提供私有注册表及其凭据。您可以在 UI 上提供,也可以通过代码提供。参考 here

之后你还需要告诉 kubernetes YAML 以及私有注册表。 为此,您可以参考 here。这基本上是两个步骤 a) 创建一个 kubernetes secret b) 使用 imagepullsecret 字段将秘密告诉您的部署。

确保将您的图片称为 <username or registry URL/<image_name>:<tag(maybe $BUILD_NUMBER)>

=============== 添加问题后编辑 1 =====

配置插件以使用 Jenkins 安装包。

  1. 去管理 Jenkins

  2. 全局工具配置

  3. Docker -> 填写名称(eg: Docker-latest) 检查自动安装,然后添加安装程序(从此处下载)。

  4. 然后保存

如果您已经在您的计算机上安装,则使用 Docker.

的位置更新 Jenkins 中的 PATH 变量

Reference for Jenkins File

Tarun 的上述回答假定您正在管道中构建映像。

我在我们的管道中做了类似的事情,但我们在管道外构建了一个自定义 jnlp-slave 图像(加载了我们 CI/CD 所需的工具)并在 kubernetes 插件 yaml 中引用它.

构建自定义 jnlp-slave 图像。 (下面的 Dockerfile)

FROM jenkins/jnlp-slave:latest

# Download/install tools

ENTRYPOINT ["jenkins-slave"]

将自定义 jnlp-slave 图像推送到您的私有注册表

docker build -t my-private-registry/jnlp-slave:custom .
docker push my-private-registry/jnlp-slave:custom

定义您的 Jenkinsfile,以便 pod 使用您在上一步中构建的映像。

pipeline {
    agent {
        kubernetes {
            yaml """
apiVersion: v1
kind: Pod
metadata:
  label:
    jenkins: slave
spec:
  containers:
  - name: jnlp
    image: my-private-registry/jnlp-slave:custom
}}}

stages {
  stage("Test") {
    sh("hostname")
  }
}

我们的注册表不需要身份验证,但如果需要,您需要向 jenkins 提供秘密(正如 Tarun 提到的),以让它在您的注册表中进行身份验证。