在 Jenkins 持續整合流程中,經常需要從 GitLab 或 GitHub 等版本控制系統存取程式碼。本文將詳細說明如何設定 Jenkins,使用 API 認證方式安全地存取這些儲存函式庫,並搭配 Maven 進行建置佈署。同時,也將介紹如何使用 Jenkinsfile 以程式碼管線方式管理建置流程,提升自動化效率。此方法避免直接儲存密碼於 Jenkins 設定中,提升安全性。設定流程包含建立使用者名稱與 API 權杖的憑證,並於建置設定中選擇對應的憑證。後續將說明如何設定 Git 分支、Maven 建置目標以及修改 pom.xml 中的版本號。最後,文章將示範如何提交變更並觸發 Jenkins 建置,並進一步探討 Jenkinsfile 的使用,包含指令碼語法與宣告語法的比較,以及 Jenkinsfile 的優點與最佳實踐,幫助讀者更有效率地管理 CI/CD 流程。

Jenkins 與 GitLab/GitHub 整合:使用 API 認證存取儲存函式庫

在 Jenkins 中,若要使用 API 認證存取 GitLab 或 GitHub 儲存函式庫,需要建立一個憑證專案。這個憑證專案的型別應為「使用者名稱與密碼」,而非「秘密鑰字」。秘密鑰字通常用於不需要提供使用者名稱的情況下。但是,若要存取 GitLab 或 GitHub 儲存函式庫,則需要提供使用者名稱。若您想要使用 API 權杖進行存取,則需要在使用者名稱和 API 權杖中使用您的登入密碼。

步驟 1:建立憑證專案

  1. 點選「新增」按鈕以新增新的憑證專案。
  2. 從「憑證」欄位的下拉選單中選擇剛剛建立的憑證專案。

步驟 2:設定 Git 儲存函式庫分支

  1. 在「Branch Specifier」欄位中輸入 master,因為您正在使用 master 作為 Git 儲存函式庫的主要分支。

步驟 3:新增建置步驟

  1. 向下滾動頁面以新增建置步驟。
  2. 點選「新增建置步驟」下拉選單並選擇「Invoke top-level Maven targets」選項。
  3. 選擇「Maven Version」下拉選單中的「MyMaven」選項。這應該是您在「Global Tools Configuration」頁面中組態的 Maven 設定名稱。
  4. 在「Goals」欄位中輸入 Deploy
  5. 點選「儲存」按鈕。

步驟 4:修改 pom.xml 中的版本

<groupId>Pranodayd</groupId>
<artifactId>CalculatorAPI</artifactId>
<version>8.0</version>

步驟 5:提交變更至本地儲存函式庫並推播至中央 GitLab 儲存函式庫

  1. 開啟命令提示符並使用 cd 命令進入專案目錄。
  2. 使用以下命令將變更新增到暫存區:
    git add.
    
  3. 使用以下命令提交變更至 master 分支:
    git commit -m "Changing version in pom.xml"
    
  4. 使用以下命令將變更推播至中央 GitLab 儲存函式庫:
    git push
    

執行自由式工作

存取 GitLab 儲存函式庫使用 API 權杖的自由式工作執行方式與之前相同。您可以前往儀錶板並點選時鐘圖示以啟動建置。建置完成後,您將可以在主控臺輸出中看到結果,例如 CalculatorAPI-8.0 JAR 檔案已釋出至 Nexus 儲存函式庫。

圖表翻譯:

  graph LR
    A[建立憑證專案] --> B[設定 Git 儲存函式庫分支]
    B --> C[新增建置步驟]
    C --> D[修改 pom.xml 中的版本]
    D --> E[提交變更至本地儲存函式庫並推播至中央 GitLab 儲存函式庫]
    E --> F[執行自由式工作]

內容解密:

上述流程描述瞭如何在 Jenkins 中使用 API 認證存取 GitLab 或 GitHub 儲存函式庫。首先,需要建立一個憑證專案,並選擇正確的憑證型別。然後,設定 Git 儲存函式庫分支,並新增建置步驟。在建置步驟中,需要選擇正確的 Maven 版本和目標。接下來,需要修改 pom.xml 中的版本,並提交變更至本地儲存函式庫並推播至中央 GitLab 儲存函式庫。最後,執行自由式工作以檢視結果。

瞭解程式碼管線(Jenkinsfile)

在熟悉Jenkins管線概念後,您將學習如何在Jenkins UI外部撰寫管線,使用稱為Jenkinsfile的檔案。這被稱為程式碼管線。

什麼是Jenkinsfile?

Jenkinsfile是一個包含管線指令碼程式碼的文字檔。它與應用程式的原始程式碼一起存放在原始碼倉函式庫中。這個檔案可以使用指令碼語法(Groovy指令碼)或描述性語法(DSL)實作。

程式碼管線的優點

在Jenkinsfile中撰寫管線並覆寫Jenkins UI具有以下優點:

  • 您可以為所有分支建立管線,並使用單一Jenkinsfile執行提取請求。
  • 您可以像審查應用程式原始程式碼一樣審查Jenkinsfile中的程式碼。
  • 將管執行緒式碼寫入單獨的檔案並檢查到版本控制系統(如SVN、Git等)中,允許您跟蹤對建置過程進行的定期更改。
  • Jenkinsfile作為管執行緒式碼的單一來源,可以在多個開發人員之間分享。
  • 如果應用程式開發人員已對應用程式原始程式碼進行了更改,需要在建置過程中實施該更改,則同一開發人員可以在Jenkinsfile中實施建置過程更改。

在Jenkinsfile中撰寫管線

pipeline {
    agent any
    stages {
        stage('Build') {
            steps {
                sh 'make build'
            }
        }
        stage('Test') {
            steps {
                sh 'make test'
            }
        }
        stage('Deploy') {
            steps {
                sh 'make deploy'
            }
        }
    }
}

內容解密:

上述Groovy指令碼定義了一個具有三個階段的管線:建置、測試和佈署。每個階段都有一個步驟,該步驟執行一個shell命令以執行建置、測試或佈署。agent any指定管線可以在任何可用的代理上執行。

Jenkinsfile的優點

使用Jenkinsfile具有多個優點,包括:

  • 版本控制:Jenkinsfile可以存放在版本控制系統中,允許您跟蹤對管執行緒式碼進行的更改。
  • 程式碼審查:Jenkinsfile可以像應用程式原始程式碼一樣進行審查,確保管執行緒式碼是正確和高效的。
  • 重用:Jenkinsfile可以在多個專案中重用,減少重複工作並提高生產力。

Jenkinsfile的最佳實踐

以下是使用Jenkinsfile的一些最佳實踐:

  • 保持簡單:盡量保持Jenkinsfile簡單易懂。
  • 使用版本控制:將Jenkinsfile存放在版本控制系統中,以跟蹤更改並與團隊成員合作。
  • 測試和驗證:徹底測試和驗證Jenkinsfile,以確保它按預期工作。

圖表翻譯:

  graph LR
    A[Jenkinsfile] -->|包含|> B[管線指令碼]
    B -->|定義|> C[建置階段]
    C -->|執行|> D[shell命令]
    D -->|產生|> E[建置結果]

圖表翻譯:

上述Mermaid圖表顯示了Jenkinsfile、管線指令碼、建置階段、shell命令和建置結果之間的關係。Jenkinsfile包含管線指令碼,管線指令碼定義建置階段,建置階段執行shell命令,shell命令產生建置結果。

Jenkinsfile 中的 Pipeline 實踐

在本文中,您將學習如何在 Jenkinsfile 中撰寫 Pipeline。Jenkinsfile 中的 Pipeline 可以使用指令碼語法(Scripted Syntax)或宣告語法(Declarative Syntax)撰寫。在之前的章節中,您已經學習瞭如何使用指令碼語法撰寫 Jenkins Pipeline,本章將實作使用宣告語法撰寫 Jenkinsfile。

指令碼語法 vs 宣告語法

在開始實作宣告語法 Pipeline 之前,讓我們先了解指令碼語法和宣告語法之間的差異:

  • 宣告語法是 Jenkins 中的一個相對新功能。
  • 指令碼 Pipeline 是撰寫 Pipeline 程式碼的一種傳統方式。
  • 指令碼 Pipeline 使用更嚴格的 Groovy 基礎語法。
  • 宣告 Pipeline 被引入以提供更簡單和更有選擇性的 Groovy 語法。
  • 指令碼 Pipeline 被定義在一個叫做節點(node)的區塊中。
  • 宣告 Pipeline 被定義在一個叫做 Pipeline 的區塊中。

建立 Jenkins 工作以執行 Jenkinsfile

讓我們建立一個 Pipeline 工作,以執行 CalculatorAPI 的建置過程。與您之前為相同目的建立的工作不同之處在於,您將使用宣告語法撰寫 Pipeline。Pipeline 將被撰寫在 Jenkinsfile 中,而不是在 Jenkins UI 中。您需要安裝 Pipeline 外掛程式。

步驟 1:建立 Pipeline 工作

從 Jenkins Dashboard 點選「新專案」連結以建立一個 Pipeline 工作。我將我的工作命名為 DeployCalculatorAPIUsingPipelineAsACode,並選擇了 Pipeline 選項。點選「確定」按鈕。

步驟 2:組態 Pipeline

滾動到頁面底部找到 Pipeline 區段,您可以使用指令碼編輯器建立 Pipeline 指令碼,稍後可以複製到 Jenkinsfile 中。

步驟 3:選擇 Git 和 Maven

由於 Pipeline 需要與 Git 和 Maven 互動,因此請從下拉式選單中選擇 Git 和 Maven 選項。這將為您提供一個宣告式指令碼範本,您可以根據需要進行編輯。

步驟 4:定義環境區塊

我定義了一個環境區塊(見清單 16-4),用於定義要在此 Pipeline 的所有階段中分享的變數。

pipeline {
    environment {
        FAILED_Stage = ""
    }
}

步驟 5:克隆 CalculatorAPI 倉函式庫

第一步是克隆 CalculatorAPI 倉函式庫。讓我們使用 Snippet Generator 生成這個步驟。這個過程在第 14 章中有詳細介紹。

我修改了範本以新增克隆 Calculator API 倉函式庫階段(見清單 16-5),並貼上了使用 Snippet Generator 生成的 Git 步驟。

  flowchart TD
    A[開始] --> B[建立 Pipeline 工作]
    B --> C[組態 Pipeline]
    C --> D[選擇 Git 和 Maven]
    D --> E[定義環境區塊]
    E --> F[克隆 CalculatorAPI 倉函式庫]
    F --> G[執行建置過程]

圖表翻譯:

此圖表展示了建立和執行 Jenkinsfile 中的 Pipeline 的步驟。從建立 Pipeline 工作開始,然後組態 Pipeline、選擇 Git 和 Maven、定義環境區塊、克隆 CalculatorAPI 倉函式庫,最後執行建置過程。

內容解密:

在此範例中,我們使用宣告語法撰寫 Jenkinsfile。首先,我們定義了一個環境區塊,用於定義要在此 Pipeline 的所有階段中分享的變數。然後,我們克隆了 CalculatorAPI 倉函式庫,並使用 Snippet Generator 生成了 Git 步驟。最後,我們執行了建置過程。

這個範例展示瞭如何使用宣告語法撰寫 Jenkinsfile,以及如何使用 Snippet Generator 生成 Git 步驟。同時,也展示瞭如何定義環境區塊和克隆倉函式庫。

Jenkins 與 GitLab/GitHub 的整合已成為現代軟體開發流程中不可或缺的一環。透過 API 認證存取儲存函式庫,實作了自動化建置、測試和佈署,大幅提升了開發效率。深入剖析此整合方案,可以發現其核心價值在於版本控制、流程自動化以及團隊協作的強化。

本文詳細介紹瞭如何設定 API 認證、組態建置步驟以及修改 pom.xml 等關鍵環節,並以圖表和程式碼示例輔助說明,降低了理解門檻。然而,單純依靠 UI 操作設定管線的傳統方式存在維護性和擴充套件性上的限制。匯入 Jenkinsfile 作為程式碼管線,則有效解決了這些問題,並進一步提升了程式碼的可審查性、版本控制能力以及團隊協作效率。無論是指令碼式或宣告式語法,Jenkinsfile 都賦予了開發團隊更大的彈性,使其能根據專案需求定製複雜的 CI/CD 流程。

展望未來,隨著 DevOps 理念的普及和雲原生技術的發展,Jenkins 與 Git 平臺的整合將更加緊密。預計將出現更多自動化工具和最佳實務,進一步簡化組態流程並提升管線效能。同時,安全性和合規性也將成為關注重點,例如更精細的許可權管理和程式碼安全掃描等功能的整合。

對於追求高效能和高可靠性的開發團隊而言,採用程式碼管線並持續最佳化 Jenkinsfile 將是提升軟體交付效率的關鍵。玄貓認為,掌握 Jenkinsfile 的最佳實踐,例如模組化設計、程式碼複用和自動化測試,將有助於團隊構建更健壯、更靈活的 CI/CD 管線,從而更好地應對快速變化的市場需求。