深入浅出DevOps:Jenkins构建器
前言
我们从开始学习Jenkins到现在,大家肯定已经尝试了很多次构建项目的过程
但其实我想说的是,大家在构建的时候是不是觉得目前的构建方式比较繁琐:
-
打开浏览器,进入到Jenkins
-
在Jenkins中找到对应的任务
-
然后点击立即构建
这样才能开始构建当前任务,但是如果有这样一种方式,不需要上述繁琐的过程,是不是会比较舒服呢:
-
Jenkins能够自己去GitLab上拉取代码,拉取到代码之后自动执行后续脚本进行构建;
-
或者说当我们将代码提交到GitLab上之后,Jenkins通过某种方式得到通知然后就能执行构建。
别说,这样想想都挺开心的对不对
别急,功能强大的Jenkins早就为我们准备好了一切。这不就要跟大家介绍关于Jenkins的另一大便捷的功能,容我卖个关子,大家继续往下看
构建触发器
image.png触发器是任务配置中的一个核心模块,它实现了我们在上面的一切设想。接下来我们就来好好聊一聊这个触发器
我们挑几种比较常用的触发器来介绍
其他工程构建后触发
如果我们的项目需要依赖其他项目才能正常执行,此时在构建的时候就有一个先后顺序,我们基于该触发器下的配置项进行构建项目,根据我们所设置的关注项目,最终在构建的时候会形成类似责任链模式的长链
image.png这种方式非常简单,就不多介绍
定时构建
定时构建,如其名就是说Jenkins提供类似cron特性的方式来定期执行构建项目。
这种方式我们需要结合公司实际业务思考,如果公司是习惯于像每晚/每周这样定期安排构建的,那么非常适合采用定时构建的触发器,否则就需要慎重
image.png在显示出来的日程表的写入Jenkins支持的定时表达式,Jenkins会根据表达式自动给个提示,显示出下次运行时间,而关于定时表达式的相关内容,我们继续往下看
定时表达式
基本信息
<pre class="hljs vbscript" style="margin: 0px 0px 0.75em; padding: 0.5em; border-radius: 4px; background: rgb(246, 246, 246); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; color: rgb(68, 68, 68); font-size: 14px; line-height: 1.5em; word-break: break-all; word-wrap: break-word; border: none; overflow-x: auto;">MINUTE HOUR DOM MONTH DOW
</pre>
具体来说,每一行由 5 个字段组成,由 TAB 或空格分隔,其中表示:
- MINUTE
一小时内的分钟数 (0–59)
- HOUR
一天中的小时 (0–23)
- DOM
月份中的某天 (1–31)
- MONTH
月份 (1–12)
- DOW
星期(0–7),其中 0 和 7 是星期日
而这里还需要注意的是: H
这是一个负载参数,可以任务是作业名称的散列,理论上可以放到任意位置上,一般在 MINUTE 或者 HOUR 的前面加上 H
这个参数。保证定时调度任务在系统上产生负载,这样能够使任务不会出现在同一时刻,最大限度的使用服务资源。
<pre class="hljs markdown" style="margin: 0px 0px 0.75em; padding: 0.5em; border-radius: 4px; background: rgb(246, 246, 246); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; color: rgb(68, 68, 68); font-size: 14px; line-height: 1.5em; word-break: break-all; word-wrap: break-word; border: none; overflow-x: auto;"># 每隔15分钟执行一次H/15 * * * *
</pre>
进阶
除了这种固定的时间之外,Jenkins提供的定时表达式还提供了范围区间:
<pre class="hljs" style="margin: 0px 0px 0.75em; padding: 0.5em; border-radius: 4px; background: rgb(246, 246, 246); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; color: rgb(68, 68, 68); font-size: 14px; line-height: 1.5em; word-break: break-all; word-wrap: break-word; border: none; overflow-x: auto;">*
M-N
</pre>
<pre class="hljs markdown" style="margin: 0px 0px 0.75em; padding: 0.5em; border-radius: 4px; background: rgb(246, 246, 246); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; color: rgb(68, 68, 68); font-size: 14px; line-height: 1.5em; word-break: break-all; word-wrap: break-word; border: none; overflow-x: auto;"># 每天1~2点,每隔15分钟执行一次H/15 H(1-2) * * *
</pre>
-
M-N/X
或*/X
在指定范围或整个有效范围内按 X 的间隔步进 -
A,B,...,Z
枚举多个值
找几个例子让大家找找感觉,也可以直接在Jenkins中进行测试
<pre class="prettyprint hljs markdown" style="margin: 0px 0px 1.5em; padding: 0.5em; border-radius: 4px; background: rgb(246, 246, 246); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; color: rgb(68, 68, 68); font-size: 14px; line-height: 1.5em; word-break: break-all; word-wrap: break-word; border: none; overflow-x: auto;"># 在5,10,15分的时候执行5,10,15 * * * * # 工作日的0点,3点,6点,每隔10分钟执行一次H/10 0,3,6 * * 1-5
</pre>
任务构建
接下来我们就让我们的任务定时构建一次就每隔2分钟执行一次
Q:为啥不每隔一分钟执行一次?
A:大概Jenkins觉得你们太调皮了,不支持1分钟的调用
<pre class="hljs markdown" style="margin: 0px 0px 0.75em; padding: 0.5em; border-radius: 4px; background: rgb(246, 246, 246); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; color: rgb(68, 68, 68); font-size: 14px; line-height: 1.5em; word-break: break-all; word-wrap: break-word; border: none; overflow-x: auto;">H/2 * * * *
</pre>
准时构建,那么在实际下根据自身需要,合理选择表达式进行构建操作
image.png我这里留了一个配置,让它在零点执行: H(0-1)/1 0 * * *
接下来拭目以待
GitLab webhook
额外说明
这里先插一句,在Jenkins构建器中关于GitLab webhook的方式
image.png默认情况下是不会出现这一选项的,需要额外安装一个插件,虽然在之前也提到过,但是这里还是要多说一句:
image.png在插件管理中需要先将 GitLab Plugin 插件安装上,成功之后才能使用webhook的方式来触发构建
Webhooks
穿插了一个关键点之后,我们继续介绍Webhooks
维基百科:
在web开发过程中的webhook,是一种通过通常的callback,去增加或者改变web page或者web app行为的方法。
这些callback可以由第三方用户和开发者维持当前,修改,管理,而这些使用者与网站或者应用的原始开发没有关联
结合Jenkins来介绍:
- 当我们对GitLab仓库进行操作(提交代码,合并分支)之后,GitLab会向对应配置的接口中发送http请求,Jenkins接收到请求之后会对当前项目作出构建的操作。这样我们就能够实现自动化CI操作,减少部署成本
实操:基于GitLab的Webhooks实现自动化构建
那么接下来我们就开始配置Webhooks,实现自动化构建任务吧
GitLab配置:本地出站请求
首先,由于GitLab版本的升级,会限制本地的出站请求,由于本人在搭建环境的时候将Jenkins和GitLab放到了同一台服务器上,所以需要先在GitLab上对出站请求进行配置
如果环境在多台服务器上,这一步可以省略
当前配置在GitLab位于 Menu>Admin>Settings>Network>
**Outbound requests**
下
勾选图中的两个选项框或者在下方的文本框中输入本地IP和域名都是可以的
为了方便我就勾选了
Jenkins 503配置
由于Jenkins开启了GitLab的身份验证,此时如果直接在GitLab上添加Webhooks的话,无法正确被处理。
这里就需要进入到Jenkins的 系统管理>系统配置
,找到 Gitlab 的位置,并且去掉 Enable authentication for '/project' end-point
的勾选
Jenkins项目配置触发器
image.png进入到项目配置页面中,勾选图中框住的选项,并复制最后的URL地址
GitLab设置Webhooks
进入到 GitLab上该项目页面,从 settings>Webhooks
找到对应的配置页面,将复制到的URL添加到指定的位置中就可以了
此时最下方会出现一条Webhooks的记录,我们可以通过 Test
按钮进行测试,看看是否可以正常运行
测试
直接推送一个事件,看看Jenkins能不能接收到
image.png开始构建的话就说明Webhooks的方式已经构建成功。测试完成,收工。
image.png当前测试通了最后,那么通过git提交代码之后,Jenkins对项目进行构建那也是必然可以正常执行的。
最后
到这里关于Jenkins触发器相关的内容就介绍的差不多了。我们只是列举出几个比较常用的触发器,如果有涉及到需要使用其他触发器的可以自行查看帮助文档。