如何根据 multiple/different 参数多次 运行 Jenkins 管道。 (更多详情请参考说明)
How to run a Jenkins pipeline multiple times, based on the multiple/different parameters. (Please refer the description for more details)
我在管道中使用了一个字符串参数。
names="name1,name2"(在单个文本框中,用户将输入以逗号分隔的名称)
我正在使用标记化方法将此字符串转换为列表。在此之后,列表将有 [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.
}
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 应传递给管道。
可以逐个执行,也可以并行执行。欢迎两种回答。
不幸的是,据我所知,这不能用声明性管道来完成,因为没有办法让动态阶段 and/or 并行分支(我没有这个事实的来源,但是据我从文档和实现中可以看出,这似乎是不可能的)。
幸运的是,脚本化管道更加动态,能够满足您的需求。以下代码应按预期工作:
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(目前处于测试阶段)可以解决您的问题。我还没有尝试过,但如果可以在轴部分引用参数,那么你可以有一个动态的分支数。
我在管道中使用了一个字符串参数。 names="name1,name2"(在单个文本框中,用户将输入以逗号分隔的名称)
我正在使用标记化方法将此字符串转换为列表。在此之后,列表将有 [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.
}
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 应传递给管道。
可以逐个执行,也可以并行执行。欢迎两种回答。
不幸的是,据我所知,这不能用声明性管道来完成,因为没有办法让动态阶段 and/or 并行分支(我没有这个事实的来源,但是据我从文档和实现中可以看出,这似乎是不可能的)。 幸运的是,脚本化管道更加动态,能够满足您的需求。以下代码应按预期工作:
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(目前处于测试阶段)可以解决您的问题。我还没有尝试过,但如果可以在轴部分引用参数,那么你可以有一个动态的分支数。