Jenkins 多分支构建
Posted 浩码农
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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,然后执行里面的操作(如果已有的分支没有更新则不会执行)。
http://192.168.1.3:8080/gogs-webhook/?job=IOP-android-Multibranch
测试了一下,能收到并触发构建。
但是在推送一个新的分支时,却发现失败了:
原因是 Jenkins 并不存在这个分支的流水线。也就是我们需要触发 Jenkins 对 Multibranch Pipeline 的重新扫描,让它发现这个分支。
于是又去配置触发器。但发现这里只有一种定时触发器可以设置,如下:
为了能较快地触发构建,我启用了这里的触发器并把时间设置为 5 分钟。问题能解决。并且 gogs 也不用再去配置 webhook,因此这里当扫描到有更新时也会自己触发构建。
但这仍然不是我想要的,我希望的还是通过 webhook 的方式来实时触发,从下图来看,Multibranch Pipeline 应该是支持这种方式的,但是我却不知道怎么配置这一 url。
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:
http://my-jenkins-host/git/notifyCommit?url=git@gitlab.example.com: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 behttp://my-jenkins-host/context-path/git/...
于是回到 gogs 的项目设置上,重新添加 webhook,如下:
并触发推送设置一下,然后在 jenkins 上的 Scan Multibranch Pipline Log 上能看到最新的扫描日志,确实是触发了。现在,可以关掉 Jenkins 上的定时扫描的触发器了。
最终总结关键点如下:
Jenkinsfile 的简单实现。
Multibranch 可以不配置定时扫描的触发器。
以上是关于Jenkins 多分支构建的主要内容,如果未能解决你的问题,请参考以下文章