0

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

假设如果我更改下面的“名称”和“Docker Image”部分以使用我们的私有注册表和图像

Manage Jenkins --> Configure System--> Cloud --> Pod Template --> Container Template

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

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

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

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

2 回答 2

0

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

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

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

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

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

  1. 去管理詹金斯

  2. 全局工具配置

  3. Docker -> 填写名称(例如:Docker-latest) 在此处输入图像描述 自动检查安装,然后添加安装程序(从此处下载)。

  4. 然后保存

如果你已经在你的机器上安装了,那么用 Docker 的位置更新 Jenkins 中的 PATH 变量。

Jenkins 文件参考

于 2020-07-28T14:29:00.273 回答
0

上面 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 所提到的),以使其在您的注册表中进行身份验证。

于 2020-08-10T21:34:28.403 回答