詹金斯-在工作之间传递变量?


87

我在詹金斯有两个工作,这两个工作都需要相同的参数。

如何使用参数运行第一个作业,以便在触发第二个作业时使用相同的参数?


我们可以使用多种方法:一种最佳方法是使用当前作业参数,或者在触发器下游作业中使用预定义的参数
ksr

1
这个标题太混乱了。如何“在作业之间传递变量?”。也接受的答案是插件。看中了!
拉基布

Answers:


73

您可以使用参数化触发器插件,该插件可让您将参数从一个任务传递到另一任务。

您还需要在上游添加从上游传递的此参数。


10
嗨,您好,您听起来像个菜鸟,但是如果有人可以使用参数化触发器插件详细说明如何编辑它,可以吗?
法迪

10
旁注:在bash脚本节中创建的导出环境变量看起来不适合在输出参数中替换(例如,'export VERSION'不会使'UPSTREAM_VERSION = $ VERSION'取正确的值;它只会改为使用“ $ VERSION”。
马克·麦肯纳

21
这个答案是不够的
tarabyte

6
我同意应该有一些示例,说明如何将参数传递给目标作业。当前的“参数化触发器插件”页面未提供有关此信息。例如,在传递参数时可能会使用哪种语法。
skrii '16

2
该插件似乎不再起作用。请参阅未解决问题的详细清单。我无法再通过此插件传递任何参数值。还有其他解决方案吗?
Markus L

38

1.构建后操作>选择“在其他项目上触发参数化构建”

2.输入带有value的环境变量。Value也可以是Jenkins Build Parameters。

详细步骤可以在这里查看:-

https://itisatechiesworld.wordpress.com/jenkins-related-articles/jenkins-configuration/jenkins-passing-a-parameter-from-one-job-to-another/

希望对您有所帮助:)


这个答案满足了OP提出的问题,而无需插件或使用DSL。
BTC 2015年

8
仅供参考,此答案仍需要插件。
Thomas Lee

该插件在以下情况下非常有用,但无法传递在执行shell命令部分中设置的变量值。
塔拉·普拉萨德·古隆

25

这里接受的答案不适用于我的用例。我需要能够在一个作业中动态创建参数并将其传递给另一个作业。饰演Mark McKenna提到的那样,似乎没有办法将变量从Shell构建步骤导出到后期构建操作。

我通过使用参数化触发器插件实现了解决方法,方法是将值写入文件,然后将该文件用作要通过“添加构建后操作”->“触发参数化构建...”导入的参数,然后选择“添加参数”- >“来自属性文件的参数”。


这就是我所需要的。谢谢。
luckytaxi

如果您愿意使用jenkins 2.x管道,则可以使用writeFile / stash-> unstash / readFile在作业之间复制状态数据。 slideshare.net/ericlongtx / ...例如,请查看幻灯片21。
午休

如果您希望传递SHELL变量,则这是必需的。非常感谢这个答案。
卡尔·温赖特

17

我认为上述答案需要一些更新:

我试图创建一个动态目录来存储上游构建工件,因此我想将上游作业内部版本号传递给下游作业,但是我尝试了上述步骤,但无法使其正常工作。运作方式如下:

  1. 我使用复制工件插件从当前工作复制了工件。
  2. 在上游作业的构建后操作中,我添加了“ SOURCE_BUILD_NUMBER = $ {BUILD_NUMBER}”之类的变量并将其配置为触发下游作业。
  3. 一切正常,除了我的下游作业无法获得$ SOURCE_BUILD_NUMBER来创建目录。
  4. 因此,我发现要使用此变量,我必须在下游作业中将相同的变量定义为参数变量,如下图所示:

在此处输入图片说明

这是因为新版本的jenkins要求您也要在下游作业中定义变量。希望对您有所帮助。


完全同意。这是强制性更新,可以100%完成初始答案。
CodeSlave

10

(对于其他Google员工)

如果您正在使用Build Flow插件构建严肃的管道可以使用DSL在作业之间传递参数,如下所示:

假定可用的字符串参数“ CVS_TAG”,以便将其传递给其他作业:

build("pipeline_begin", CVS_TAG: params['CVS_TAG'])
parallel (
   // will be scheduled in parallel.
   { build("pipeline_static_analysis", CVS_TAG: params['CVS_TAG']) },
   { build("pipeline_nonreg", CVS_TAG: params['CVS_TAG']) }
)
// will be triggered after previous jobs complete
build("pipeline_end", CVS_TAG: params['CVS_TAG'])

显示可用变量/参数的提示:

// output values
out.println '------------------------------------'
out.println 'Triggered Parameters Map:'
out.println params
out.println '------------------------------------'
out.println 'Build Object Properties:'
build.properties.each { out.println "$it.key -> $it.value" }
out.println '------------------------------------'

不建议使用“构建流插件”,用户应迁移到wiki.jenkins-ci.org/display/JENKINS/Pipeline+Plugin
vhamon

7

除了Nigel Kirby的答案之外,只需添加我的答案即可,因为我无法发表评论:

为了传递动态创建的参数,还可以将变量导出到“ Execute Shell”磁贴中,然后将其传递给“在其他项目上触发参数化的构建” =>“预定义参数” =>给出“ YOUR_VAR = $ YOUR_VAR”。我的团队使用此功能将npm软件包版本从生成作业传递到部署作业

更新:以上仅适用于詹金斯注入的参数,从外壳创建的参数仍需要使用相同的方法。例如。回显YOUR_VAR = $ {YOUR_VAR}> variable.properties并将该文件传递到下游


3

当我必须将pom版本传递给下游Rundeck作业时,我遇到了同样的问题。

我所做的就是通过属性文件使用参数注入,例如:

1)通过shell在属性文件中创建属性:

建立动作:

  • 执行一个shell脚本
  • 注入环境变量

例如:属性定义

2)将定义的属性传递给下游作业:构建后操作:

  • 触发其他项目上的参数化构建
  • 添加参数:当前构建参数
  • 添加参数:预定义参数

例如:属性发送

3)然后可以在下游Rundeck作业中使用$ POM_VERSION。

/!\ Jenkins版本:1.636

/!\由于某种原因,在创建触发的版本时,必须添加选项“当前版本参数”以传递属性。


编辑:在我写的东西中找到了一个家伙。在属性定义中,应该是:echo POM_VERSION = $ POM_VERSION> play.properties,而不是:echo $ POM_VERSION >> play.properties抱歉。
Eli Mous

2

通读答案,我看不到我喜欢的其他选项,因此也将提供它。我喜欢job的参数化设置,但并不总是可以很好地扩展。如果您的作业不是直接在第一个作业的下游,而是在管道的更下游,则您实际上并不想对管道中的每个作业进行参数化,以使其能够始终传递参数。或者,如果您有许多其他作业使用的参数(尤其是那些不一定与一个父或主作业绑定的参数),则再次进行参数设置无效。

在这些情况下,我倾向于将值输出到属性文件,然后使用EnvInject插件将其注入到我需要的任何工作中。这可以动态完成,这是上面另一个仍然使用参数化作业的答案中解决问题的另一种方法。该解决方案在许多情况下均可很好地扩展。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.