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 ...
随机推荐
- WPF自定义控件二:Border控件与TextBlock控件轮播动画
需求:实现Border轮播动画与TextBlock动画 XAML代码如下: <Window.Resources> <Storyboard x:Key="OnLoaded1& ...
- iOS开发之HTTP断点续传
前言 在APP中经常会遇到文件下载,鉴于用户体验和流量控制,就需要用到断点续传.本文主要对断点续传进行了多线程封装. 效果图 原理 HTTP实现断点续传是通过HTTP报文头部header里面设置的两个 ...
- 零基础学Java之Java学习笔记(一):Java概述
什么是Java? Java是一门面向对象编程语言,可以编写桌面应用程序.Web应用程序.分布式系统和嵌入式系统应用程序. Java特点有哪些? 1.Java语言吸收了C++语言的各种优点,具有功能强大 ...
- 提取网页的markdown表格利器
在线Markdown表格转换器 markdown表格转换器,蛮好用的.偶然发现的开源工具,推荐一波. 这是目标链接:https://docs.locust.io/en/stable/configura ...
- miniFTP项目实战三
项目简介: 在Linux环境下用C语言开发的Vsftpd的简化版本,拥有部分Vsftpd功能和相同的FTP协议,系统的主要架构采用多进程模型,每当有一个新的客户连接到达,主进程就会派生出一个ftp服务 ...
- ubuntu18.4 与pc notepad++ 使用nppftp
首先在linux上部署 vsftpd 安装过程可能有一些问题.我之前的一个文章有所说明. 然后更改配置文件 vsftpd.conf 最简单是开启匿名登录,有时候还要开启root登录,在user文件里面 ...
- SQL 练习25
查询同名学生名单,并统计同名人数 SELECT sname,COUNT(sname) 同名人数 from Student GROUP BY sname HAVING COUNT(sname)>1
- SQL 练习23
查询男生.女生人数 SELECT Ssex,COUNT(Ssex) 人数 from Student GROUP BY Ssex
- java对xml节点属性的增删改查实现方法
package vastsum; import java.io.File; import java.io.FileWriter; import java.util.Iterator; import o ...
- C#基础知识---装箱与拆箱
一.定义 装箱:将值类型转化为引用类型,装箱一般会在堆上分配一块内存,用于存储要转换的值. 拆箱:将引用类型转化为值类型 注:.NET 2.0 引入的泛型其实在很大的程度上解决了装拆箱产生的类型转换问 ...