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 ...
随机推荐
- 一个工业级、跨平台、轻量级的 tcp 网络服务框架:gevent
前言 作为公司的公共产品,经常有这样的需求:就是新建一个本地服务,产品线作为客户端通过 tcp 接入本地服务,来获取想要的业务能力.与印象中动辄处理成千上万连接的 tcp 网络服务不同,这个本地服务是 ...
- Redis 实战篇:巧用Bitmap 实现亿级海量数据统计
在移动应用的业务场景中,我们需要保存这样的信息:一个 key 关联了一个数据集合. 常见的场景如下: 给一个 userId ,判断用户登陆状态: 显示用户某个月的签到次数和首次签到时间: 两亿用户最近 ...
- 狂神说SpringBoot02:运行原理初探
狂神说SpringBoot系列连载课程,通俗易懂,基于SpringBoot2.2.5版本,欢迎各位狂粉转发关注学习. 微信公众号:狂神说(首发) Bilibili:狂神说Java(视频) 未经作 ...
- 刷题-力扣-264. 丑数 II
264. 丑数 II 题目链接 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/ugly-number-ii/ 著作权归领扣网络所有.商业转载请 ...
- MySQL 5.7新特性介绍
本文是基于MySQL-5.7.7-rc版本,未来可能 还会发生更多变化. 1.即将删除的特性1.1.InnoDB monitoring features,详见:WL#7377(访问地址:http:// ...
- 基于SigalR实现的奥运会实时金牌榜
系统架构 三端 winform 后台数据管理 + Asp.Net Mvc 前台数据展示 + Xamarin.Forms 移动端跨平台APP 因为本人的代码水平一般,期间遇到了一些问题,如signalR ...
- Android中TextView和EditView常用属性设置
Android中TextView和EditView常用属性设置 点击跳转
- vue 输入框禁止输入空格 ,只能输入数字,禁止输入数字
正则表达式: @input="form.userName = form.userName.replace(/\s+/g,'')" ( 禁止输入空格) @input=&q ...
- spring boot 系列之七:SpringBoot整合Mybatis
springboot已经很流行,但是它仍需要搭配一款ORM框架来实现数据的CRUD,之前已经分享过JdbcTemplete和JPA的整合,本次分享下Mybatis的整合. 对于mybatis的使用,需 ...
- Redis详解(一)——
Redis详解1 https://www.cnblogs.com/MoYu-zc/p/14985250.html https://www.cnblogs.com/xiaoxiaotank/p/1498 ...