Jenkins 多分支构建

今天终于搞定了 Jenkins 的多分支构建的配置。

以前在使用 gitlab-ci 时,可以根据不同的分支执行不同的构建,比如 release 分支执行发布到 fir 上的构建,其他分支只执行编译。但因为服务器上的 4G 内存还要跑其他服务,而 gitlab 又是个耗内存大户,经常报 5xx 错误而不得不重启(我后来不得不使用 cron 设置了隔几天自动重启的定时任务)。之后想起了一个 go 开发的 git 托管服务 gogs,于是老大把它给部署上,将项目从 gitlab 上迁移过来。

gogs 没有 gitlab 那样有非常完善的一整套组件,如自动构建需要搭配 jenkins来完成。老大又把 jenkins 给装上,然后让我去配置项目。一番研究之后,算是解决了提交到 gogs 后触发 jenkins 构建的需求,但却有一个问题:
如果项目中的 release 分支和 develop 分支都指向同一个节点,并且都推上去的话,jenkins 在构建时会把它当作是 develop 分支,从而导致没有触发自动构建。这样的话就不得不先推 release 分支,等 jenkins 开始构建后再推 develop 分支,但这样还是不便。
之后就开始研究 Jenkins 的多分支构建,毕竟这才是解决这个问题的正确道理。

多次尝试之后,今天终于摸索成功,过程记录如下:
首先创建一个 Multibranch Pipeline 的任务,具体步骤网络教程较多,这里不作赘述。

然后在项目的分支下新建一个 Jenkinsfile,编写构建规则。Jenkinsfile 使用 groovy 语法,我这里根据需求写了一个很简单的规则,代码如下:

node {
  checkout scm
  echo "current branch: $BRANCH_NAME"
  if (BRANCH_NAME.startsWith("release/")) {
    sh "./gradlew clean -Ppublish assemble -PLOCAL_USERNAME=$LOCAL_USERNAME -PLOCAL_PASSWORD=$LOCAL_PASSWORD"
  } else {
    sh "./gradlew clean assembleTest -PLOCAL_USERNAME=$LOCAL_USERNAME -PLOCAL_PASSWORD=$LOCAL_PASSWORD"
  }
}

这里的 BRANCH_NAME 是内置的变量,值为当前的分支。
当代码提交并且推上去,并触发 Jenkins 对 Multibranch Pipeline 的扫描之后,它会找到有 Jenkinsfile 的分支,并创建对应的 job,然后执行里面的操作(如果已有的分支没有更新则不会执行)。

为了能够让代码推上去就能触发构建,需要到 gogs 上去添加 web hook。我按之前的思路添加了一个 webhook,地址是 jenkins 的 gogs 插件的地址格式,如下:

http://192.168.1.3:8080/gogs-webhook/?job=IOP-Android-Multibranch

测试了一下,能收到并触发构建。
但是在推送一个新的分支时,却发现失败了:
这里写图片描述
原因是 Jenkins 并不存在这个分支的流行线。也就是我们需要触发 Jenkins 对 Multibranch Pipeline 的重新扫描,让它发现这个分支。
于是又去配置触发器。但发现这里只有一种定时触发器可以设置,如下:
这里写图片描述
为了能较快地触发构建,我启用了这里的触发器并把时间设置为 5 分钟。问题能解决。并且 gogs 也不用再去配置 webhook,因此这里当扫描到有更新时也会自己触发构建。

但这仍然不是我想要的,我希望的还是通过 webhook 的方式来实时触发,从下图来看,Multibranch Pipeline 应该是支持这种方式的,但是我却不知道怎么配置这一 url。
这里写图片描述

之后苦寻 google,终于在一条没有被点赞的答案看到了解决之法,地址为:https://stackoverflow.com/a/48444614/2673757 。答案如下:

The easiest option by far (that I’m aware of) is to remotely tell the Jenkins Git plugin that there’s a new commit for a defined repository. However, this will not trigger Jenkins to start a job immediately. What happens is that the Git plugin starts (re-)indexing the specific repository. If changes are detected the Jenkins job is then started.

From your repository (GitHub, GitLab, etc.) you should trigger the following URL:

扫描二维码关注公众号,回复: 2684580 查看本文章

http://my-jenkins-host/git/[email protected]:group/repository.git&delay=0sec

The value for url must match the SCM URL you configured in the Jenkins job (Git plugin)!

Gotcha: it may be that your Jenkins is not deployed under the root context (/) in which case the URL would be http://my-jenkins-host/context-path/git/...

于是回到 gogs 的项目设置上,重新添加 webhook,如下:
这里写图片描述
并触发推送设置一下,然后在 jenkins 上的 Scan Multibranch Pipline Log 上能看到最新的扫描日志,确实是触发了。现在,可以关掉 Jenkins 上的定时扫描的触发器了。

最终总结关键点如下:
1. Jenkinsfile 的简单实现。
2. Multibranch 可以不配置定时扫描的触发器。
3. 由 gogs 的 webhook 来触发 Jenkins,url 的格式为 http://{Jenkins的host}/git/notifyCommit?url={Multibranch Pipeline里面配置的项目地址}

猜你喜欢

转载自blog.csdn.net/maosidiaoxian/article/details/81563991
今日推荐