如何从管道运行参数化作业?



我有一个作业,它有N (N表示有选择参数的数量)个选择参数。我想把每个选择参数传递给管道。管道需要用每个选择参数构建作业(例如,参数名称为'Project',选择{A,B,C})。Pipeline需要为项目参数中提供的每个选项构建作业)。

我在google/stackoverflow上做了没完没了的研究,还没有找到一个好的解决方案。

为了从另一个作业中获得选项,需要进行相当多的操作。对它们进行硬编码可能更容易。如果你想动态访问它,你可以这样做:

def choices = Jenkins.instance.getItemByFullName("myJob")
.getProperty(hudson.model.ParametersDefinitionProperty)
.getParameterDefinition("parameterName").getChoices()
choices.each{choice ->
build job: "myJob", parameters: [string(name: "parameterName", value: choice)] 
}

假设有选项的作业是管道B而调用它并提供所有选项的作业是管道a

在作业A中,您要么硬编码不同的选项,要么只是有一个文本字段参数,您可以在其中输入所需的选项。在管道的某个地方(如果使用声明式风格,则在script-块中)需要做这样的事情:

//for every selected choice
params.choices.split("n").each{ choice ->
build job: "myJob", parameters: [string(name: "nameOfChoiceParam", value: choice)]
}

可以看到,内部选择参数只不过是字符串参数。

编辑:

如果你想并行地构建这个,你需要使用脚本化的管道(我认为,也许它也适用于声明式管道)。parallel函数需要一个Map<String, Closure>,有许多方法可以生成它,但其中一种方法是:

def steps = params.choices.split("n").collectEntries{ choice ->
[(choice): {
build job: "myJob", parameters: [string(name: "nameOfChoiceParam", value: choice)] 
}]
}
parallel steps

如果您想为所有可用的节点这样做,您需要首先生成所有可能性的列表(combiniations将有所帮助),或者您可以使用良好的旧嵌套for循环。

当有30个选择时,您可能不会通过并行化获得那么多,并且有很多因素(每个节点有多少执行器等)。一般来说,直接将代码放在那里会比启动一个单独的管道更快,特别是当我们谈论choices * nodes = 30 * 4 = 120的执行时。

最新更新