CI & CD

CI & CD 都是軟體開發中 流程自動化 的概念,

CI/CD 可以 加速軟體開發部署流程,

提高程式碼品質,

降低維護成本,

許多工具與平台如 GitHub、GitLab 等…

都提供了完整的 CI/CD 功能支援

CI(Continuous Integration)

CI 是指在開發過程中,

將程式碼的 修改 & 整合 自動化,

讓開發者能夠頻繁地將 改變 與其他開發者所做的改變整合在一起,

以避免後續整合時發生問題

可以執行如:

  • 程式碼自動編譯

  • 測試

  • 部署到測試環境中

這樣可以確保程式碼的品質

CD(Continuous Delivery/Deployment)

CD 則是指程式的 交付自動化,

讓開發者能夠快速地將程式碼部署到正式環境中,

CD 可以分成兩種形式:

  • Continuous Delivery

    • 在程式碼確定能夠被部署到正式環境前, 將其部署到與正式環境相同的環境中, 並進行手動測試
  • Continuous Deployment

    • 將程式碼直接 自動部署 到正式環境中, 並不需要進行手動測試

GitHub Action

GitHub Actions 是 GitHub 提供的功能,

可以建立自動化 Workflows,

Workflows 存放在 Repository 中,

可以自訂排成工作,

當 Repository 中發生特定事件時,

執行自動化的工作流程

這些事件可以是 pushReleasepull request 等…

Workflows

可以多多套用別人寫的 actions,

就像寫程式 import 套件一樣,

至於每個 actions 更詳細的調控,

可以參考他們的官方文件

Deploy GitHub Page

這邊是我的 Actions:

name: Deploy GitHub Page # 這個 Action 的名稱

on: # 只有推到 main 才自動化
  push:
    branches:
      - main
  workflow_dispatch:
  schedule:
    - cron: "0 16 * * *" # every day at midnight at UTC+8

jobs:
  deploy:
    name: Publish Content To Public Site
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v3
        with:
          submodules: true # 原本的 repo 是沒有 submodule 的內容, 要記得加
          token: ${{ secrets.GIT_SUBMODULE_DEPLOY_TOKEN }} # Personal access token

      - name: Setup Hugo
        uses: peaceiris/actions-hugo@v2 # 使用別人做好的 Hugo Actions
        with:
          hugo-version: "0.110.0"
          extended: true

      - name: Git Submodule Update
        run: |
          git submodule init
          git submodule update --remote          

      - name: Build
        run: hugo --minify # 使用 Hugo 的指令

      - name: Deploy
        uses: peaceiris/actions-gh-pages@v3 # 將檔案 commit 到網站 repo
        with:
          external_repository: jess88tw/jess88tw.github.io
          deploy_key: ${{ secrets.ACTIONS_DEPLOY_KEY}} # ssh Key
          publish_dir: ./public
          publish_branch: main
          cname: www.jesseedgerunner.com
          user_name: "github-actions[bot]" # 自訂 user_name
          user_email: "github-actions[bot]@users.noreply.github.com"

Action Secrets

在上面的 action 裡,

需要在 Action Secrets 新增 ssh private key & Personal access token:

image

並且在 GitHub Pages Repository 的 Deploy keys 加入 public key:

image

大功告成

以後只要 push 到 HUGO 的 Repository,

就會自動執行 GitHub Action 完成自動部屬,

直接省去每次都要在本地生成靜態網站,

然後再 push 到靜態網站的手續,

GitHub Action 會自動幫忙完成 🥂

image

參考