隨著微服務架構的普及,程式碼函式庫的組織方式對持續整合與持續佈署流程至關重要。本文將探討單儲存函式庫和多儲存函式庫模式的優劣,分析其對 CI/CD 管道的影響,並以電影平台微服務為例,示範如何使用 Jenkins 建立 CI/CD 管道。我們將使用多儲存函式庫策略,為每個微服務建立獨立的 Git 儲存函式庫,並使用 GitFlow 模型進行分支管理。接著,我們會建立 Jenkins 多分支管道作業,並撰寫 Jenkinsfile 定義建置、測試和佈署流程。最後,我們將示範如何設定 Jenkins 與 GitHub 的整合,包含 Jenkinsfile 的撰寫、多分支管道的設定,以及版本控制系統的整合,以實作自動化的建置、測試和佈署流程。
微服務架構下的持續整合工作流程設計
在探討應用程式的持續整合(CI)工作流程之前,讓我們先了解分散式應用程式的原始碼將如何組織。當開始轉向微服務架構時,其中一個最大的挑戰是程式碼函式庫的組織。你應該為每個服務建立一個獨立的儲存函式庫,還是一個儲存函式庫包含所有服務?每種模式都有其優缺點:
多儲存函式庫 vs. 單一儲存函式庫
- 多儲存函式庫:可以讓多個團隊獨立開發服務(明確所有權)。此外,較小的程式碼函式庫更容易維護、測試和佈署,且需要較少的團隊協調。然而,獨立團隊可能會導致組織內部知識的區域性化,進而使團隊缺乏對專案整體的瞭解。
- 單一儲存函式庫:具有簡化的專案組織和較少的專案依賴管理開銷。同時,當團隊在單一儲存函式庫上工作時,也可以改善整體的工作文化。然而,版本控制可能會變得更加複雜,並且可能出現效能和擴充套件性問題。
這兩種模式都有其優缺點,沒有一種是萬能的解決方案。你應該瞭解它們的優缺點,並根據你的專案需求做出明智的決定。
對 CI/CD 管道的影響
你組織程式碼函式庫的方式將影響 CI/CD 管道的設計。在單一儲存函式庫中託管專案可能會導致單一管道具有相當複雜的階段。管道的大小和複雜度往往是一個巨大的痛點。隨著組織內服務數量的增加,管道的管理也變得更加困難。最終,大多數管道都變成了一堆積混雜的 npm、pip 和 Maven 指令碼,並散佈著一些 bash 指令碼。另一方面,採用多儲存函式庫策略可能會導致多個管道需要管理和程式碼重複。幸運的是,有一些解決方案可以減少管道管理的工作,例如使用共用的管道段和共用的 Groovy 指令碼。
本文的範例
本文將展示如何為這兩種模式建立 CI/CD 管道。對於微服務,我們將採用多儲存函式庫策略。在建立 serverless 函式的 CI/CD 管道時,我們將涵蓋單一儲存函式庫的方法。
應用程式微服務
| 服務名稱 | 語言 | 描述 |
|---|---|---|
| Loader | Node.js | 負責從 JSON 檔案載入電影資料到 MongoDB 資料函式庫。 |
| Parser | Node.js | 解析從 API 取得的電影資料。 |
| Store | Node.js | 負責提供 RESTful API,以擷取電影清單並將新電影插入到 MongoDB 資料函式庫。 |
| Marketplace | Angular 和 TypeScript | 負責提供前端介面以瀏覽電影,並呼叫 Store 的 RESTful API。 |
建立 Git 儲存函式庫
首先,為每個服務(Loader、Parser、Store 和 Marketplace)建立四個 Git 儲存函式庫。在本文中,我使用的是 GitHub,但也可以使用任何其他原始碼管理(SCM)系統,例如 GitLab、Bitbucket 或甚至 SVN。確保在你將用於執行以下步驟的機器上安裝了 Git。
使用 GitFlow 模型進行分支管理
在本文中,我們將使用 GitFlow 模型進行分支管理。有關更多資訊,請閱讀第 2 章。
建立儲存函式庫後,將它們複製到你的工作區,並建立三個主要分支:develop、preprod 和 master 分支,以幫助組織程式碼並將開發中的程式碼與生產環境中的程式碼隔離開來。這種分支策略是 GitFlow 工作流程分支模型的精簡版本。
建立分支並推播到遠端儲存函式庫
使用以下命令建立目標分支並將它們推播到遠端儲存函式庫:
git clone https://github.com/mlabouardy/movies-loader.git
cd movies-loader
git checkout -b preprod
git push origin preprod
git checkout -b develop
git push origin develop
檢視 Git 儲存函式庫中的分支
要在 Git 儲存函式庫中檢視分支,請在終端機中執行以下命令:
git branch -a
在目前所在的分支旁邊會顯示一個星號(*)。終端機會顯示類別似以下的輸出:
將程式碼推播到 develop 分支
接下來,將本文 GitHub 儲存函式庫中的程式碼複製到每個 Git 儲存函式庫的 develop 分支,然後將變更推播到遠端儲存函式庫:
git add .
git commit -m "loading from json file"
git push origin develop
GitHub 儲存函式庫應該如圖 7.5 所示。
定義多分支管道作業
要將應用程式原始碼與 Jenkins 整合,我們需要建立 Jenkins 作業來持續建置它。前往 Jenkins 網頁儀錶板,點選左上角的「New Item」按鈕,或點選「Create New Jobs」連結來建立新的作業,如圖 7.6 所示。
圖 7.6 Jenkins 新作業建立畫面
圖表翻譯: 圖 7.6 展示了 Jenkins 的新作業建立畫面,使用者可以透過點選「New Item」按鈕或「Create New Jobs」連結來建立新的 Jenkins 作業。
詳細步驟與實作細節
- 建立 Jenkinsfile:每個服務都需要一個 Jenkinsfile,用於定義 CI/CD 管道。
- 設定 Jenkins 作業:根據 Jenkinsfile 設定 Jenkins 作業,以自動觸發建置和佈署流程。
- 管理多分支管道:使用 Jenkins 的多分支管道功能來管理不同分支的建置和佈署。
程式碼範例與解析
以下是 Jenkinsfile 的範例,用於定義 CI/CD 管道:
pipeline {
agent any
stages {
stage('Build') {
steps {
sh 'npm install'
sh 'npm run build'
}
}
stage('Test') {
steps {
sh 'npm run test'
}
}
stage('Deploy') {
steps {
sh 'npm run deploy'
}
}
}
}
#### 內容解密:
上述 Jenkinsfile 定義了一個包含三個階段的 CI/CD 管道:建置、測試和佈署。在建置階段,會執行 npm install 和 npm run build 命令來安裝依賴並建置專案。在測試階段,會執行 npm run test 命令來執行測試。在佈署階段,會執行 npm run deploy 命令來佈署專案。
每個階段都包含一個或多個步驟,這些步驟會按照定義的順序執行。透過這種方式,可以實作自動化的建置、測試和佈署流程。
將微服務定義為程式碼的Jenkins整合流程
在現代化的軟體開發流程中,持續整合(CI)和持續佈署(CD)是確保軟體品質和快速迭代的關鍵環節。Jenkins作為一個強大的自動化工具,提供了多種方式來定義和管理微服務的CI/CD流程。本章將詳細介紹如何在Jenkins中定義一個微服務的Pipeline(Pipeline),並與Git和GitHub進行整合。
Jenkins 任務的建立
首先,我們需要在Jenkins上建立一個新的任務。在Jenkins的首頁,點選「新建任務」,然後輸入任務名稱,並選擇「多分支Pipeline(Multibranch Pipeline)」。這種Pipeline允許我們為原始碼倉函式庫中的每個分支自動建立一個Pipeline。
為什麼選擇多分支Pipeline?
- 自動化:多分支Pipeline允許Jenkins自動檢測程式碼倉函式庫中的分支,並為每個包含
Jenkinsfile的分支建立一個獨立的Pipeline。 - 靈活性:開發人員可以在不同的分支上進行開發、測試和佈署,而不需要手動組態每個分支的Pipeline。
Jenkins 與 GitHub 的整合
為了讓Jenkins能夠存取我們的程式碼倉函式庫並執行Pipeline,我們需要組態Jenkins與GitHub之間的整合。
組態原始碼管理:在Jenkins任務組態頁面中,選擇GitHub作為原始碼管理系統,並輸入倉函式庫的HTTPS克隆URL。
新增憑證:為了安全地存取GitHub倉函式庫,我們需要在Jenkins中新增一個憑證。這個憑證可以是GitHub的使用者名稱和密碼,或者是一個個人存取令牌(Personal Access Token)。
@startuml skinparam backgroundColor #FEFEFE
title 微服務持續整合工作流程設計與 Jenkins 實踐
|開發者| start :提交程式碼; :推送到 Git;
|CI 系統| :觸發建置; :執行單元測試; :程式碼品質檢查;
if (測試通過?) then (是) :建置容器映像; :推送到 Registry; else (否) :通知開發者; stop endif
|CD 系統| :部署到測試環境; :執行整合測試;
if (驗證通過?) then (是) :部署到生產環境; :健康檢查; :完成部署; else (否) :回滾變更; endif
stop
@enduml
**圖表翻譯:** 此圖示展示了在Jenkins中建立GitHub憑證的流程,包括選擇憑證型別、輸入相關資訊以及儲存憑證。
#### 內容解密:
- 開始:在Jenkins中啟動建立憑證的流程。
- 建立Jenkins憑證:進入Jenkins的憑證管理頁面,選擇新增新憑證。
- 選擇使用者名稱和密碼或個人存取令牌:決定使用哪種型別的憑證來存取GitHub。
- 輸入GitHub使用者名稱和密碼或令牌:根據選擇的憑證型別,輸入相關的資訊。
- 儲存憑證:完成憑證的建立並儲存。
3. **個人存取令牌的建立**:在GitHub上,導航到「設定」>「開發者設定」>「個人存取令牌」,然後生成一個新的令牌。確保選擇`repo`範圍,以便Jenkins能夠存取您的倉函式庫。
### 組態多分支Pipeline
在完成GitHub整合後,我們需要組態多分支Pipeline來掃描倉函式庫中的分支並執行相應的`Jenkinsfile`。
```groovy
pipeline {
agent any
stages {
stage('Build') {
steps {
sh 'make build'
}
}
stage('Test') {
steps {
sh 'make test'
}
}
}
}
內容解密:
pipeline { ... }:定義了一個Pipeline。agent any:表示這個Pipeline可以在任何可用的代理上執行。stages { ... }:定義了Pipeline中的不同階段。stage('Build') { ... }和stage('Test') { ... }:分別定義了構建和測試階段。sh 'make build'和sh 'make test':在構建和測試階段執行的shell命令,用於構建和測試專案。
Jenkins 與 GitHub 整合實務
在現代化的軟體開發流程中,持續整合(CI)與持續佈署(CD)是不可或缺的環節。Jenkins 作為一個強大的自動化伺服器,能夠與 GitHub 緊密整合,實作自動化的建置、測試和佈署流程。本文將探討如何設定 Jenkins 與 GitHub 的整合,並使用 Jenkinsfile 定義 CI 流程。
建立 Jenkinsfile
Jenkinsfile 是 Jenkins 用來定義 CI/CD 流程的檔案,通常存放在 Git 儲存函式庫的根目錄下。首先,我們需要在本地端的 movies-loader Git 儲存函式庫中建立一個名為 Jenkinsfile 的檔案,並將以下內容複製到該檔案中:
node('workers'){
stage('Checkout'){
checkout scm
}
}
內容解密:
node('workers'):指定 Jenkins 在標籤為workers的節點上執行此 Pipeline。stage('Checkout'):定義一個名為Checkout的階段,用於簽出程式碼。checkout scm:使用scm引數簽出觸發此 Pipeline 的 Git 儲存函式庫中的程式碼。
儲存並提交此 Jenkinsfile 至 develop 分支:
git add Jenkinsfile
git commit -m "creating Jenkinsfile"
git push origin develop
設定 Jenkins Job
回到 Jenkins 儀錶板,手動觸發掃描儲存函式庫,以偵測新建立的 Jenkinsfile。掃描完成後,Jenkins 會為 develop 分支建立一個巢狀的 Job。
檢視建置結果
建置完成後,可以透過 Jenkins 的 Stage View 檢視各階段的執行情況。點選 Checkout 階段,可以檢視該階段的日誌輸出,確認 Jenkins 是否成功簽出程式碼。
若要檢視完整的建置日誌,可以在左側的 Build History 中點選最近的建置編號,然後選擇 Console Output。
複製 Jenkins Job
為了節省時間,可以複製已有的 Jenkins Job 設定來建立新的 Job。例如,建立 movies-parser Job 時,可以複製 movies-loader Job 的設定,並更新 GitHub 儲存函式庫的 URL 和 Job 描述。
其他版本控制系統的支援
除了 Git,Jenkins 也支援 Subversion(SVN)。只需提供對應的 SVN URL,Jenkins 就能順利地與 SVN 儲存函式庫整合。
Jenkins Job 的 XML 設定檔
Jenkins Job 的設定可以匯出為 XML 檔案,方便備份或用於建立新的 Job。透過瀏覽器存取 JENKINS_DNS/job/JOB_NAME/config.xml 即可下載該 Job 的 XML 設定檔。