本文首發(fā)于:Jenkins 中文社區(qū)
原文鏈接 作者:baymac
譯者:Donghui Wang
介紹新的 GitLab 分支源插件
新的 GitLab 分支源插件,允許您基于 GitLab 用戶 或 組 或 子組 項目創(chuàng)建任務

GitLab 分支源插件已經走出 beta 階段,并已發(fā)布到 Jenkins 更新中心。 它允許您基于 GitLab 用戶 或 組 或 子組 項目創(chuàng)建任務。 您可以:
- 從 GitLab 用戶/組/子組導入單個項目的分支作為任務(多分支流水線任務)
- 從 GitLab 用戶/組/子組導入所有或部分項目的分支作為任務(GitLab 組任務或 GitLab 文件夾組織)
GitLab 組項目對項目進行掃描, 根據設置的規(guī)則導入流水線任務。 導入項目之后, Jenkins 立即基于 Jenkinsfile 流水線腳本運行任務并且將狀態(tài)通知到 GitLab 流水線狀態(tài)。 這個插件與其他分支源插件不同,它提供了 GitLab 服務器配置,可以在系統(tǒng)配置中配置。 Jenkins 配置即代碼 (JCasC) 也可以用于配置服務器。 要想了解更多關于服務器配置的信息,請參考我之前的博客。
要求
Jenkins - 2.176.2 (LTS)
GitLab - v11.0+
創(chuàng)建任務
要創(chuàng)建多分支流水線任務(使用 GitLab 分支源)或 GitLab 組任務,您必須將 GitLab 個人訪問令牌添加到服務端配置。 憑據用于獲取項目的元數據,并在 GitLab 服務器上設置 hook。 如果令牌具有管理訪問權限,您還可以設置 系統(tǒng) Hook,而 Web Hook 可以從任何用戶令牌設置。
創(chuàng)建多分支流水線任務
轉到 Jenkins > 新建任務 > 多分支流水線 > 添加源 > GitLab 項目

Server- 從下拉菜單中選擇所需的 GitLab 服務器,需要在創(chuàng)建此任務之前進行配置。Checkout Credentials- 如果插件要構建任何私有項目,添加SSHPrivateKey或用戶名/密碼類型的憑據。如果所有的項目都是公開的則不需要檢出憑據。檢出憑據與 GitLab 服務器配置中的憑據(GitLab 個人訪問令牌類型)不同。Owner- 可以是用戶、組或子組。 根據這一點填充Projects字段。Projects- 從下拉菜單中選擇要構建的項目。Behaviours- 這些特性是非常強大的工具,用于配置構建邏輯和構建后邏輯。我們定義了新的特性。您可以在倉庫文檔中看到所有信息。
保存并等待分支索引。您可以從這里自由導航,任務進度顯示在左側。

索引完成后,導入的項目將所有分支、合并請求和標簽列示為任務。

查看每個任務,您會發(fā)現左側有一些操作項:
- 您可以通過選擇
立即構建手動觸發(fā)任務。 - 您可以通過選擇相應的按鈕訪問 GitLab 服務器上的特定分支/合并請求/標簽。

創(chuàng)建 GitLab 組類型任務
轉到 Jenkins > 新建任務 > GitLab Group

您可以注意到,配置非常類似于多分支流水線任務,只是缺少 Projects 字段。 您可以添加在您的 Owner(用戶/組/子組)中所有項目。 表單驗證將與 GitLab 服務器檢查 owner 是否有效。 您可以添加 Discover subgroup project 的特性,該特性允許您發(fā)現組或子組中所有子組的子項目,但此特性不適用于用戶。 在索引時,web hook 在每個項目中創(chuàng)建。 GitLab Api 不支持創(chuàng)建組 web hook,所以這個插件不支持只有 GitLab EE 才支持的特性。
現在可以查看導入的項目,如果需要,可以在每個文件夾上配置不同的設置。

GitLab 流水線狀態(tài)通知
GitLab 從任務排隊的角度得到關于構建狀態(tài)的通知。
- 成功 - 任務成功了
- 失敗 - 任務失敗了并且合并請求還沒準備好合并
- 出錯 - 發(fā)生了意外;例如:Jenkins 任務被終止了
- 等待 - 任務正在構建隊列中等待

關于 GitLab 流水線狀態(tài),有指向相應 Jenkins 任務構建的超鏈接。 要查看流水線階段和控制臺輸出,需要訪問 Jenkins 服務器。 我們也計劃通知管道階段到 GitLab,但它有一些缺點,目前這已得到解決,有未來的計劃添加它作為特性。
您還可以通過從特性列表中選擇 Skip pipeline status notifications 來跳過關于流水線狀態(tài)的 GitLab 通知。
合并請求
實現對項目合并請求的支持具有挑戰(zhàn)性。 第一,MR 有兩種類型,即原始分支和 Fork 的項目分支,因此每個 head 必須有不同的實現。 第二,來自 fork 的 MR 可能來自不可信的源,所以實現了一種新的策略 Trust Members,它允許 CI 僅從具有 Developer/Maintainer/Owner 訪問級別的可信用戶構建 MR。

第三,來自 fork 的 MR 由于 GitLab 的問題不支持流水線狀態(tài)通知,請參考這里。 您可以添加一個特性 Log Build Status as Comment on GitLab ,它允許那您添加一個 sudo 用戶(如果你希望 owner 用戶為空)以在 commit/tag/mr 上對構建結果進行評論。 要添加 sudo 用戶,令牌必須具有管理訪問權限。 默認情況下,只有失敗/出錯以評論的形式被記錄,但是您也可以通過勾選復選框來啟用成功構建的日志記錄。

有時候,合并請求因為外部錯誤而失敗,因此因此您希望通過評論 jenkins rebuild 來觸發(fā) mr 的重新構建。 要啟用該觸發(fā)器,添加特性 Trigger build on merge request comment。 評論內容可以在特性中修改。 出于安全原因,評論者需要有該項目的 Developer/Maintainer/Owner 訪問權限。

Hook
如果在服務器配置中配置了 web hook,則在項目上自動創(chuàng)建 web hook。 請確保 web hook 通過 CSRF 過濾器。 Jenkins 監(jiān)聽 /gitlab-webhook/post 路徑上的 web hook 。 GitLab 上 web hook 在以下事件上被觸發(fā):
Push Event- 當提交或分支被推送時Tag Event- 當新標簽被創(chuàng)建時Merge Request Event- 當合并請求被創(chuàng)建/更新Note Event- 當對合并請求進行評論時
如果令牌具有管理訪問權限,還可以在 GitLab 服務器上設置系統(tǒng) Hook。 在創(chuàng)建新項目時觸發(fā)系統(tǒng) hook,Jenkins 根據配置觸發(fā)新項目的重新掃描,并在其上設置 web hook。 Jenkins 監(jiān)聽 /gitlab-systemhook/post 路徑上你的系統(tǒng) hook。 GitLab 上系統(tǒng) hook 在 Repository Update Events 上被觸發(fā):
你也可以使用 Override Hook Management mode 特性來覆蓋默認你的 hook 管理以及選擇是否要使用不同的上下文(比如 Item)或完全禁用它。

Job DSL 以及 JCasC
你可以使用 Job DSL 來創(chuàng)建任務。 下面有一個 Job DSL 腳本的示例:
organizationFolder('GitLab Organization Folder') {
description("GitLab org folder created with Job DSL")
displayName('My Project')
// "Projects"
organizations {
gitLabSCMNavigator {
projectOwner("baymac")
credentialsId("i<3GitLab")
serverName("gitlab-3214")
// "Traits" ("Behaviours" in the GUI) that are "declarative-compatible"
traits {
subGroupProjectDiscoveryTrait() // discover projects inside subgroups
gitLabBranchDiscovery {
strategyId(3) // discover all branches
}
originMergeRequestDiscoveryTrait {
strategyId(1) // discover MRs and merge them with target branch
}
gitLabTagDiscovery() // discover tags
}
}
}
// "Traits" ("Behaviours" in the GUI) that are NOT "declarative-compatible"
// For some 'traits, we need to configure this stuff by hand until JobDSL handles it
// https://issues.jenkins.io/browse/JENKINS-45504
configure {
def traits = it / navigators / 'io.jenkins.plugins.gitlabbranchsource.GitLabSCMNavigator' / traits
traits << 'io.jenkins.plugins.gitlabbranchsource.ForkMergeRequestDiscoveryTrait' {
strategyId(2)
trust(class: 'io.jenkins.plugins.gitlabbranchsource.ForkMergeRequestDiscoveryTrait$TrustPermission')
}
}
// "Project Recognizers"
projectFactories {
workflowMultiBranchProjectFactory {
scriptPath 'Jenkinsfile'
}
}
// "Orphaned Item Strategy"
orphanedItemStrategy {
discardOldItems {
daysToKeep(10)
numToKeep(5)
}
}
// "Scan Organization Folder Triggers" : 1 day
// We need to configure this stuff by hand because JobDSL only allow 'periodic(int min)' for now
triggers {
periodicFolderTrigger {
interval('1d')
}
}
}
你也可以使用 JCasC 從 Job DSL 腳本直接創(chuàng)建任務。示例請查看該插件倉庫。
如何與我們討論 bug 或新特性?
這個項目使用 Jenkins JIRA 來跟蹤問題。 你可以查看
gitlab-branch-source-plugin組件下面的問題。在開發(fā)者郵件列表中發(fā)送你的郵件。
加入我們的 Gitter channel。
未來的工作
- 積極維護
GitLab 分支源插件并從用戶那里獲取反饋以改進插件的用戶體驗。 - 擴展在 BlueOcean 中對 GitLab 流水線的支持。
資源
感謝 Jenkins 以及 Google 編程夏令營 :)
