Jenkins Pipeline指令碼的應用,能有效簡化 CI/CD 流程中的佈署自動化。本文以佈署 Calculator API 為例,示範如何撰寫Pipeline指令碼,區分建置階段與佈署階段,並利用 post 區塊在不同執行結果下觸發對應動作。實務上,開發者常需在Pipeline成功後歸檔構建產物,或在失敗時傳送郵件通知相關人員。透過指令碼中的 success 和 failure 區塊,即可輕鬆設定這些條件式操作。此外,整合 GitLab Webhook 後,更能做到程式碼推播自動觸發Pipeline執行,提升團隊開發效率。

瞭解Pipeline作為程式碼

在Pipeline作為程式碼的世界中,瞭解如何構建和管理Pipeline至關重要。Pipeline可以分為多個階段,每個階段都有其特定的任務和目標。在本文中,我們將探討如何使用 Jenkins Pipeline指令碼定義Pipeline,並如何使用 post 區塊實作條件執行。

Pipeline階段

Pipeline可以分為多個階段,每個階段都有其特定的任務和目標。例如,以下是一個簡單的Pipeline指令碼,包含兩個階段:

stages {
    stage('複製 Calculator API Repository') {
        steps {
            git branch: 'Master', credentialsId: 'MyGitlabAPIToken', url: 'calculatorapi.git'
        }
    }
    stage('佈署 Calculator API') {
        steps {
            bat 'mvn deploy'
        }
    }
}

在這個例子中,我們定義了兩個階段:複製 Calculator API Repository佈署 Calculator API。每個階段都有其特定的任務,分別是複製 Git 倉函式庫和佈署應用程式。

Post 區塊

Post 區塊是一種特殊的區塊,允許您在Pipeline執行完成後執行特定的步驟。Post 區塊可以根據Pipeline的執行結果執行不同的步驟。例如,以下是一個簡單的 post 區塊:

post {
    success {
        bat 'echo Pipeline執行成功'
    }
    failure {
        bat 'echo Pipeline執行失敗'
    }
}

在這個例子中,我們定義了一個 post 區塊,包含兩個條件區塊:successfailure。如果Pipeline執行成功,則執行 success 區塊;如果Pipeline執行失敗,則執行 failure 區塊。

Always 區塊

Always 區塊是一種特殊的區塊,允許您在Pipeline執行完成後無論結果如何都執行特定的步驟。例如,以下是一個簡單的 always 區塊:

post {
    always {
        bat 'echo Pipeline執行完成'
    }
}

在這個例子中,我們定義了一個 post 區塊,包含一個 always 區塊。如果Pipeline執行完成後,無論結果如何,都會執行 always 區塊。

應使用案例項

現在,您已經瞭解了 post 區塊和 always 區塊的用途。讓我們回到之前的例子中,實作條件執行。如果Pipeline執行成功,我們想要歸檔產生的 artifact;如果Pipeline執行失敗,我們想要傳送電子郵件通知。以下是一個簡單的實作:

stages {
    stage('複製 Calculator API Repository') {
        steps {
            git branch: 'Master', credentialsId: 'MyGitlabAPIToken', url: 'calculatorapi.git'
        }
    }
    stage('佈署 Calculator API') {
        steps {
            bat 'mvn deploy'
        }
    }
}
post {
    success {
        archiveArtifacts artifacts: 'target/calculator-api.jar'
    }
    failure {
        mail to: 'dev@example.com', subject: 'Pipeline執行失敗', body: 'Pipeline執行失敗,請檢視日誌'
    }
}

在這個例子中,我們定義了一個 post 區塊,包含兩個條件區塊:successfailure。如果Pipeline執行成功,則歸檔產生的 artifact;如果Pipeline執行失敗,則傳送電子郵件通知。

Jenkins Pipeline 的實作:傳送失敗通知與儲存構建產物

在 Jenkins Pipeline 中,實作傳送失敗通知和儲存構建產物是非常重要的。以下是如何透過 Jenkinsfile 實作這些功能的詳細步驟。

步驟 1:定義 Pipeline 結構

首先,需要定義 Pipeline 的基本結構,包括環境變數、代理、階段和後置動作等。

pipeline {
    environment {
        FAILED_Stage = ''
    }
    agent any
    stages {
        stage('Cloning Calculator API repository') {
            steps {
                script {
                    FAILED_Stage = env.STAGE_NAME
                }
                // 從 GitLab倉函式庫取得程式碼
                git branch: 'Master', credentialsId: 'Pranoday/jenkinsbookcalculatorapi.git'
            }
        }
        stage('Deploying Calculator API') {
            steps {
                script {
                    FAILED_Stage = env.STAGE_NAME
                }
                bat 'mvn deploy'
            }
        }
    }
    post {
        success {
            archiveArtifacts 'target/*.jar'
        }
        failure {
            emailext attachLog: true, body: 'Stage: ' + FAILED_Stage + ' from Build : ' + BUILD_NUMBER + ' of ' + JOB_NAME + ' failed. Hence release of new build could not be done on Nexus repository. Please find detailed console log attached with this email.', subject: 'CalculatorAPI details:' + DEFAULT_SUBJECT, to: ''
        }
    }
}

步驟 2:儲存構建產物

post 區塊中的 success 條件下,使用 archiveArtifacts 步驟儲存構建產物。在這個例子中,儲存的是 target 目錄下的 .jar 檔案。

post {
    success {
        archiveArtifacts 'target/*.jar'
    }
}

步驟 3:傳送失敗通知

post 區塊中的 failure 條件下,使用 emailext 步驟傳送失敗通知。這個通知包括了失敗階段的名稱、構建編號、工作名稱以及詳細的控制檯日誌。

post {
    failure {
        emailext attachLog: true, body: 'Stage: ' + FAILED_Stage + ' from Build : ' + BUILD_NUMBER + ' of ' + JOB_NAME + ' failed. Hence release of new build could not be done on Nexus repository. Please find detailed console log attached with this email.', subject: 'CalculatorAPI details:' + DEFAULT_SUBJECT, to: ''
    }
}

步驟 4:儲存 Jenkinsfile

最後,需要將 Jenkinsfile 儲存到 GitLab 倉函式庫中。這樣就可以版本控制 Pipeline 的程式碼,並且在 Jenkins 中自動觸發 Pipeline 的執行。

透過以上步驟,可以實作 Jenkins Pipeline 的自動化構建、佈署和通知功能。這樣可以提高開發團隊的效率和協作性,並且可以更好地管理和監控軟體的生命週期。

瞭解 Pipeline 作為 Code

在前面的章節中,我們已經將 Jenkinsfile.txt 提交到本地倉函式庫,並使用 git add.git commit --m "Adding Jenkinsfile" 命令提交變更。然後,我們使用 git push 命令將變更推播到 GitLab 倉函式庫。

現在,讓我們進入 Jenkins 工作。點選「Configure」連結,然後滾動到「Pipeline」部分。開啟「Definition」下拉選單,選擇「Pipeline Script from SCM」選項。然後,開啟「SCM」下拉選單,選擇「Git」選項。輸入 JenkinsBookCalculatorAPI 倉函式庫的 URL 到「Repository URL」欄位,並選擇相應的憑證。最後,輸入「master」到「Branch Specifier」欄位。

在「Script Path」欄位中,您需要輸入 pipeline 檔案的相對路徑。在這個例子中,pipeline 檔名為 Jenkinsfile.txt,位於倉函式庫的根目錄,因此您只需要輸入「Jenkinsfile.txt」即可。點選「Save」按鈕儲存變更。

使用 GitLab Webhook 觸發 Jenkins 工作

在前面的章節中,我們已經學習瞭如何使用不同的觸發機制來觸發 Jenkins 工作,例如使用 Cron 表示式和輪詢 SCM。在這個章節中,我們將學習如何使用 GitLab Webhook 來觸發 Jenkins 工作。

當您組態 Jenkins 工作來輪詢 SCM 時,Jenkins 會檢查 Git 倉函式庫是否有新變更,並觸發建置。在這種情況下,建置觸發來自 Jenkins 方面,只有當有新變更推播到遠端倉函式庫時才會觸發建置。

但是,當您與 Git 遠端倉函式庫互動時,例如推播程式碼分支或開啟/關閉問題時,會觸發不同的事件。如果您想要根據這些事件來觸發 Jenkins 工作,您需要使用一個稱為 Webhook 的概念。

Webhook 只是一個組態,包含了要傳送 POST 請求的 URL,以回應某個事件。如果您建立一個 Webhook 組態,包含了您 Jenkins 工作的 URL,您可以根據 GitLab 倉函式庫中的事件來觸發建置。

要使用 Webhook 觸發 Jenkins 工作,您需要在 GitLab 倉函式庫中建立一個 Webhook,並組態 Jenkins 以從 GitLab 接收建置觸發器。在組態 GitLab Webhook 之前,讓我們先了解兩個重要的概念:

  • 公共 IP:連線到網路的機器有兩種型別的 IP 地址。區域性 IP 用於區域性網路(LAN)中與機器進行通訊,而公共 IP 用於公共網路中。
  • 埠轉發(開放埠):在這個場景中,Jenkins 伺服器將在區域性 IP 地址上啟動,並監聽某個埠。您需要使用公共 IP 地址和埠號來傳送請求給 Jenkins 機器。

現在,讓我們進入組態 GitLab Webhook 的步驟。

組態Port Forwarding以便Jenkins伺服器能夠接收來自公網的請求

為了讓Jenkins伺服器能夠接收來自公網的請求,需要組態Port Forwarding。這個過程涉及將公網IP地址上的請求轉發到區域網(LAN)IP地址上。以下是使用DLINK路由器組態Port Forwarding的步驟:

  1. 開啟DLINK路由器組態頁面:在瀏覽器中輸入路由器的IP地址,然後輸入管理員使用者名稱和密碼(通常都是「admin」)。
  2. 進入高階設定:點選「Advanced」按鈕以進入高階設定頁面。
  3. 開啟防火牆設定:點選頂部水平欄上的「FIREWALL」按鈕。
  4. 選擇Port Forwarding:在左側欄中點選「PORT FORWARDING」連結。
  5. 設定Port Forwarding
    • 本地IP地址:輸入您的機器的本地IP地址(可以透過執行ipconfig命令獲得)。
    • 本地埠範圍:指定您啟動Jenkins伺服器的埠範圍。如果您想在8080到8090之間的任意埠啟動Jenkins,可以新增這個埠範圍。假設您啟動Jenkins伺服器在8080埠,可以在兩個欄位中輸入8080。
    • 協定:保持「Both」值被選中。
    • 遠端IP地址:輸入您的機器的公網IPv4地址。
    • 遠端埠範圍:可以新增一個埠範圍,但在這個例子中,我們輸入8080在兩個欄位中。
  6. 儲存設定:點選「Save & Apply」按鈕以儲存組態。

建立Jenkins工作以便使用GitLab Webhook URL觸發

完成上述設定後,您可以建立一個Jenkins工作,以便使用GitLab Webhook URL觸發。

  1. 啟動Jenkins伺服器在本地IP地址:確保Jenkins伺服器正在您的本地IP地址上執行。
  2. 組態Jenkins URL在Jenkins組態中:前往「Manage Jenkins」>「Configure System」,然後在「Jenkins URL」欄位中設定您的機器的公網URL。
  3. 安裝GitLab外掛在Jenkins中:參考第5章以獲得詳細步驟,瞭解如何安裝GitLab外掛。
  4. 組態Jenkins工作以便從GitLab接收觸發:在前往GitLab倉函式庫建立Webhook之前,請進入「DeployCalcualtorAPIUsingPipelineAsACode」Jenkins工作,並組態它以便從GitLab接收觸發。
    • 滾動到「Build Triggers」部分。安裝GitLab外掛後,您將看到「Build When a Change Is Pushed to GitLab」選項。
    • 複製GitLab Webhook URL從「Build When Change Is Pushed to GitLab」選項。
    • 勾選「Build When Change Is Pushed To GitLab」核取方塊。
    • 勾選「Push Events」核取方塊,並取消選擇其他選項,因為您只想在推播變更到遠端倉函式庫時觸發這個工作。
    • 點選「Advanced」按鈕以開啟相關設定。
    • 滾動到「Secret Token」欄位,然後點選「Generate」按鈕以生成一個秘密令牌。

這些步驟將幫助您組態Port Forwarding和建立一個Jenkins工作,以便使用GitLab Webhook URL觸發。這樣,您就可以實作自動化的CI/CD流程,以便在程式碼推播到GitLab時自動觸發Jenkins工作。

瞭解Pipeline作為Code的概念

在軟體開發中,Pipeline是指一系列的任務或步驟,用於自動化軟體的建置、測試和佈署。Pipeline作為Code的概念是指將Pipeline的定義和組態儲存於版本控制系統中,例如Git,從而使得Pipeline的管理和維護更加容易和透明。

建立Jenkins Job以觸發GitLab Webhook

要建立一個Jenkins Job以觸發GitLab Webhook,需要進行以下步驟:

  1. 建立Jenkins Job:在Jenkins中建立一個新的Job,並選擇「Pipeline」作為Job型別。
  2. 組態GitLab Webhook:在GitLab中,前往要觸發Jenkins Job的儲存函式庫,選擇「Settings」>「Webhooks」,然後新增一個Webhook。
  3. 設定Webhook URL和金鑰:在Webhook設定中,輸入Jenkins Job的URL和金鑰。
  4. 選擇觸發事件:選擇要觸發Jenkins Job的事件,例如「Push Events」。
  5. 儲存Webhook:儲存Webhook設定。

修改pom.xml檔案並推播變更

要修改pom.xml檔案並推播變更,需要進行以下步驟:

  1. 修改pom.xml檔案:修改CalculatorAPI project的pom.xml檔案,例如將版本號修改為9.0。
  2. 使用git add和git commit:使用git add和git commit命令將變更儲存到本地儲存函式庫中。
  3. 推播變更:使用git push命令將變更推播到遠端儲存函式庫中。

建立Pipeline Job以觸發使用GitHub Webhook

要建立一個Pipeline Job以觸發使用GitHub Webhook,需要進行以下步驟:

  1. 建立GitHub儲存函式庫:在GitHub中建立一個新的儲存函式庫。
  2. 安裝GitHub外掛:在Jenkins中安裝GitHub外掛。
  3. 設定Hook URL:在Jenkins中設定Hook URL,以便GitHub可以觸發Jenkins Job。
  4. 建立Pipeline Job:在Jenkins中建立一個新的Pipeline Job,以便觸發使用GitHub Webhook。

Mermaid圖表

  flowchart TD
    A[建立Jenkins Job] --> B[組態GitLab Webhook]
    B --> C[設定Webhook URL和金鑰]
    C --> D[選擇觸發事件]
    D --> E[儲存Webhook]
    E --> F[修改pom.xml檔案並推播變更]
    F --> G[建立Pipeline Job以觸發使用GitHub Webhook]

圖表翻譯

此圖表展示了建立Jenkins Job以觸發GitLab Webhook和GitHub Webhook的步驟。首先,需要建立一個Jenkins Job,並組態GitLab Webhook。然後,需要設定Webhook URL和金鑰,選擇觸發事件,並儲存Webhook。接下來,需要修改pom.xml檔案並推播變更。最後,需要建立一個Pipeline Job以觸發使用GitHub Webhook。

Pipeline即程式碼的實踐,正推動著DevOps的深化與自動化程度的提升。本文深入探討了JenkinsPipeline的建構、階段劃分、post區塊的條件執行,以及與GitLab和GitHub webhook的整合,展現了Pipeline即程式碼在持續整合與持續交付(CI/CD)中的關鍵作用。

分析Pipeline各階段的設計、條件執行的運用以及構建產物的歸檔策略,可以發現,Pipeline即程式碼的核心價值在於提升開發流程的效率和可靠性。透過版本控制的Jenkinsfile,開發團隊能更精細地控制構建流程,實作自動化的測試、佈署和通知,有效降低人為錯誤並加快交付速度。然而,Pipeline的設計複雜度、維護成本以及與不同平臺的整合,仍然是團隊需要面對的挑戰。

展望未來,Pipeline即程式碼將與雲原生技術更緊密地結合,例如Kubernetes的自動化佈署和擴充。預計將出現更多標準化的Pipeline範本和工具,降低使用門檻並提升效率。此外,安全性整合也將成為重點,例如在Pipeline中嵌入安全掃描和漏洞修復機制。

玄貓認為,Pipeline即程式碼已成為現代軟體開發的必備技能。團隊應積極探索最佳實踐,並關注新興技術的整合,才能充分釋放Pipeline即程式碼的潛力,打造更敏捷、可靠且安全的交付流程。