介紹新的 GitLab 分支源插件

本文首發(fā)于:Jenkins 中文社區(qū)

原文鏈接 作者:baymac

譯者:Donghui Wang

介紹新的 GitLab 分支源插件

新的 GitLab 分支源插件,允許您基于 GitLab 用戶子組 項目創(chuàng)建任務

gitlab_and_jenkins

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 項目

GitLab Project Branch Source
  • Server - 從下拉菜單中選擇所需的 GitLab 服務器,需要在創(chuàng)建此任務之前進行配置。

  • Checkout Credentials - 如果插件要構建任何私有項目,添加 SSHPrivateKey用戶名/密碼 類型的憑據。如果所有的項目都是公開的則不需要檢出憑據。檢出憑據與 GitLab 服務器配置中的憑據(GitLab 個人訪問令牌 類型)不同。

  • Owner - 可以是 用戶、子組。 根據這一點填充 Projects 字段。

  • Projects - 從下拉菜單中選擇要構建的項目。

  • Behaviours - 這些特性是非常強大的工具,用于配置構建邏輯和構建后邏輯。我們定義了新的特性。您可以在倉庫文檔中看到所有信息。

保存并等待分支索引。您可以從這里自由導航,任務進度顯示在左側。

Multibranch Pipeline Job Indexing

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

Multibranch Pipeline Job Folder

查看每個任務,您會發(fā)現左側有一些操作項:

  • 您可以通過選擇 立即構建 手動觸發(fā)任務。
  • 您可以通過選擇相應的按鈕訪問 GitLab 服務器上的特定分支/合并請求/標簽。
Build Actions

創(chuàng)建 GitLab 組類型任務

轉到 Jenkins > 新建任務 > GitLab Group

GitLab Folder Organization

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

現在可以查看導入的項目,如果需要,可以在每個文件夾上配置不同的設置。

GitLab Group Folder

GitLab 流水線狀態(tài)通知

GitLab 從任務排隊的角度得到關于構建狀態(tài)的通知。

  • 成功 - 任務成功了
  • 失敗 - 任務失敗了并且合并請求還沒準備好合并
  • 出錯 - 發(fā)生了意外;例如:Jenkins 任務被終止了
  • 等待 - 任務正在構建隊列中等待
GitLab Pipeline Status

關于 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。

Trusted Member Strategy

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

Build Status Comment Trait

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

Merge request build trigger

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)或完全禁用它。

Override Hook Management

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 或新特性?

未來的工作

  • 積極維護 GitLab 分支源插件 并從用戶那里獲取反饋以改進插件的用戶體驗。
  • 擴展在 BlueOcean 中對 GitLab 流水線的支持。

資源

感謝 Jenkins 以及 Google 編程夏令營 :)

?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容