[Jenkins]Job中如何传递自定义变量

来自dweiwei   2015-06-27 18:37:19|  分类: 自动化测试 |举报 |字号大中小 订阅

用微信  “扫一扫”

将文章分享到朋友圈。

用易信  “扫一扫”

将文章分享到朋友圈。

下载LOFTER 我的照片书  |

 
 
最近在使用jenkins中踩了不少雷。Jenkins作为CI第一大神器,拥有庞大的1058个扩展插件。也许你要的答案就在里面,但是如果没有好好学习,她也可能把你搞的生活无法自理~~理想是丰满的现实是骨干的,由于楼主没有好好学习,本文中用到的一些费劲和曲折方法肯定不是正道!都说真理往往是简捷的,还请路过的大神指点。

 
 
场景一: 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}了。

本次要分享的内容就这么多。

最后有一个槽点: 
为什么jenkins不支持根据条件判断来决定是否触发下一个Project呢?
实际上我最希望的是当ifut=false的时候就直接不触发『run_ut』,『run_ut』不被触发也就省去了不少无用功。
 
参考资料:
 

【持续集成】[Jenkins]Job中如何传递自定义变量的更多相关文章

  1. [Jenkins]Job中如何传递自定义变量

    场景一: Job构建步骤间的变量传递 Jenkins提供了数十种构建方式,我们以最常用的『Execute shell』为例.有时为了使Job中的复杂的构建流程更加清晰我们配置多个构建步骤像下面这样.图 ...

  2. 持续集成Jenkins+sonarqube部署教程

    1 引言 1.1 文档概要 本文主要介绍jenkins,sonar的安装与集成,基于ant,maven构建.用一个例子介绍jenkins的编译打包部署,代码检查.最后集成jenkins.(现阶段只是简 ...

  3. 这些年我们一起搞过的持续集成~Jenkins+Perl and Shell script

    这些年我们一起搞过的持续集成~Jenkins+Perl and Shell script ##转载注明出处:http://www.cnblogs.com/wade-xu/p/4378224.html ...

  4. 自动化持续集成Jenkins

    自动化持续集成Jenkins 使用Jenkins配置自动化构建http://blog.csdn.net/littlechang/article/details/8642149 Jenkins入门总结h ...

  5. 持续集成:TestNG中case之间的关系

    持续集成:TestNG中case之间的关系   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询qq: ...

  6. 持续集成~Jenkins构建GitHub项目的实现

    有了前两讲的基础,这回我们就可以把github上的项目做到CI(jenkins)里了,让它自动去集成部署,持续集成~Jenkins里的NuGet和MSBuild插件,持续集成~Jenkins里的pow ...

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

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

  8. 第三章 持续集成jenkins工具使用之邮件配置

    1   Email Extension Plugin插件安装 持续集成很重要的一环就是及时将构建结果通知到对应的责任人,如:构建失败了,至少需要下发通知给造成本次构建失败的开发人员,如果包含自动化测试 ...

  9. 1.jenkins持续集成-jenkins安装

    1.为什们要使用jenkins Jenkins是基于Java开发的一种持续集成工具,用于监控持续重复的工作,功能包括: 1.持续的软件版本发布/测试项目; 2.监控外部调用执行的工作. 2.安装jen ...

随机推荐

  1. overlay-scrollbar-js

    function doAccept() { var div = $('#shadowbox .legal-gate-cont') var con = $('#shadowbox .html') var ...

  2. BZOJ SCOI2005骑士精神

    裸IDA*,ans从1到15循环来限制搜索深度. #include<cstdio> #include<cstring> #include<algorithm> us ...

  3. C#中File类的文件操作方法详解

    File类,是一个静态类,主要是来提供一些函数库用的.静态实用类,提供了很多静态的方法,支持对文件的基本操作,包括创建,拷贝,移动,删除和打开一个文件.File类方法的参量很多时候都是路径path.F ...

  4. 【CodeForces 621C】Wet Shark and Flowers

    题 There are n sharks who grow flowers for Wet Shark. They are all sitting around the table, such tha ...

  5. html5中Canvas为什么要用getContext('2d')

    HTML DOM getContext() 方法 HTML DOM Canvas 对象 定义和用法 getContext() 方法返回一个用于在画布上绘图的环境. 语法 Canvas.getConte ...

  6. Oracle导出数据结构和数据表的方法

    1.PLSQL导出数据结构(数据表.序列.触发器.函数.视图) 1)在左侧 点击tables 2)Tools-->Export User Objects 3)红色1 是你要选择导出的表,红色2 ...

  7. 【BZOJ-1452】Count 树状数组 套 树状数组

    1452: [JSOI2009]Count Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1769  Solved: 1059[Submit][Stat ...

  8. BZOJ-1800 飞行棋 数学+乱搞

    这道题感觉就是乱搞,O(n^4)都毫无问题 1800: [Ahoi2009]fly 飞行棋 Time Limit: 10 Sec Memory Limit: 64 MB Submit: 1172 So ...

  9. BZOJ-1008 越狱 数论快速幂

    1008: [HNOI2008]越狱 Time Limit: 1 Sec Memory Limit: 162 MB Submit: 6192 Solved: 2636 [Submit][Status] ...

  10. Project facet Java version 1.8 is not supported解决记录

    一看知道是因为jdk版本不一致所导致,如何解决? 方法一: 选中项目 Properties , 选择 Project Facets,右击选择 Java , Change Version  方法二: 在 ...