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

时间:2021-02-12 00:59:38

标签: jenkins groovy jenkins-pipeline jenkins-groovy

我有一个工作有 N 个(N 代表选择参数的数量)选择参数。我想将每个选择参数传递给管道。管道需要使用每个选项参数构建作业(例如,参数名称为“项目”,选项为 {A,B,C}。管道需要为项目参数中提供的每个选项构建作业)。

我对 google/stackoverflow 进行了无休止的研究,但还没有想出一个好的解决方案。

2 个答案:

答案 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)] 
}