jenkins - 如何在 jenkins 上并行运行动态阶段,并为每个阶段使用单独的 kubernetes 代理

标签 jenkins kubernetes jenkins-pipeline

我尝试结合我在语法中找到的东西,但这已经是我能得到的最接近的了。它创建了多个阶段,但表示它们没有步骤。

如果我将代理语法向下移动到定义“测试”阶段的位置,我可以让它在同一个代理上运行一堆并行步骤,但我想为每个代理启动单独的 pod,以便我可以实际使用kubernetes 集群有效地完成我的工作。

附上一个Jenkinsfile示例供引用

def parallelStagesMap

def generateStage(job) {
    return {
        stage ("$job.key") {
            agent {
                kubernetes {
                    cloud 'kubernetes'
                    yaml """
apiVersion: v1
kind: Pod
spec:
  containers:
  - name: name
    image: image
    command:
    - sleep
    args:
    - infinity
"""
                }
            }
            steps {
                sh """
                    do some important stuff
                """
            }
        }
    }
}

pipeline {
    agent none
    stages {
        stage('Create List of Stages to run in Parallel') {
            steps {
                script {
                    def map = [
                        "name" : "aparam",
                        "name2" : "aparam2"
                    ]
                    parallelStagesMap = map.collectEntries {
                        ["${it.key}" : generateStage(it)]
                    }
                }
            }
        }
        stage('Test') {
            steps {
                script {
                    parallel parallelStagesMap 
                }
            }
        }
        stage('Release') {
            agent etc
            steps {
                etc
            }
        }
    }
}

最佳答案

要并行运行动态创建的作业,您必须使用脚本化管道语法。
脚本化管道中声明性 kubernetes 代理的等效语法是 podTemplatenode (请参阅完整的 Doucumentation ):

podTemplate(yaml: '''
    apiVersion: v1
    kind: Pod
    spec:
      containers:
      - name: maven
        image: maven:3.8.1-jdk-8
        command:
        - sleep
        args:
        - 99d
''') {
  node(POD_LABEL) {
     ...
    }
}

注意,podTemplate 除了 yaml 之外,还可以接收 cloud 参数,但它默认为 kubernetes,所以不需要传递它。

因此,在您的情况下,您可以使用此语法在不同代理上并行运行作业:

// Assuming yaml is same for all nodes - if not it can be passed as parameter
podYaml= """
apiVersion: v1
kind: Pod
spec:
  containers:
  - name: name
    image: image
    command:
    - sleep
    args:
    - infinity
"""

pipeline {
    agent none
    stages {
        stage('Create List of Stages to run in Parallel') {
            steps {
                script {
                    def map = ["name" : "aparam",
                              "name2" : "aparam2"]
                    parallel map.collectEntries {
                        ["${it.key}" : generateStage(it)]
                    }
                }
            }
        }
    }
}

def generateStage(job) {
    return {
        stage(job.key) {
            podTemplate(yaml:podYaml)  {
                node(POD_LABEL) {
                    // Each execution runs on its own node (pod)
                    sh "do some important stuff with ${job.value}"
                }
            }
        }
    }
}

关于jenkins - 如何在 jenkins 上并行运行动态阶段,并为每个阶段使用单独的 kubernetes 代理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70808071/

相关文章:

jenkins - 我可以使用 Jenkinsfile 中的函数构建阶段吗?

git - 在 Jenkins 管道中 checkout 标签

ruby - 即使明确给出路径,jenkins 也无法找到 rake 安装

kubernetes - Kubernetes是否需要最少数量的副本才能进行滚动部署?

jenkins - 使用 Jenkins Pipeline 时是否可以有声音通知?

Kubernetes - 从文件更新现有的配置映射

kubernetes - 将裸机 kubernetes 集群暴露在互联网上

Jenkins 管道参数来保存一个数组

Git参数管道脚本

jenkins - 在airflow中的特定时间运行任务