我有一个工作有 N 个(N 代表选择参数的数量)选择参数。我想将每个选择参数传递给管道。管道需要使用每个选项参数构建作业(例如,参数名称为“项目”,选项为 {A,B,C}。管道需要为项目参数中提供的每个选项构建作业)。
我对 google/stackoverflow 进行了无休止的研究,但还没有想出一个好的解决方案。
答案 0 :(得分:1)
因此,假设有选择的工作是管道 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
执行时。
答案 1 :(得分:1)
为了从另一份工作中获得选择,需要做很多事情。对它们进行硬编码可能会更容易。如果你想动态访问它,你可以这样做:
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)]
}