如何根据多个/不同的参数多次运行 Jenkins 管道。(更多详情请参阅说明)

Kan*_*pal 5 pipeline jenkins jenkins-groovy jenkins-pipeline

我有一个在管道中使用的字符串参数。名称=“名称1,名称2”(在单个文本框中,用户将输入以逗号分隔的名称)

我正在使用 tokenize 方法将此字符串转换为列表。之后,列表将有 [name1, name2]

我有一个包含 3 个阶段(构建、测试、部署)的管道脚本。在上面的例子中,只有 2 个名字。因此,该管道应执行 2 次。同样,根据我们传递的名称数量,管道应该运行那么多次。

看到下面的代码后,您会了解我实际上在问什么。

//Getting values using String Parameter in Jenkins. "name1, name2" is entered for "NAMES" as input
//Tokenize will turn "name1, name2" to [name1, name2]

namesList = params.NAMES.tokenize(',') 

for(name in namesList){
     .......
     //Pipeline should be triggered using 'name1' and 'name2', either one by one or parallel.   

}
Run Code Online (Sandbox Code Playgroud)
pipeline{
   agent any
   stages{
      stage('build'){
         steps{
            sh 'curl https://abc.xyz/'+ name +'/sample'   //name should be passed to run this command
         }
      }
      stage('test'){
         ......
      }
      stage('deploy'){
         ......
      }
}
Run Code Online (Sandbox Code Playgroud)

第一次迭代:name1 应传递到管道。

第二次迭代:name2 应传递到管道。

执行可以是逐一执行或并行执行。这两个答案都受到欢迎。

Jon*_*n S 6

不幸的是,据我所知,这不能通过声明式管道来完成,因为没有办法拥有动态阶段和/或并行分支(我没有这个事实的来源,但据我所知文档和实现,它看起来不可能)。幸运的是,脚本化管道更加动态,并且能够满足您的需求。以下代码应按预期工作:

def namesList = params.NAMES.tokenize(',')

def parts = [:]
namesList.each { name ->
    parts[name] = {
        stage('build'){
            echo "build for ${name}"
        }
        stage('test'){
            echo "test for ${name}"
        }
        stage('deploy'){
            echo "deploy for ${name}"
        }
    }
}
parallel parts
Run Code Online (Sandbox Code Playgroud)

代码非常简单,我们对输入参数进行标记,声明一个映射来存储不同的分支。循环遍历名称,对于每个名称,我们在分支中分配一个元素,并使用定义流程步骤的闭包。然后我们使用并行步骤执行分支。

编辑 2019-11-25最近添加的矩阵指令(目前处于测试版)可以解决您的问题。我还没有尝试过,但如果可以引用轴部分中的参数,那么您可以拥有动态数量的分支。