跳至主要内容

[Day 29] 測試搭配 CI/CD 更自動!

在我們前面的實作測試時,都是手動的下指令去跑測試,但是如果忘記去跑測試,那我們寫出來的測試都是白費工,所以接下來就是要試著將測試整合到 CI/CD 流程中,讓測試更加自動化!

CI/CD 平台介紹

CI/CD (Continuous Integration 持續整合/ Continuous Deployment 持續部署) 是一種軟體開發流程,透過自動化的方式將程式碼整合、測試、部署,讓開發者可以更快速的開發並且部署程式。

通常會寫一份指令檔 (Ex: deploy.yml) 來定義 CI/CD 流程,並且將指令檔放在專案的根目錄下,當 CI/CD 平台偵測到專案有指令檔時,就會依照指令檔的內容來執行 CI/CD 流程。

這邊介紹幾個常見且方便使用的 CI/CD 平台:

平台GitHubGitLabBitbucket
優點GitHub 社群龐大,有很多完整的 action template可與第三方套件進行整合部署,Ex: AWS可與 Jira / confluence 及 Slack 通知進行整合
CI/CD toolsGithub ActionsGitlab CI/CDbitbucket pipelines
是否有結果通知
設定檔位置.github/workflows/deploy.yml.gitlab-ci.ymlbitbucket-pipelines.yml
VS Code ExtensionGitHub ActionsGitLab WorkflowBitbucket Pipelines

分別對應的就是三個常見的 Git 平台,可以根據專案放置的位置來選擇使用的平台,個人使用起來都還不錯,功能也都蠻齊全的,不過各自也都有一些小差異,可以根據自己的需求來選擇使用。

那這邊就以 GitHub Actions 來做介紹

GitHub Actions 的 yml 大概會是這樣:

# Simple workflow for deploying static content to GitHub Pages
name: Deploy static content to Pages

on:
# Runs on pushes targeting the default branch
push:
branches: ["main"]

# Allows you to run this workflow manually from the Actions tab
workflow_dispatch:

# Sets the GITHUB_TOKEN permissions to allow deployment to GitHub Pages
permissions:
contents: read
pages: write
id-token: write

# Allow one concurrent deployment
concurrency:
group: "pages"
cancel-in-progress: true

jobs:
test:
name: npm run test
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Set up Node
uses: actions/setup-node@v3
with:
node-version: 18
cache: "npm"
- name: Install dependencies
run: npm install
- name: test
run: npm run test
# Single deploy job since we're just deploying
deploy:
needs: test
if: ${{ success() }}
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Set up Node
uses: actions/setup-node@v3
with:
node-version: 18
cache: "npm"
- name: Install dependencies
run: npm install
- name: Build
run: npm run build && cp ./dist/index.html ./dist/404.html
- name: Setup Pages
uses: actions/configure-pages@v3
- name: Upload artifact
uses: actions/upload-pages-artifact@v1
with:
# Upload dist repository
path: "./dist"
- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@v1

可以看到我在 deploy 之前先去跑 test 測試,如果測試成功的話,才去進行部署,這樣的話就可以避免測試沒過就部署的情況發生。

在 GitHub 上可以看到這個 workflow 的結果:

測試成功



測試失敗



還可以設定測試失敗時要發送 email 通知,這樣就可以更快速的知道測試失敗的原因!




測試搭配 CI/CD 之後,就可以讓測試更加自動化,不用再手動下指令去跑測試,也可以避免忘記跑測試的情況發生,讓測試更加有效率!