不在其位,不謀其政 - 多階段 CI/CD 流程

子曰:「不在其位,不謀其政。」說明了多階段工作流程的重要性。
設計一個穩定且高效的 CI/CD(持續集成與持續部署)流程是至關重要的。這不僅能夠提高開發效率,還能確保應用的品質。我們今天要在 Node.js 專案中使用 GitHub Actions 搭建一個多階段 CI/CD 流程,涵蓋構建、測試、部署和發布。
今日範例程式:https://github.com/Edit-Mr/2024-GitHub-Actions/tree/main/23
設置 Node.js 專案
在開始設計 CI/CD 流程之前,我們需要確保已經在 GitHub 上創建了一個 Node.js 專案,並在本地完成了基本的項目配置。你可以使用現有的專案,或是依照以下步驟簡單配置一個。
-
初始化專案:
1mkdir node-ci-cd-demo 2cd node-ci-cd-demo 3npm init -y
-
安裝必要的依賴項:
1npm install express 2npm install --save-dev jest
-
設置簡單的測試:
在package.json
中添加一個簡單的測試腳本:1"scripts": { 2 "test": "jest" 3}
使用 GitHub Actions 設計 CI/CD 流程
創建 GitHub Actions 工作流
構建階段
在項目的根目錄下創建一個 .github/workflows
文件夾,並在其中創建一個名為 ci.yml
的文件。
1name: Node.js CI
2
3on:
4 push:
5 branches:
6 - main
7 pull_request:
8 branches:
9 - main
10
11jobs:
12 build:
13 runs-on: ubuntu-latest
14
15 strategy:
16 matrix:
17 node-version: [20.x, 18.x]
18
19 steps:
20 - name: Checkout code
21 uses: actions/checkout@v3
22
23 - name: Setup Node.js
24 uses: actions/setup-node@v3
25 with:
26 node-version: ${{ matrix.node-version }}
27
28 - name: Install dependencies
29 run: npm install
30
31 - name: Run tests
32 run: npm test
部署階段
這裡我們使用 Heroku 部署應用,因為我們這個系列還沒有用過。我們可以在成功測試後自動將應用部署到 Heroku。你也可以使用我們之前介紹的任何其他部署方式。
- 安裝 Heroku CLI 並獲取 API Token。
- 在 GitHub 的 repository settings 中,添加一個名為
HEROKU_API_KEY
的機密環境變數。
然後,在 CI 工作流中添加部署步驟:
1deploy:
2 needs: build
3 runs-on: ubuntu-latest
4 steps:
5 - name: Checkout code
6 uses: actions/checkout@v3
7
8 - name: Login to Heroku
9 run: echo ${{ secrets.HEROKU_API_KEY }} | docker login --username=_ --password-stdin registry.heroku.com
10
11 - name: Deploy to Heroku
12 run: |
13 heroku container:push web --app your-heroku-app-name
14 heroku container:release web --app your-heroku-app-name
發布階段
如果你希望在完成部署後發布一個新的 Release,可以在工作流中添加以下步驟:
1publish:
2 needs: deploy
3 runs-on: ubuntu-latest
4 steps:
5 - name: Checkout code
6 uses: actions/checkout@v3
7
8 - name: Create Release
9 uses: actions/create-release@v1
10 env:
11 GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
12 with:
13 tag_name: v1.0.0
14 release_name: "First release"
15 draft: false
16 prerelease: false
最後把他們整合到一個完整的 CI/CD 流程中就可以了。你可以到上面的 GitHub 範例程式中查看完整的 ci.yml
文件。
實用技巧
你發現了嗎?我們在 CI/CD 流程中使用了 needs
關鍵字,這樣可以確保每個階段都在上一個階段成功後才執行。這樣可以確保流程的穩定性。以下是幾個實用的技巧,可以幫助你更好地設計 CI/CD 流程。
1. 並行運行測試
你可以使用 GitHub Actions 的矩陣功能來並行運行不同 Node.js 版本的測試,確保應用在不同環境下的穩定性。
2. 缓存 Node.js 依賴
使用 GitHub Actions 提供的 cache
功能來加速依賴的安裝過程。這可以顯著縮短 CI 的運行時間。
1- name: Cache Node.js modules
2 uses: actions/cache@v3
3 with:
4 path: node_modules
5 key: ${{ runner.os }}-node-${{ hashFiles('package-lock.json') }}
6 restore-keys: |
7 ${{ runner.os }}-node-
3. 使用 Lint 驗證代碼風格
你可以在 CI 過程中加入 ESLint 或 Prettier 來自動驗證代碼風格。
1- name: Run ESLint
2 run: npm run lint
小結
設計一個穩定的 CI/CD 流程對於保證軟體的質量和部署效率都至關重要。本文介紹了如何使用 GitHub Actions 搭建 Node.js 的多階段 CI/CD 流程,並涵蓋了構建、測試、部署和發布的自動化。通過實踐這些步驟和技巧,你可以更輕鬆地管理你的 Node.js 專案,並確保其在不同環境中的穩定性。