身為技術工作者,我時常思考如何提升軟體開發流程的效率。微服務架構的興起,為應用程式開發帶來了彈性,但也伴隨著 CI/CD 生產線複雜度的提升。本文將以名為 “Watchlist” 的電影追蹤應用程式為例,分享我建構高效微服務 CI/CD 生產線的經驗。

Watchlist 讓使用者能瀏覽 IMDb Top 100 電影並建立個人觀看清單。它採用微服務架構,由 Loader、Parser、Store 和 Marketplace 四個服務組成,分別負責載入電影資料、解析電影細節、儲存資料和提供使用者介面。

  graph LR
    A[Loader] --> B(Message Queue);
    B --> C[Parser];
    C --> D[MongoDB];
    D --> E[Store];
    E --> F[Marketplace UI];

圖表説明: 資料流程從 Loader 服務開始,透過訊息佇列傳遞至 Parser 服務,Parser 服務從 IMDb 擷取資料後儲存至 MongoDB,最後 Store 服務將資料提供給 Marketplace UI。

以下表格格列出各個微服務、其功能和使用的程式語言:

服務名稱功能程式語言
Loader載入電影資料Python
Parser解析電影細節Node.js
Store儲存資料Java
Marketplace使用者介面JavaScript

微服務程式碼組織:單體式 vs. 多儲存函式庫

設計微服務架構時,程式碼組織策略至關重要。我將其歸納為兩種主要策略:

  • **單體式儲存函式庫:**所有服務的程式碼都集中於同一個儲存函式庫。這種方式簡化了相依性管理和程式碼共用,但可能導致儲存函式庫過於龐大,影響開發效率。
  • **多儲存函式庫:**每個服務擁有獨立的儲存函式庫。這種方式賦予團隊更大的自主性,但也增加了管理複雜度。

我個人偏好多儲存函式庫策略,它更符合微服務的獨立性精神,但需要更完善的 CI/CD 流程來協調各服務的建置和佈署。

建構多分支生產線:GitHub 與 Jenkins 的整合

Watchlist 應用程式使用 Jenkins 建構 CI/CD 生產線,並使用 GitHub 作為程式碼儲存函式庫。

首先,為每個微服務建立一個 GitHub 儲存函式庫,並建立 develop、preprod 和 master 三個主要分支,有效隔離不同階段的程式碼。

git checkout -b preprod
git push origin preprod
git checkout -b develop
git push origin develop

以上程式碼建立了 preprod 和 develop 分支,並將它們推播到遠端儲存函式庫。

接著,在 Jenkins 中建立多分支生產線任務。多分支生產線能自動偵測每個分支的 Jenkinsfile,並執行對應的建置流程。設定程式碼來源時,選擇 GitHub 作為程式碼來源,並設定 Jenkinsfile 的路徑。

SSH 金鑰:強化 Jenkins 與 GitHub 的安全整合

根據安全性考量,我建議使用 SSH 金鑰進列 Jenkins 與 GitHub 的驗證。

首先,使用以下指令產生 SSH 金鑰對:

ssh-keygen -t rsa -b 4096 -C "jenkins-github-key"

將公開金鑰 (id_rsa.pub) 加入 GitHub 儲存函式庫的佈署金鑰,並在 Jenkins 設定對應的私密金鑰憑證。

在 Jenkinsfile 中,使用 SSH 認證的 Git URL:

pipeline {
    agent any
    stages {
        stage('Checkout') {
            steps {
                git credentialsId: 'your-ssh-credentials-id', url: 'git@github.com:your-username/your-repository.git'
            }
        }
    }
}

這段程式碼使用指定的 SSH 憑證從 GitHub 簽出程式碼。credentialsId 需替換為你在 Jenkins 中設定的 SSH 憑證 ID。

Webhook:實作自動觸發建置

設定 GitHub Webhook,讓程式碼推播自動觸發 Jenkins 建置,提升開發效率。在 GitHub 儲存函式庫設定中新增 Webhook,Payload URL 設定為 JENKINS_URL/github-webhook/,並選擇 “Just the push event”。

  graph LR
    A[GitHub 程式碼推播] --> B[Webhook]
    B --> C[Jenkins]
    C --> D[自動建置]

此圖表展示了 GitHub Webhook 如何觸發 Jenkins 自動建置的流程。

本文以 Watchlist 應用程式為例,分享了建構微服務 CI/CD 生產線的實務經驗,涵蓋程式碼組織策略、多分支生產線設定、GitHub Webhook 整合與 SSH 金鑰應用程式。希望這些內容能幫助你開發更自動化、更高效的微服務佈署流程。 透過 GitHub Webhook 與 Jenkins 的整合,我們成功地將程式碼推播與建置流程自動化。這不僅顯著提升了團隊的開發效率,更減少了人為介入可能造成的錯誤,是建構 CI/CD 流程中不可或缺的環節。此流程的自動化特性,讓開發團隊能更專注於程式碼的開發與最佳化,而無需分心於繁瑣的建置操作,進而提升整體軟體交付的效率與品質。

  graph LR
    B[B]
    Webhook[Webhook]
    A[開發者推播程式碼] --> B{GitHub};
    B -- Webhook --> C[Jenkins];
    C --> D[自動建置];
    D --> E[測試與佈署];

這張流程圖清晰地展現了程式碼變更後觸發自動建置的完整流程。開發者將程式碼推播至 GitHub 後,GitHub 會透過 Webhook 機制通知 Jenkins。Jenkins 接收到通知後,便會自動啟動預先設定好的建置流程,套件含編譯、測試和佈署等步驟,最終實作自動化的軟體交付流程。此機制有效地減少了手動操作的步驟,降低了人為錯誤的風險,並提升了整體開發效率。