TL;DR:显然,在 Jenkins 管道作业中,您可以轻松地将参数传递给下游。我想知道的是你能否通过它们upstream.
使用案例:
我们有三份工作;job_one
, job_two
, and job_three
。这些通常单独运行,因为只需要一个阶段,但在越来越频繁的情况下,我们希望能够连续运行所有三个阶段。
第一个和第二个依赖于您可以提前定义的参数,但第三个需要从第二个作业生成的参数(在 job_two 运行之前其结构未知的文件名)。
我已经建立了umbrella
,它为每个作业调用类似以下内容的内容。在这种情况下,PARAM1
已填充,因为伞运行为“使用参数构建”。
build job: 'job_one', parameters: [[$class: 'StringParameterValue', name: 'PARAM1', value: "$PARAM1"]]
一切都很好,然后我就可以使用PARAM1
in job_one
正好。
问题:
For job_three
我需要参数filename
。这是在内生成的job_two
,因此据我所知,这是无法访问的,因为 job_ Three 不知道 job_two 在做什么。
在理想的世界中,我只会让 job_two 通过filename
到伞式作业,这会将其反馈到 job_ Three 中。所以,我怎样才能传递生成的filename
回到保护伞工作?
我正在想象最终的剧本是这样的;
node('on-demand-t2small'){
stage ('Build 1') {
build job: 'job_one', parameters: [[$class: 'StringParameterValue', name: 'PARAM1', value: "$PARMA1"]]
}
stage ('Build 2') {
build job: 'job_two', parameters: [[$class: 'StringParameterValue', name: 'PARAM2', value: "$PARMA2"]]
//somehow get the filename parameter out of job_two here so that I can move it to job three...
}
stage ('Build 3') {
build job: 'job_three', parameters: [[$class: 'StringParameterValue', name: 'filename', value: "$filename"]]
} }
补充笔记:
我认识到第一个问题是“为什么不让 job_two 触发 job_ Three?我无法以这种方式设置系统,原因有两个:
- job_two 需要能够在不触发 job_third 的情况下运行,而 3 并不总是需要 2 的输入才能运行。
- 我争论过让雨伞启动两个,然后在两个中设置一个条款,只有在雨伞启动的情况下才会触发三个,但据我所知,这将限制雨伞工作中的反馈;你不会知道两个失败是因为两个失败,还是因为三个(作为两个的一部分)失败。如果我的这个假设是错误的,请告诉我。
我曾考虑过将参数设置为环境变量,但我相信这是特定于节点的,我不能保证这两个作业将在同一节点上运行,因此这似乎不是解决方案。
Umbrella 是一个用 Groovy 编写的管道作业,其他三个可能是管道或自由式作业,如果这很重要的话。
如果可能的话,我希望得到详细的答案,我对 Groovy、Jenkins 和一般编码仍然很陌生。