使用“标签”或在 jenkinsfile 中为 kubernetes-plugin 定义 pod 模板?

air*_*ata 1 jenkins jenkins-plugins kubernetes jenkins-pipeline kubernetes-jenkins-plugin

一般来说

我在为 Jenkins 使用kubernetes-plugin时尝试使用标签,但我有点困惑。在我的pipeline下面,我尝试parallel使用不同的标签(代理)分步骤构建测试作业。

我已经在 J​​enkins 配置中使用 pod 模板和容器配置了插件,其中我使用与podTemplate定义的管道中相同的设置。

问题

问题是,当我agent label在第 2 阶段使用时,运行的是 jnpl 映像,而不是我在 config 中指向的映像someimage:latest

stage 1我在管道中定义 pod 的地方没有问题,并且所需的图像运行良好。

问题

我做错了什么? 这是我在 Jenkins 中的kubernetes 插件jenkinsfile的配置:

def podTemplate = """
apiVersion: v1
kind: Pod
spec:
  containers:
  - name: k8s
    image: someimage:latest
    command:
    - sleep
    args:
    - infinity
    volumeMounts:
      - name: workspace-volume
        mountPath: /home/jenkins/agent
    workingDir: "/home/jenkins/agent"
  volumes:
      - name: "workspace-volume"
        persistentVolumeClaim:
          claimName: "jenkins-worker-pvc"
          readOnly: false
"""
pipeline {
    agent none
    stages {
        stage("Parallel") {
            parallel {
                stage("1.k8s") {
                    agent {
                        kubernetes {
                            yaml podTemplate
                            defaultContainer 'k8s'
                        }
                    }
                    steps {
                        sh """
                            mvn -version
                        """
                    }
                }
                stage("2. k8s") {
                    agent { label 'k8s' }
                    steps {
                        sh """
                            mvn -version
                        """
                    }
                }
                stage("win") {
                    agent { label 'windows' }
                    steps {
                        bat "dir"
                    }
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

Cro*_*rou 5

stage您没有为withlabel k8s和指定图像windows

您可以在文档中阅读:

该插件为每个启动的代理创建一个 Kubernetes Pod,由要运行的 Docker 映像定义,并在每次构建后停止它。

代理是使用 JNLP 启动的,因此预计镜像会自动连接到 Jenkins master。

您正在使用podTemplate,我建议您进行设置container,这可能如下所示:

podTemplate(containers: [
    containerTemplate(name: 'maven', image: 'maven:3.3.9-jdk-8-alpine', ttyEnabled: true, command: 'cat'),
    containerTemplate(name: 'golang', image: 'golang:1.8.0', ttyEnabled: true, command: 'cat')
  ]) {

    node(POD_LABEL) {
        stage('Get a Maven project') {
            git 'https://github.com/jenkinsci/kubernetes-plugin.git'
            container('maven') {
                stage('Build a Maven project') {
                    sh 'mvn -B clean install'
                }
            }
        }

        stage('Get a Golang project') {
            git url: 'https://github.com/hashicorp/terraform.git'
            container('golang') {
                stage('Build a Go project') {
                    sh """
                    mkdir -p /go/src/github.com/hashicorp
                    ln -s `pwd` /go/src/github.com/hashicorp/terraform
                    cd /go/src/github.com/hashicorp/terraform && make core-dev
                    """
                }
            }
        }

    }
}
Run Code Online (Sandbox Code Playgroud)

您可以阅读有关容器配置容器组支持的更多信息