如何基于多个/不同参数多次运行Jenkins管道。 (请参阅说明以获取更多详细信息)

时间:2019-11-08 09:10:41

标签: jenkins jenkins-pipeline pipeline jenkins-groovy

我在管道中使用了字符串参数。 names =“ name1,name2”(在单个文本框中,用户将输入用逗号分隔的名称)

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

我有一个包含三个阶段(构建,测试,部署)的管道脚本。在上述情况下,只有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.   

}
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'){
         ......
      }
}

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

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

执行可以一一或并行执行。两种答案都值得欢迎。

1 个答案:

答案 0 :(得分:1)

不幸的是,据我所知,这不能使用声明式管道来完成,因为没有办法具有动态阶段和/或并行分支(关于这一事实,我没有任何资料,但是据我所知)可以从文档和实现中看出来,这似乎是不可能的)。 幸运的是,脚本化管道更加动态,能够满足您的需求。以下代码应根据需要工作:

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

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

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