如何使用 GitHub Actions 來建立 CI 的工作流程?
回想一下,您的目標是將程式代碼建置和發佈程式自動化,以便在開發人員每次將變更新增至程式代碼基底時更新功能。
若要實作此程式,您將瞭解如何:
- 從範本建立工作流程。
- 使用可重複使用的工作流程來避免重複。
- 針對多個目標進行測試。
- 分隔組建和測試工作。
從範本建立工作流程
若要建立工作流程,一開始使用範本很常見。 範本有針對您要實作的特定自動化類型預先設定的一般作業和步驟。 如果您不熟悉工作流程、作業和步驟,請參閱 使用 GitHub Actions 將開發工作自動化 模組。
在 GitHub 存放庫的主頁面上,選取 [ 動作],然後選取 [ 新增工作流程]。
在 [ 選擇工作流程] 頁面上,您可以從許多類型的範本中選擇。 其中一個範例是 Node.js 範本。 Node.js 範本會安裝 Node.js 和所有相依性、建置原始程式碼,並針對不同版本的 Node.js執行測試。 另一個範例是 Python 套件 範本,它會安裝 Python 及其相依性,然後在多個 Python 版本中執行測試,包括 lint。
若要從 Node.js 工作流程樣本開始,請在搜尋方塊中輸入 Node.js。
在搜尋結果的 [Node.js] 窗格中,選取 [ 設定]。
已從範本建立專案的 node.js.yml 檔案:
name: Node.js CI
on:
push:
branches: [ "main" ]
pull_request:
branches: [ "main" ]
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [14.x, 16.x, 18.x]
steps:
- uses: actions/checkout@v3
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v3
with:
node-version: ${{ matrix.node-version }}
cache: 'npm'
- run: npm ci
- run: npm run build --if-present
- run: npm test
如在 on 屬性中所見,此範例工作流程會在推送至存放庫或對主要分支建立提取要求時執行。
此工作流程會執行一個作業,以 job 屬性表示。
屬性 runs-on 指定對於作業系統,工作流程在 ubuntu-latest 上執行。 屬性 node-version 指定有三個版本,每個版本適用於 Node.js 的 14.x、16.x 和 18.x。 屬性 matrix 稍後會在模組中深入說明。
在 jobs 屬性中,這些步驟使用 GitHub Actions actions/checkout@v3 動作把程式碼從您的存放庫取得到虛擬機(VM),並使用 actions/setup-node@v3 設定正確的 Node.js版本。 您可以指定您想要使用 ${{ matrix.node-version }} 屬性測試三個版本的 Node.js。 此屬性會參考您稍早定義的矩陣。 cache 屬性會指定套件管理員,以在預設目錄中快取。
此步驟的最後一個部分會執行 Node.js 專案使用的命令。 命令 npm ci 會從 package-lock.json 檔案安裝相依性。 npm run build --if-present 如果存在,就會執行組建腳本。 npm test 會執行測試架構。 此範本同時包含相同作業中的建置和測試步驟。
若要深入了解 npm,請參閱 npm 檔:
開發人員小組可以受益於使用可重複使用的工作流程,以簡化和標準化重複的自動化步驟。 藉由使用可重複使用的工作流程,您可以減少備援、改善可維護性,並確保持續整合/持續部署 (CI/CD) 管線之間的一致性。
使用可重複使用的工作流程來避免重複
隨著小組的規模和專案成長,通常會在多個工作流程檔案中看到重複相同的步驟。 這些步驟可能包括程式代碼簽出、相依性安裝、測試和部署。 這種重複作業不僅會雜亂您的程式代碼基底,也會在需要程式代碼變更時增加維護時間。 可重複使用的工作流程可讓您定義自動化邏輯一次,然後從其他工作流程呼叫邏輯,以解決此問題。
可重複使用的工作流程是其他工作流程可以呼叫的特殊 GitHub Actions 工作流程,類似於程序設計中的函式。 您可以建立它們來共用重複的邏輯,例如建置步驟、測試程式或部署策略。 建立可重複使用的工作流程之後,您可以從相同存放庫中的任何其他工作流程,甚至是在不同的存放庫中參考它。
為什麼要使用可重複使用的工作流程?
以下是使用可重複使用工作流程的優點:
- 一致性。 Teams 可以遵循所有專案的相同自動化標準。
- 效率。 您不用複製貼上步驟,而是可以指向可重複使用的工作流程。
- 更容易更新。 當程式變更時,例如藉由新增測試步驟,您會在一個位置更新它。 然後,所有自動使用工作流程權益的工作流程。
- 延展性。 可重複使用的工作流程適用於管理多個服務的平臺或DevOps小組。
接下來,探索如何使用可重複使用的工作流程來改善您的專案。
實作可重複使用的工作流程
若要使用可重複使用的工作流程:
- 在您的存放庫資料夾中,建立可重複使用的工作流程。 檔案包含您想要共用的自動化步驟,例如測試、建置和部署所涉及的常見步驟。
- 明確地將工作流程配置為可重複使用,並使用
workflow_call事件來啟用它。 - 在您的主要工作流程(呼叫端工作流程)中,參考這個可重複使用的檔案,並提供任何必要的輸入或秘密。
為了說明可重複使用工作流程的優點,請考慮下列真實世界案例。
範例
假設您的組織有10個微服務。 所有 10 個微服務都需要相同的步驟來:
- 執行測試
- Lint 程式代碼
- 部署到特定環境
如果沒有可重複使用的工作流程,每個存放庫最終都會在多個工作流程檔案之間複製相同的邏輯,導致重複的步驟和更難維護。
如果您使用可重複使用的工作流程:
- 您可以在中央檔案中定義進程一次(例如,在 中
ci-standard.yml)。 - 您可以從每個微服務自己的工作流程呼叫此檔案,並傳入環境或應用程式名稱等變數。
如果新增了新的安全性步驟或工具,例如掃描弱點,您只會在可重複使用的工作流程中新增一次。 所有 10 個微服務都會立即開始使用更新的程式。 您不需要修改 10 個微服務。
藉由瞭解可重複使用的工作流程的運作方式及其優點,您可以採用最佳做法來最大化其有效性,並確保與 CI/CD 管線緊密整合。
最佳做法
- 如果您打算跨小組共用工作流程,請將可重複使用的工作流程集中化到一個存放庫中。
- 使用分支或標籤來為您的工作流程建立版本(例如,使用
@v1),因此,如有必要,您可以輕鬆地回復變更。 - 清楚記載輸入和秘密。 可重複使用的工作流程通常依賴輸入和秘密。 團隊必須知道要使用哪些資訊。
- 如果您需要只重複使用幾個步驟,請結合可重複使用的工作流程與復合動作,而不是建立完整的工作流程。
可重複使用的工作流程是強制執行一致性、減少重複,以及在任何工程小組中調整 DevOps 做法的強大方式。 無論您是管理單一存放庫、微服務或開放原始碼連結庫,可重複使用的工作流程都可以簡化自動化,因此您的 CI/CD 更快速、更簡潔且更容易管理。
自訂工作流程範本
在本課程模組的開頭,您已考慮需要為開發人員小組設定 CI 的案例。 Node.js 範本是絕佳的起點,但您想要自定義範本,以更符合小組的需求。 您想要以不同版本的 Node.js 及不同的作業系統為目標。 您也希望建置和測試步驟是個別的作業。
以下是自訂工作流程的範例:
strategy:
matrix:
os: [ubuntu-latest, windows-latest]
node-version: [16.x, 18.x]
在此範例中,您會設定 建置矩陣 ,以跨多個作系統和語言版本進行測試。 此矩陣會產生四個組建,每個組建分別對應各個作業系統與 Node.js 的每個版本。
四個組建及其測試會產生大量的記錄數據。 可能很難排序這一切。 在下列範例中,您會將測試步驟移至專用的測試作業。 此作業會針對多個目標進行測試。 分隔建置和測試步驟可讓您更輕鬆地使用記錄數據。
test:
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ubuntu-latest, windows-latest]
node-version: [16.x, 18.x]
steps:
- uses: actions/checkout@v3
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v3
with:
node-version: ${{ matrix.node-version }}
- name: npm install, and test
run: |
npm install
npm test
env:
CI: true