有时候需要将上游job的某些值传递到下游job中使用,自己使用的几种方法记录一下。
场景一、job之间的变量传递
当有两个job,jobA进行代码编译,jobB进行环境部署。我们需要先进行jobA执行,执行成功之后再执行jobB 如果两个job之间不需要有变量的传递,那么可以选择:Build other projects

但是如果需要传递参数选择Trigger parameterized build on other projects(需要有插件:Parameterized Trigger Plugin)

1.使用插件Parameterized Trigger Plugin

插件可以实现Job间参数传递但是有局限性,我们只能选择传递当前build的参数或者环境变量。而且这个变量只能是上级job中参数化时传入的,shell中进行了修改也不会改变。如果要传递一个自定义的变量怎么办呢? 构建步骤中的自定义变量在执行结束后都会被回收,我们不可能在"predefined parameters"中取到。
2.使用保存文件的方式
执行jobA的时候将需要的变量存在一个var.txt中,jobB需要使用时就将到这个目录下,获取文件中的内容
或者使用一个从文件中获取的插件:Extended Choice Parameter

使用绝对路径 文件test.txt内容:sid=fshdfkhsdjkfhsfsdhjkfh

jobA保存在文件中的sid就能给jobB使用了。
但是保存文件的方式,如果是用不同的slave,在不同服务器上,保存文件的方式就不好处理了。所以有了以下两种方法:
3.通过properties file的方式传递参数(仍然需要插件:Parameterized Trigger Plugin)
现有上游job:[test-file-parameters] 和下游job:[test-job]
在[test-file-parameters]中有参数:compiled 默认值:123456

删除原来老的数据 然后可以对变量进行一些操作之后,然后以"xx=xx"的样式写入到配置文件『propfile.txt』中。
IFUT=$compiled IFUT是下游job test-job里的变量 compiled是上游job test-file-parameter里的变量

然后在"Trigger parameterized build on other projects"中选择"Parameters from preperties file",在propfile里写入多个变量就可以传递多个值。

在[test-job]中有参数 IFUT 这个值要和profile.txt里的key值一样 否则无法传递

查看一下IFUT最终的值 是不是上游job中shell里修改成的3333333

构建上游job:[test-file-parameter] 构建成功之后会触发test-job 传递自定义变量成功!

4.通过EnvInject Plugin插件
EnvInject Plugin可以支持修改、注入和删除环境变量。
同样添加shell脚本,变量传递
我们在构建中增加步骤"Inject environment variables", 将写在配置文件中的变量${IFUT},注入到环境变量里。

在"Trigger parameterized build on other projects"就可以直接选择"predefined parameters"方式直接传递变量了。

同样的在Job『test-job』里就可以直接访问变量${IFUT}了。



上面两种方法,都是通过profile.txt文件的方式,通过这个配置,可以将自定义的变量值不仅能传递,而且还能自定义修改值。这样的话,当上游需要传递一个自定义变量,这个变量又是通过shell脚本中修改过的,就可以使用profile.txt方式。
场景二:Job构建步骤间的变量传递
有时为了使Job中的复杂的构建流程更加清晰我们配置多个构建步骤像下面这样。图中包含两个构建步骤,步骤2需要根据步骤1中的返回值来判断是否执行操作:

执行时jenkins将两个构建步骤生成两个shell文件,然后分别调用。
do_build_step_1
[Jenkins] $ /bin/bash -xe /tmp/hudson1270042613896791809.sh
do_build_step_2
[Jenkins] $ /bin/bash -xe /tmp/hudson5918908417824291692.sh
理论上两个shell之间是无法通信的,step1执行完之后变量$dostep2就会被回收,要注意试图在step1中通过export或者其他脚本方式注入环境变量都是无效的。
解决方案:读写文件
要实现它们之间的变量传递只能通过读写文件的方式。我们有一个真实应用场景是这样的,配置由git push触发编译任务,但是并不是每一次git的提交都需要触发编译,比如说只有前端代码的提交其实并不影响编译的结果,我们只好在step1中加入判断来却确定step2是否真的有必要被执行。
参考:
本文介绍了在Jenkins中如何实现job之间的参数传递,包括使用Parameterized Trigger Plugin、保存文件、properties文件以及EnvInject Plugin插件的方法。详细阐述了各种方式的优缺点和实际应用场景,特别是对于自定义变量和环境变量的传递。

3201

被折叠的 条评论
为什么被折叠?



