使用 Git Hooks 触发 Jenkins 构建任务

使用 Git Hooks 触发 Jenkins 构建任务

使用 Jenkins 构建任务的时候,很多任务需要根据 git 来触发。例如代码 push 到某分支后就触发 Jenkins 的集成测试。

下面介绍几种 Git 触发 Jenkins 的方式。

Git Hooks 触发

Git Hooks,即钩子,关于 Git Hooks 的详细信息,可以看看官方文档

在 Jenkins 的配置页面,勾选 Trigger builds remotely 开启 Jenkins 的远程调用功能。

然后编辑服务器仓库中 jenkins-tutorial.git/hooks 中的 post-update,里面调用这两个链接中的一个即可达到通知 Jenkins 构建任务的目的。该钩子脚本将在代码提交到服务器仓库后执行。

Jenkins 提供的监听方式

在 Jenkins 的 Build Triggers 配置页面,我们可以看到如下的配置项:

Jenkins 可以监听 Github 或者 GitLab 的事件,也可以通过轮询的方式来检查代码是否有更新。

轮询

轮询的方式就是定时去访问 git 仓库,检查是否有更新,这个方式太傻这里就不细说了。

Web Hooks

介绍一下 Jenkins 是怎么监听 Github 和 Gitlab 的吧。

他们主要是通过 Web Hooks 来实现触发的,Github 和 Gitlab 都支持 Webhooks 这个功能,简单来说就是在有更新事件时会调用你配置好的 URL,并把相关的信息 POST 过来。详细可以见文档:Github WebhooksGitlab Webhooks

GitLab 的监听配置

GIthub 的监听比较简单,勾选了就可以,这里不再细说。

Gitlab 的配置选项就比较丰富了。

在勾选了该选项后,我们就得到一个地址,这个地址就是接收 Gitlab 的 Webhooks 用的。去到 Gitlab 的 Webhooks 配置页面填上这个地址就行啦。

批评一下 git.oschina

开源中国提供了个免费的 git 托管服务 https://git.oschina.net/ ,虽然这个服务是基于 Gitlab 框架修改的,但是它居然把 Webhooks 的 post 数据格式给改了。。。
后果就是上文提到的 Gitlab 监听就没用了。。。
所以我们就要自己处理 git.oschina 的 webhooks 了, 坑。
可以考虑写个服务把 git.oschina 的 webhooks 转成 Gitlab 的 webhooks。

使用 Jenkins 给 GIT 自动打 Tag

使用 Jenkins 给 GIT 自动打 Tag

为了方便回滚代码,想给每次 Release 的代码打个 Tag。
希望可以在每次代码提交到 master 分支后就能够自动 tag。

这里介绍下使用 Jenkins 来实现这个自动打 Tag 的功能,主要是通过 GIT Publisher 这个插件来实现的。阅读下文之前,你需要安装好 Jenkins 以及 GIT Publisher 这个插件。

配置 Jenkins

配置 git 仓库的信息

填好仓库地址以及用户名密码

配置 GIT Publisher

配置好 git 仓库信息后,滚动到 Jenkins 的 配置页面最下方,找到 GIT Publisher 这个插件, 开始配置, 你可以看到下图。

点击 “Add Tag”

“Tag to Push”. 这个设置是指本次要打的 Tag 的名称。上图的例子中使用了 “BUILD_ID” 这个 Jenkins 提供的环境变量,最终打出的 Tag 会类似于 TAG-23。

注意:记得勾选 “Create new Tag”。

自定义 Tag 名称

上文提到的 Tag 名称, 类似于 ” TAG-23”,并不能满足我的需求,我希望能使用日期+时间来定义 Tag 的名称,这样看起来就很清晰了,要实现这个,我们需要另一个插件的帮助。
BUILD_TIMESTAMP 这个插件提供一个环境变量,它使用了 Java 的日期 format 格式。安装好这个插件,在 Jenkins 配置页面的顶部可以看到它的配置。

在配置项里填入自己想要的日期格式:yyyyMMdd-HHmmss

然后在 Add Tag 配置里的 “Tag to Push” 项里使用这个环境变量就好啦。

其他功能

GIT Publisher 处理提供 Add Tag 功能,还提供以下两个功能:
Add Branch
Add Note
你可以根据自己的需要进行配置。

触发 Jenkins

上文的设置是没有提到如何在提交代码时触发 Jenkins 的 Build 的,这一块的可以看看这篇文章:
使用-git-hooks-触发-jenkins-构建任务