场景一: Job构建步骤间的变量传递

Jenkins提供了数十种构建方式,我们以最常用的『Execute shell』为例。有时为了使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是否真的有必要被执行。
场景二: Job之间的变量传递
现在有两个Project『run_compile』和『run_deploy』,代码编译成功后开始执行环境部署。不需要传递参数的情况下可以选择“Build other projects“的方式。
需要传递参数则需要选择"Trigger parameterized build on other projects"的方式。

Jenkins Parameterized Trigger plugin可以实现Job间参数传递但是有局限性,我们只能选择传递当前build的参数或者环境变量。 (例:$GIT_COMMIT是git plugin提供的一个变量,存着当前build触发时最新的git code.) 如果要传递一个自定义的变量怎么办呢? 构建步骤中的自定义变量在执行结束后都会被回收,我们不可能在"predefined parameters"中取到。
依旧以编译任务为例,前端代码的提交不需要触发编译,没有编译也就不需要执行接下来的『run_ut』单元测试。(泛指后台代码的UT, JS UT这种稀有存在暂不考虑)
如何将编译的状态告诉下游的单元测试呢?
聪明的你想起了场景一的解决办法。对,我们也可以通过读写文件的方式来解决这个问题嘛!
不过这里我不推荐大家采用这种方式,理由有两点:
一,『run_compile』和『run_ut』有可能被部署在不同slave上,如果考虑更加智能的CI配置方式会在构建时动态的选择空闲的slave去执行,这种文件读写的方式就有了很大的局限性;
二,很难确保文件传递的准确性,如果『run_compile』写入文件失败,『run_ut』中读到的就是一个旧值一个不准确的值。
 
解决方案一:通过properties file的方式传递参数。
首先将变量以"xx=xx"的样式写入到配置文件『propfile.txt』中。
然后在"Trigger parameterized build on other projects"中选择"Parameters from preperties file",在propfile里写入多个变量就可以传递多个值。

建议勾选"Don't trigger if any files are missing"和删除旧文件配合使用。

最后在『run_ut』中可以直接获取这个变量来使用了。
解决方案二: 通过EnvInject Plugin插件
EnvInject Plugin可以支持修改、注入和删除环境变量。
我们在构建中增加步骤"Inject environment variables", 将写在配置文件中的变量${IFUT},注入到环境变量里。
这样在"Trigger parameterized build on other projects"就可以直接选择"predefined parameters"方式直接传递变量了。同样的在Job『run_deploy』里就可以直接访问变量${IFUT}了。
原文:https://www.cnblogs.com/junneyang/p/5239480.html

[Jenkins]Job中如何传递自定义变量的更多相关文章

  1. 【持续集成】[Jenkins]Job中如何传递自定义变量

    [Jenkins]Job中如何传递自定义变量 来自dweiwei   2015-06-27 18:37:19|  分类: 自动化测试 |举报 |字号大中小 订阅 用微信  “扫一扫” 将文章分享到朋友 ...

  2. 038-PHP向返回的闭包函数实例中,传递外部变量参数

    <?php # 向返回的闭包函数实例中,传递外部变量参数 # 直接调用将不会输出$txt的内容 function demo(){ $txt = '我爱PHP'; # 1.function()内的 ...

  3. Jenkins 传递自定义的参数

    1.同一个job之间,不同的shell之间传递参数 注意:如果是job参数化构建自定义的参数,可以在job的不同shellj间引用,但是不能改变他的值供后面的shell使用   job在执行时会针对所 ...

  4. 【问题】Asp.net MVC 的cshtml页面中调用JS方法传递字符串变量参数

    [问题]Asp.net MVC 的cshtml页面中调用JS方法传递字符串变量参数. [解决]直接对变量加引号,如: <button onclick="deleteProduct('@ ...

  5. 关于纠正《Hive权威指南》中的结论~“hive在使用set自定义变量时,hivevar命名空间是可选的”~的论证

    背景: 根据<Hive权威指南>上讲,在hive-0.8.0以后可以使用--define key=value命令定义用户自定义的变量以便在Hive脚本中引用.当用户使用这个功能时,Hive ...

  6. Android中intent如何传递自定义数据类型

    转载自:http://www.cnblogs.com/GoAhead/archive/2012/07/16/2593868.html 大家好,好久不见,今天要给大家讲一下Android中Intent中 ...

  7. call_user_func()的参数不能为引用传递 自定义替代方法

    php手册 中关于 请注意,传入call_user_func()的参数不能为引用传递. 关于这个情况的解释,可自己搜索.我们可以自己定义一个函数解决这样的问题,实例如下: <?php ini_s ...

  8. [Android Pro] AIDL进程间传递自定义类型参数

    1.创建.aidl 文件 AIDL 语法简单,用来声明接口,其中的方法接收参数和返回值,但是参数和返回值的类型是有约束的,且有些类型是需要 import,另外一些则无需这样做. AIDL 支持的数据类 ...

  9. 在Qt项目中添加全局宏变量来达到按方案编译的目的

    遇到一个需求,需要根据不同需要编译所需程序,本人采用了在QtCreator中建立不同的构建设置,配合宏的方式来实现: 1.在项目-构建设置中,添加构建配置2.在构建步骤里的qmake中的额外参数一栏填 ...

随机推荐

  1. ORACLE数据库备份与恢复详解

    ORACLE数据库备份与恢复详解 学习过程中的总结,有兴趣不妨看看,如果有不对的地方,高手不要留情!! Oracle的备份与恢复有三种标准的模式,大致分为两 大类,备份恢复(物理上的)以及导入导出(逻 ...

  2. Ajax异步上传在SSM框架中的应用

    最近在做毕业设计,由于毕设中要实现图片上传和视频上传的功能.突然发现原来的Form表单中的file已经满足不了我了,于是在一番折腾之后终于让我找到了一个简便的上传方式.下面来和大家分享一下我的过程. ...

  3. GC垃圾回收理解

    内存的计算 -Xms1G -Xmx2G -Xmn500M -XX:MaxPermSize=64M -XX:+UseConcMarkSweepGC -XX:SurvivorRatio=3, 请问eden ...

  4. 纯CSS3绘制神奇宝贝伊布动画特效

    在线演示       本地下载

  5. java多线程之并发编程

    1.并发不一定比串行更快 因为并发有线程创建和上下文切换的开销 2.java的并发采用内存共享模型 3.单线程中重排序不会影响到结果 但多线程中重排序可能会影响到结果 4.votaile变量 当线程A ...

  6. JDBC2

    1.JDBC连接池 public class JdbcTemplateDemo2 { //Junit单元测试,可以让方法独立执行 //1. 获取JDBCTemplate对象 private JdbcT ...

  7. 多线程编程-- part5.1 互斥锁之公平锁-释放锁

    释放公平锁 1.unlock() unlock()在ReentrantLock.java中实现的,源码如下: public void unlock() { sync.release(1); } 说明: ...

  8. Mac 常用软件

    command+space开启新的一天 窗口管理:Magnet 写代码:Pycharm.vscode.sublime text 虚拟机:VMware Fusion(买不起Parallels Deskt ...

  9. 能ping通某网页,但无法访问网页的处理

    cmd----->netsh  winsock reset 用以重置Winsock目录,是网络环境初始化,解决一些奇怪的问题

  10. Linux工具之netstat

        1.简介   Netstat 命令用于显示各种网络相关信息,如网络连接,路由表,接口状态 (Interface Statistics),masquerade 连接,多播成员 (Multicas ...