Jenkins 进阶篇 - 任务关联
有时候我们的一个任务里面会进行很多的步骤,例如构建一个后端的 Java 服务,可能会有代码静态扫描,静态扫描通过后会打包成 jar 或者 war 文件,打包成功后可能还会对制品进行存档备份,然后可能会制作容器镜像……,这些所有的内容完全可以在一个任务中完成,也可以拆分成多个任务分步骤进行。但是将复杂任务拆分成多个任务后,会有一些附带的其他问题,可能没法很好地利用 Jenkins 的多节点优势,当你的第二个任务要使用第一个任务的工作空间的文件时,你必须要确保这两个任务要在同一个 Jenkins 节点上执行,因为如果两个任务不在同一个节点上运行,但是第二个任务又需要使用第一个任务的工作空间的文件时就会出问题,第二个任务找不到第一个任务的工作空间。
所以若非必要就不要对任务进行拆分,如果要拆分那就要确保关联的任务都在同一个节点运行,或者任务之间没有对工作空间的依赖。对于如何确保关联任务在同一个节点运行,可以使用 Node and Label parameter 插件来实现。接下来就演示关联任务的构建与参数传递。
我们创建两个自由风格的任务,任务 a 和 b 。在做关联任务配置之前我们先安装两个 Jenkins 插件:Parameterized Trigger 和 Node and Label parameter。 Parameterized Trigger 是用于关联任务之间的触发和参数传递, Node and Label parameter 是用于解决关联任务绑定到同一个节点执行。插件安装完成后重启下 Jenkins 服务,用拥有管理权限的 Jenkins 账号访问 http://<jenkins-host>/restart 即可,等待重启完成后开始对两个关联任务进行配置。
创建两个自由风格的任务:
a 任务的配置如下,其中【构建】部分的 shell 命令后面两行先注释屏蔽不执行。同时在【构建】里面增加一个步骤【Trigger/call builds on other projects】用来触发其他任务的构建,填入子任务的名称和要传递给子任务的参数,如果子任务有多个则用英文逗号分隔。
# a任务构建部分增加执行shell命令,内容如下
echo "检查参数:"
echo "release_tag=${release_tag}, target_platform=${target_platform}, run_test=${run_test}"
# echo "Hello Jenkins" >> a.txt
# cat a.txt

b 任务也简单,就接收打印 a 任务传过来的参数值,以及看看 a 任务生成的文件 a.txt 里面的内容,执行的 shell 命令如下,暂时先将最后一行注释掉屏蔽执行。
echo "接收到的参数:"
echo "release_tag=${release_tag}, target_platform=${target_platform}, run_test=${run_test}, parent_workspace=${parent_workspace}"
# cat ${parent_workspace}/a.txt

这样任务 a、b 都配置好了,构建任务 a 成功后会触发任务 b 的执行,当然任务 b 也可以自己单独构建执行,参数内容也是由任务 b 自己掌控填写。
单独构建任务 b,构建时的参数输入和输出的参数信息如下:


现在构建 a 任务,各个参数值如下:

看看构建日志,我们会发现 a 任务是在主节点 master 上执行的,并且构建完成后触发构建了 b 任务:

b 任务的执行日志如下,从日志可以发现 b 任务是由上游任务 a 触发构建,并且是在另一个 Jenkins 节点上执行的,接收到的参数也是从 a 任务传递过来的。

现在我们将 a 、b 任务里面执行 shell 命令后面的文件操作取消注释,让其执行文件操作相关命令:
# a 任务的 shell 命令内容
echo "检查参数:"
echo "release_tag=${release_tag}, target_platform=${target_platform}, run_test=${run_test}"
echo "Hello Jenkins" >> a.txt
cat a.txt
# b 任务的 shell 命令内容
echo "接收到的参数:"
echo "release_tag=${release_tag}, target_platform=${target_platform}, run_test=${run_test}, parent_workspace=${parent_workspace}"
# cat ${parent_workspace}/a.txt
同样的,a 任务执行完后触发了 b 任务,但是 b 任务执行失败了,因为 Jenkins 会根据各个节点的压力负载情况,将任务 a、b 分别在不同的 Jenkins 节点上运行,当 b 任务查看 a 任务工作空间的文件时找不到文件,那么 b 任务就执行失败了。

要解决这个问题就要保证各个关联任务不依赖于各个任务的工作空间的文件,如果关联任务又确实需要依赖工作空间的文件,那就要将任务绑定在同一个节点运行,这就需要用 Node and Label parameter 插件来实现,该插件可以通过一个参数来定义任务要在哪个节点上运行。例如,如果我们的 a 任务在 master 节点上运行了,那么 b 任务就也要在 master 节点上运行,才能正常访问 a 任务工作空间的文件。
我们将 a 任务配置里面【构建】步骤中【Trigger/call builds on other projects】的参数传递配置做下调整,将 a 任务的构建节点名称传给 b 任务,让 b 任务也在同一个节点上运行。
release_tag=${release_tag}
target_platform=${target_platform}
run_test=${run_test}
parent_workspace=${WORKSPACE}
patent_node_name=${NODE_NAME}
然后在 b 任务增加一个 Label 或者 Node 参数,控制任务在哪个节点运行,Label 参数是根据节点标签来匹配节点,而 Node 参数则是根据节点的名称来匹配节点,我这里添加了一个 Label 参数,设置如下:


做好节点绑定参数的设置后我们多次构建 a 任务,看看 a 、b 任务最后的执行日志。




从构建的执行日志上,我们可以看到任务 a、b 是已经绑定在同一个 Jenkins 节点上运行了。另外这一小节使用了一些 Jenkins 内置的环境变量,WORKSPACE 和 NODE_LABELS,还有一些其他的内置环境变量可以浏览器访问 http://<jenkins-host>/env-vars.html 进行查看,这些环境变量可以在任务配置时直接获取使用。

Jenkins 进阶篇 - 任务关联的更多相关文章
- Jenkins 进阶篇 - 数据备份
随着我们的长期使用,Jenkins 系统中的内容会越来越多,特别是一些配置相关的东西,不能有任何丢失.这个时候我们就需要定期备份我们的 Jenkins 系统,避免一些误操作不小心删除了某些重要文件,J ...
- Jenkins 进阶篇 - 节点配置
当我们使用 Jenkins 构建的项目达到一定规模后,一个 Jenkins 服务可能承受不了负载,会导致很多的构建任务堆积,严重的话还会拖垮这台服务器,导致上面的服务无法使用.例如我们公司目前在 Je ...
- Jenkins 进阶篇 - 权限配置
Jenkins的授权策略 Jenkins 默认的授权策略是[登录用户可以做任何事],也就是人人都是管理员,可以修改所有的设置以及构建所有的任务,不用做任何设置,有账号登录到 Jenkins 系统即可, ...
- Jenkins 进阶篇 - 权限案例实践
为了演示方便,我这里创建了如下的一些任务,各个任务由包含在对应的目录中树形结构大概如下: jenkins-authority 目录类型任务 ├── dev-project-group 目录类型任务 │ ...
- Jenkins 进阶篇 - 参数化构建
我们在构建任务时经常会遇到这样的情景,一个任务配置好了以后,在后面的构建过程中,又会修改一些配置.例如,我们构建项目的代码可能是拉取指定的分支或者是Tag进行构建,又或者是在构建是需要指定特定的运行平 ...
- Jenkins 进阶篇 - 单元测试覆盖率
我们做项目开发,肯定免不了要写单元测试,不管是 Java 项目.Python 项目.PHP 项目,甚至是 nodejs 项目,都应该要写单元测试,本小节就来介绍单元测试的覆盖率报告输出和展示,在后面的 ...
- idea 插件的使用 进阶篇
CSDN 2016博客之星评选结果公布 [系列直播]零基础学习微信小程序! "我的2016"主题征文活动 博客的神秘功能 idea 插件的使用 进阶篇(个人收集 ...
- #笔记#JavaScript进阶篇一
#JavaScript进阶篇 http://www.imooc.com/learn/10 #认识DOM #window对象 浏览器窗口可视区域监测—— 在不同浏览器(PC)都实用的 JavaScrip ...
- PHP学习笔记 - 进阶篇(11)
PHP学习笔记 - 进阶篇(11) 数据库操作 PHP支持哪些数据库 PHP通过安装相应的扩展来实现数据库操作,现代应用程序的设计离不开数据库的应用,当前主流的数据库有MsSQL,MySQL,Syba ...
随机推荐
- spring学习06(AOP)
9.AOP 什么是AOP AOP(Aspect Oriented Programming)意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是软 ...
- JavaSE-方法
何谓方法 比如之前用到的 System.out.println(); System为一个类:out为这个类的一个输出对象:println()为这个对象的方法 调用System类中out输出对象的pri ...
- Visio2013安装报错 1935 问题解决
最近安装Visio2013,奈何一直报错,出现1935的错误并且回滚 试了试网上的方法,无论是安装.netframework4.0也好,下载.net修复工具也好,都不行 最后尝试删除一个注册表路径 H ...
- Python数学建模系列(一):规划问题之线性规划
@ 目录 前言 线性规划 样例1:求解下列线性规划问题 scipy库求解 样例2:求解下列线性规划问题 pulp库求解 样例3.运输问题 说明 结语 前言 Hello!小伙伴! 非常感谢您阅读海轰的文 ...
- NOIP 模拟 $17\; \rm 世界线$
题解 \(by\;zj\varphi\) 此题经简单观察可发现,一个点的贡献就是这个点所能到的点减去它的出度 那么我们就可以暴力搜索,但是显然会超时,所以我们可以使用一个黑科技 \(\rm bitse ...
- Centos7上yum安装redis
下载tar包 wget http://download.redis.io/releases/redis-6.0.5.tar.gz 解压tar包 tar -zxvf redis-6.0.5.tar.gz ...
- C++ 矩形交集和并集的面积-离散化
//离散化,x,y坐标分别按从小到大排序 //离散化 //1.首先分离出所有的横坐标和纵坐标分别按升序存入数组X[ ]和Y[ ]中. //2. 设数组XY[ ][ ].对于每个矩形(x1,y1)(x2 ...
- 【IDE】Sublime Text 3 使用配置
1 安装 首先现在安装Sublime Text 3,直接官网下载(http://www.sublimetext.com/3),也可以在其他地方下载,安装完成后进行破解 菜单栏Help - Enter ...
- Failed to start LSB: Bring up/down错误解决方法
很多朋友在使用centos7系统时,有时候需要分配多个IP地址,这就涉及到修改网卡配置,但是在修改完网卡配置时,重启网络服务时会出现"Failed to start LSB: Bring u ...
- python进阶(20) 正则表达式的超详细使用
正则表达式 正则表达式(Regular Expression,在代码中常简写为regex. regexp.RE 或re)是预先定义好的一个"规则字符率",通过这个"规 ...