如果您正在尋找一個基于拉取請求或分支的自動化 Jenkins 持續集成和交付 (CI/CD) 流水線,本指南將幫助您全面了解如何使用 Jenkins 多分支流水線實現它。
Jenkins 的多分支流水線是設計 CI/CD 工作流的最佳方式之一,因為它完全基于 git(源代碼管理)的流水線即代碼。本指南將討論 Jenkins 多分支流水線設置中涉及的所有關鍵概念。
多分支流水線是如何工作的?
我將帶您了解一個基于 git-flow 的基本構建和部署工作流程,以便更好地理解多分支流水線。本例中提供的分支策略僅供參考。
假設我想要一個 Jenkins 流水線來構建和部署一個應用程序,并滿足以下條件。
- 應用程序倉庫有兩個分支(主分支和開發分支)。
- 開發從開發人員分叉應用程序倉庫并在分叉的倉庫中創建一個分支開始。開發人員將代碼提交到功能分支。代碼在本地測試完畢并準備好集成后,他們將從分叉的倉庫向主倉庫的開發分支提交一個 PR。
- 每當開發人員從分叉倉庫的功能分支向開發分支提交 PR 時,Jenkins 流水線都會觸發合并源分支和目標分支的操作??,然后運行單元測試和靜態代碼分析。我們稱之為 PR 構建。
- 代碼通過 PR 構建中的測試后,開發人員或審閱者將 PR 合并到開發分支。
- 代碼合并到開發分支后,應該觸發一個流水線,該流水線將運行相關測試并將代碼部署到相關環境(例如,開發、質量保證等)。
- 當代碼準備好發布時,開發人員會從開發分支向主分支提交 PR。這將觸發一個 PR 構建流水線,該流水線將合并源分支和目標分支、運行單元測試、執行代碼分析、構建工件(Docker 鏡像、jar 文件等)、進行漏洞測試等。
- 如果測試通過,PR 將被審核并合并到主分支。
- 合并完成后,Jenkins 應該觸發一個構建,該構建將編譯代碼、創建發布工件并將其部署到暫存環境和預生產環境。
從以上情況可以看出,Jenkins 作業無需手動觸發,每當有分支的拉取請求時,流水線都需要自動觸發并運行該分支所需的步驟。
此工作流程為工程師構建了良好的反饋循環,避免了依賴 DevOps 團隊在非生產環境中進行構建和部署。
開發人員可以在 Github 上查看構建狀態,并決定下一步操作。
此工作流程可以通過 Jenkins 多分支流水線輕松實現。
下圖展示了上述示例構建過程的多分支流水線工作流程。
多分支流水線的工作原理如下。
- 當開發者從 fork 倉庫的功能分支創建 PR 以開發分支時,Github 會向 Jenkins 發送一個包含 PR 信息的 Webhook。
- Jenkins 接收 PR 并找到相關的多分支流水線,然后自動創建 PR 構建流水線。然后,它會按照 Jenkinsfile 中提到的步驟運行作業。在簽出 (checkout) 期間,PR 中的源分支和目標分支會被合并。PR 合并將在 Github 上被阻止,直到 Jenkins 返回構建狀態(如果已配置 Github 規則集)。
- 構建完成后,Jenkins 會將狀態更新為 Github PR。現在,您可以合并代碼了。如果您想查看 Jenkins 構建日志,可以在 PR 狀態中找到 Jenkins 構建狀態和日志鏈接(如果已配置 Github App forJenkins)
首先,在使用多分支流水線之前,我使用了一個簡單的流水線,并結合了 GitHub Webhook。
我遇到的問題是,我團隊的項目使用 Git 工作流作為開發分支,當我或我的團隊推送或合并 PR 時,Webhook 會向我的 Jenkins 流水線發送請求,無論哪個分支,該請求都會立即啟動工作。因此,多分支流水線可以幫助解決這個問題。
多分支流水線 Jenkinsfile
在開始實現之前,讓我們先看一下可以在流水線中使用的多分支流水線 Jenkins 示例 Jenkinsfile。
要使多分支流水線正常工作,您需要在 SCM 倉庫中擁有 Jenkinsfile。
如果您正在學習/測試,可以使用下面提供的多分支流水線 Jenkinsfile。它包含一個檢出階段和其他虛擬階段,用于回顯消息。
注意:將代理標簽 agent-01 替換為您的 Jenkins 代理名稱。
pipeline {agent {node {label 'agent-01'}}options {buildDiscarder logRotator( daysToKeepStr: '16', numToKeepStr: '10')}stages {stage('Cleanup Workspace') {steps {cleanWs()sh """echo "Cleaned Up Workspace For Project""""}}stage('Code Checkout') {steps {checkout([$class: 'GitSCM', branches: [[name: '*/main']], userRemoteConfigs: [[url: 'https://github.com/spring-projects/spring-petclinic.git']]])}}stage('Unit Testing') {steps {sh """echo "Running Unit Tests""""}}stage('Code Analysis') {steps {sh """echo "Running Code Analysis""""}}stage('Deploy To Dev & QA') {when {branch 'develop'}steps {sh """echo "Building Artifact for Dev Environment""""sh """echo "Deploying to Dev Environment""""sh """echo "Deploying to QA Environment""""}}stage('Deploy To Staging and Pre-Prod Code') {when {branch 'master'}steps {sh """echo "Building Artifact for Staging and Pre-Prod Environments""""sh """echo "Deploying to Staging Environment""""sh """echo "Deploying to Pre-Prod Environment""""}}}
}
創建多分支流水線
?
步驟 1:在 Jenkins 主頁創建一個“新項目”。
Jenkins 新項目 - 多分支
步驟 2:從選項中選擇“多分支流水線”,然后點擊“確定”。
步驟 3:點擊“添加源”,然后選擇 Github。
步驟 4:在“憑據”字段下,選擇 Jenkins,并使用您的 Github 用戶名和密碼創建憑據。
步驟 5:選擇已創建的憑據,并提供您的 Github 倉庫以驗證憑據,如下所示。驗證多分支流水線憑據
步驟 6:在“行為”下,選擇符合您需求的選項。您可以選擇發現倉庫中的所有分支,也可以僅發現包含拉取請求的分支。
您可以從“添加”按鈕中選擇其他行為。
例如,如果您選擇不發現代碼庫中的所有分支,則可以選擇正則表達式或通配符方法來發現代碼庫中的分支,如下所示。
步驟 7:如果您選擇為 Jenkinsfile 設置不同的名稱,可以在構建配置中指定。
在“腳本路徑”選項中,您可以提供所需的名稱。請確保 Jenkinsfile 存在于代碼庫中,并且名稱與您在流水線配置中提供的名稱相同。
另外,啟用“丟棄舊構建”以僅保留所需的構建日志,如下所示。
步驟 8:保存所有作業配置。
Jenkins 會根據我們的配置掃描已配置的 Github 倉庫,查找所有分支和 PR 請求。
下圖展示了掃描三個分支的作業。由于我尚未發起任何拉取請求,因此 Jenkins 不會創建任何基于分支的流水線。我將演示如何在設置 Webhook 后測試自動創建流水線。
步驟1: 登錄github, 找到repo,點擊設置,添加webhook,輸入你的jenkins 的URL
您應該會在成功的 Webhook 配置上看到一個綠色勾號,如下所示。Jenkins - Github Webhook 交付成功
如果您沒有看到綠色勾號或警告標志,請點擊 Webhook 鏈接,向下滾動到“最近交付”,然后點擊最后一個 Webhook。您應該能夠通過狀態代碼查看 Webhook 交付失敗的原因。
現在,我們已經完成了多分支流水線所需的所有配置。下一步是測試多分支流水線工作流觸發器。
測試多分支流水線
我使用的這個倉庫有兩個分支:main 和 develop。
更新 develop分支中 README 文件的部分內容,并向 main 提交 PR。您也可以從 fork 的倉庫中執行此操作。
它會向 Jenkins 發送一個 Webhook,并為提交的 PR 創建流水線并開始構建。
現在,如果您檢查 Jenkins,您會在 Jenkins 中找到一個用于 PR 的流水線,如下所示。
如果構建失敗,您可以將更改提交到開發分支,只要 PR 處于打開狀態,它就會觸發 PR 流水線。
我在 Jenkinfile 中添加了一個條件:如果分支是開發分支,則跳過部署階段;如果是 PR 構建分支,則跳過主分支。您可以在 Jenkins 構建階段中檢查這一點。如果您檢查這些階段,可以清楚地看到跳過的部署階段,如下所示。
啟用拉取請求狀態檢查
在多分支流水線中,您可以啟用狀態檢查。這意味著 Jenkins 會將結果以狀態檢查的形式報告給 GitHub。它會顯示在 PR 頁面上,如下所示。
例如,開發人員可能需要進行以下狀態檢查。
常見的狀態檢查可能包括:
- 構建驗證
- 單元測試
- 代碼風格檢查
- 安全掃描
要在 Github PR 中啟用這些狀態檢查,您需要創建一個適用于 Jenkins 的 Github App。
您可以按照 Github App for Jenkins 詳細指南進行創建。
然后在多分支流水線配置中,您需要使用 Github App 憑據,而不是用戶名和密碼。