Kubernetes将Pod集群作为Jenkins Build Agents

时间:2020-07-28 13:27:47

标签: docker jenkins kubernetes jenkins-kubernetes

我已经在我们的Jenkins中安装了Kubernetes plugin - 1.23.3,并且能够在kubernetes pod(动态Jenkins从站)上执行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集群pod上使用我们自己的docker映像作为动态Jenkins Build Agents执行build + static analysis

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

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

2 个答案:

答案 0 :(得分:0)

默认情况下,詹金斯将从dockerhub中提取图像。在您的情况下,图像sonatype:4546 / ubuntu-16.04。为了使用专用注册表,如果您正在构建管道,则需要提供专用注册表及其凭据。您可以在UI上提供它,也可以通过代码来完成它。请参阅here

之后,您还需要向kubernetes YAML告知私有注册表。 为此,您可以参考here。这实质上是两个步骤 a)创建一个kubernetes秘密 b)使用imagepullsecret字段告知您的部署有关机密的信息。

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

===============在添加问题并添加新问题后编辑1 =====

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

  1. 去管理詹金斯

  2. 全局工具配置

  3. Docker->填充名称(例如:Docker-latest) enter image description here 自动检查安装,然后添加安装程序(从此处下载)。

  4. 然后保存

如果已安装在计算机上,请使用Docker的位置更新Jenkins中的PATH变量。

Reference for Jenkins File

答案 1 :(得分:0)

塔伦(Tarun)的答案假设您正在管道中构建图像。

我在管道中执行了类似的操作,但是我们在管道外部构建了一个自定义的jnlp-slave映像(加载了CI / CD所需的工具),并在kubernetes插件yaml中进行了引用。

构建自定义的jnlp从属映像。 (下面的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

定义您的Jenkins文件,以便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")
  }
}

我们的注册表不需要身份验证,但是如果需要,则需要向詹金斯提供机密信息(如Tarun所述),以使其能够在注册表中进行身份验证。