引子
當(dāng)前大部分公司的代碼管理業(yè)務(wù)流使用merge requests方式,當(dāng)功能開(kāi)發(fā)完成之后由開(kāi)發(fā)發(fā)起merge requests將代碼合入主干分支。
Jenkins的SCM可以監(jiān)控git某個(gè)分支的狀態(tài),如果分支上有新的代碼上傳則可以觸發(fā)任務(wù)。
用此種方式如果任務(wù)失敗執(zhí)行失敗,開(kāi)發(fā)修改代碼之后需要再次去提交merge請(qǐng)求。如果我們能在merge請(qǐng)求時(shí)候觸發(fā)Jenkins任務(wù)則可以大大減少這種情況。
此文介紹使用Jenkins的Gitlab插件和Gitlab的Webhook在merge請(qǐng)求中觸發(fā)Jenkins任務(wù)(代碼靜態(tài)檢查)并在請(qǐng)求中備注狀態(tài)的一種實(shí)踐。
前提環(huán)境
- Gitlab 12.9.2-ee
- Jenkins 2.235.5
- Sonar 7.9.4.35981
- GitLab Plugin 1.5.13
配置
- Jenkins中配置Gitlab權(quán)限,該用戶權(quán)限需要為Developer或Maintainer。其他權(quán)限不能上傳pipline狀態(tài)(該權(quán)限可單獨(dú)設(shè)置,可找管理員確認(rèn))。
- Jenkins中創(chuàng)建freestyle任務(wù)(pipeline官方插件提示git merge支持不完整)
- 輸入git地址,如:git@your.gitlab.server:gitlab_group/gitlab_project.git,在高級(jí)設(shè)置中輸入Name為origin,Refspec為+refs/heads/:refs/remotes/origin/ +refs/merge-requests//head:refs/remotes/origin/merge-requests/
- 設(shè)置Branch Specifier屬性,如果項(xiàng)目為單一代碼庫(kù)工作流,輸入origin/
{gitlabMergeRequestIid}
- 在附加選項(xiàng)中添加Merge before build,其中Name設(shè)置為origin,Branch to merge設(shè)置為${gitlabTargetBranch}
- 設(shè)置觸發(fā)器為Build when a change is pushed to GitLab。選擇觸發(fā)事件為Opened merge requests和comments
- 去gitlab頁(yè)面設(shè)置webhook,其中url在上述第六步會(huì)提示,token也在第六步高級(jí)選型里面生成的,去除SSL驗(yàn)證的勾選,保存并測(cè)試webhook可以正確發(fā)送
- 在build中添加靜態(tài)代碼檢查工具,如現(xiàn)在項(xiàng)目用的Sonar(其配置自行上網(wǎng)搜索)
- 在構(gòu)建后操作中添加Publish build status to GitLab,該功能可上傳pipeline狀態(tài)到gitlib。
其他設(shè)置
- 如需添加評(píng)論信息在gitlib,可添加Add a note to merge requests到構(gòu)建后操作中
- 如需添加投票信息到gitlib,可添加Add Vote for build status on merge requests
- 如需讓構(gòu)建失敗的提交不能合入可在gitlab設(shè)置中開(kāi)啟“Pipelines must succeed”選項(xiàng)
常見(jiàn)問(wèn)題
- merge請(qǐng)求中查看不到pipeline狀態(tài)
確認(rèn)Jenkins中使用的gitlib賬戶的權(quán)限,同時(shí)在項(xiàng)目設(shè)置中查看pipeline權(quán)限。
- 怎樣重新運(yùn)行檢查
因?yàn)樯鲜雠渲弥刑砑恿薱omment觸發(fā),可在merge請(qǐng)求中添加備注“jenkins please retry a build”再次觸發(fā)構(gòu)建。
- Gitlib中找不到webhook設(shè)置
需要登錄賬戶的權(quán)限為Maintainer。