前言
本篇文章主要针对jenkins任务定义的触发时机以及构建环境配置进行讲解,其中构建方式的内容也是我们定义jenkins任务中经常会用到的,希望文章的内容对各位读者有所帮助。
想要了解更多Jenkins的信息,可以从本系列的其他文章中进行查看
Jenkins系列(一)——Jenkins的安装和常见配置
Jenkins系列(三)——关于通用配置(General模块)的介绍
一、关于触发时机
(一)触发远程构建
jenkins支持我们通过URL的方式来直接构建脚本,相当于是不需要登录到jenkins的控制台,找到这个job后鼠标点击构建,而是直接访问这个URL来完成触发(当然了,访问的这个过程可以使用脚本来实现,这在一些复杂触发条件下的场景会比较好用)。
勾选触发远程构建
后,会提示我们输入一个身份验证令牌,这样是为了防止非授权用户恶意调用我们的job,一般情况下建议写一个稍微复杂一些的密码,保存后我们就可以通过JENKINS_URL/xxx/{jobName}/build?token=TOKEN_NAME
来直接进行job的触发了 (这里的TOKEN_NAME
指的就是我们配置的令牌)。
如果token输入错误的话,页面还有相对应的提示。
(二)其他项目构建后触发
这种适用于任务和任务之间存在上下级的依赖关系,我们希望我们的任务在另外一个任务执行完成之后再执行,就可以选择使用这个触发时机。
值得一提的是,这个模块还支持我们根据上一个项目的不同执行状态来决定是否继续往下执行。
(三)定期构建(Build periodically)
定期构建是jenkins一个相当常见的触发规则了,jenkins支持我们用cron表达式来配置什么时候来自动触发我们的任务,既然这里提到了cron表达式,我们也在此处对表达式的规则进行简要的说明吧。
cron表达式
Jenkins采用了著名的UNIX任务调度工具CRON所使用的配置方式。用5个字段代表5个不同的时间单位
* * * * * (分 时 日 月 周)
简要案例:
10 * * * * 表示每小时的第10分钟会触发
10 2 1-3 * * 表示每月1-3号的凌晨2点10分会触发
处于简化配置的考量,我们可以用一些特殊符号来简化我们的配置
1. *
号:匹配当前域的任意值
比如说* 0 * * *
就表示每月每天的零点每隔1分钟就触发1次,直到当天1点结束
2. -
:表示连续的区间范围
比如说1-10 0 * * *
就表示每月每天的零点1分到零点10分间每隔1分钟触发一次
3. ,
:表示枚举范围(常用于不连续的区间)
比如说1,5,10 0 * * *
就表示每月每天的零点1分,零点5分和零点10分会触发一次
4. n/m
:表示按指定频次触发
前面的n
表示从n
开始触发,之后每隔m
再触发一次,比如说:2/3 9 * * *
,这里表示从每天九点零2分开始,每隔3分钟触发一次,直到9点59分最后一次触发。不过这里需要注意,虽然cron表达式支持我们这么配置,但是在jenkins中我们是不支持我们这样配置的。
jenkins引入了H
符号的概念来让我们完成类似的操作,比如H/3 15 * * *
表示从每天15时开始,每隔3分钟触发一次。
5. 关于分散负载符号H
的使用
由于jenkins集成了很多个定时任务,如果存在很多定时任务的cron配置相同或者是触发的时间节点相同(或接近)的情况(比如0 0 * * *
),就会给jenkins任务的调度和运行带来较大的压力。因此jenkins引入了符号H
(代表“Hash”,后面用“散列”代替)来解决负载的压力问题。例如:存在十几个日常任务需要在凌晨0点至1点的时间处理,我们可以配置H 0 * * *
,由jenkins来自行在符合时间要求的不同的时间点触发不同的任务,从而进行调度上的负载均衡。
符号H
在一定范围内可被认为是一个随机值,但实际上它是任务名称的一个散列而不是随机函数。符号H
还可用于范围,例如,H H(0-7) * * *
代表凌晨0:00到 上午7:59这一段时间的任意时间触发一次。
注意,对于月的一天字段,由于月的长度变化,像/3或H/3这样的短周期在大多数月的末尾将不一致地工作。 例如,/3将在长月份的第1、4、…31天运行,然后再运行到下个月的第二天。 哈希值总是选择在1-28范围内,因此H/3将在月末产生3到6天的运行间隔。 (较长的周期也会有不一致的长度,但效果可能相对不那么明显。)
6. 其他注意事项
实际上,cron
表达式还支持?
、#
以及其他更加灵活的字符符号来帮助我们进行周期配置,但是实际上jenkins对于cron
表达式并不是完全兼容的,它基本上只支持上文提到的这5点而已。
(四)根据Github钩子函数来触发
如果我们这个项目在github上面进行托管,那么我们可以结合github上面的钩子来实现远程仓库有人push后自动构建任务。
(五)轮询SCM
轮询远程代码仓库(可以是SVN仓库,也可以是公司内部的GIT仓库托管平台),每当有新的提交记录,就触发一次构建操作,这也是不少CICD常见的流水式部署的核心环节。需要注意的事,因为每次轮询都需要Jenkins扫描整个工作空间并使用服务器进行验证,所以这个操作是相对比较有性能开销的,建议是在后续的日程表中根据实际情况配置每次扫描的时间间隔。
从上图中我们可以看到,选择轮询SCM方式支持我们可以日程表,表示每隔多长时间jenkins
帮我们去轮询一下远程仓库当前有没有新的提交记录。在没有配置日程表的情况下,这个任务只会在post commit
钩子函数中进行触发,这种情况下一般是需要我们配合触发远程构建这种方式来实现的,不过个人觉得一般不会两种构建方式都同时使用的,所以这块细节可以不用太过于关注。
二、构建环境
(不同版本的Jenkins
对于这里的配置会有所区别)
Delete workspace before build starts
每次构建前都要删除workspace中的内容,这个用的比较少Mask passwords and regexes (and enable global passwords)
有时候我们的输出中会包含密码等密码信息,如果我们不希望在构建日志中出现密码这些敏感信息的话,可以勾选这个选项,以变量的方式来隐藏密码的输出。当然了,jenkins还支持直接通过正则的方式来过滤出需要脱敏的信息
(这个功能其实是依赖了Mask Passwords Plugin
插件,如果没安装的话应该是用不了这个功能的)Use secret text(s) or file(s)
我们在jenkins中配置了很多凭证,如果你需要在后续的脚本中使用到这些凭证的话,可以勾选这个选项,以变量的方式来引用我们配置的凭证信息。Add timestamps to the Console Output
给Jenkins的构建日志加上时间戳,算是很实用的功能Execute shell script on remote host using ssh
这个选项支持我们在任务构建前后使用ssh命令对其他服务器进行某些命令操作,不过个人是觉得这个命令帮助不是特别大,毕竟有这种需求的话,已经可以通过后续的step配置,或者是定义上下级的job执行顺序来实现。Generate Release Notes
这个功能也用的很少,用于生成发行声明的,如果对构建日志有报告要求的话可以使用应用Ant
为Jenkins准备使用Apache Ant运行构建的环境。注释ant特定的输出以显示已执行的目标。可选地设置Ant和/或JDK安装。