Ben Ben Blog.

建立我的第一個Blog - part 4: Github Action CI/CD 自動Deploy CMS (self hosted runner)

引言

GitHub Actions 是 GitHub 提供的一種持續整合(CI)和持續交付(CD)平台,旨在自動化軟體開發流程。它允許開發者在代碼庫中定義工作流程,以響應各種事件,例如代碼提交、拉取請求或問題創建等。

在這個Blog中,我們使用了Docker來運行我們的strapi、postgreSQL database,當我們每次改完程式的時候,push到github的時候,我們都要去到server去pull code並再次運行docker compose up。而Github action就可以幫我們自動化這些事情。

建立self-hosted runner

  1. 打開github > 打開你的repository
  2. 點開repository的Settings頁面
  3. 在左邊選Actions > Runners
  4. 點左上角New self-hosted runner
  5. 按照他的指示,在你要運行docker的server上執行他給你的指令。

建立 Workflows

Workflows是一系列自動化的步驟,當特定事件發生時會被觸發。工作流程通常以 YAML 格式定義,並存放在 .github/workflows 目錄下。

所以我們第一步是建立 .github/workflows/deploy.yaml

name: Deploy strapi Backend (PROD)

on:
  push:
    branches:
      - main
    paths:
      - "cms/**"

jobs:
  build-and-test:
    runs-on: self-hosted
    defaults:
      run:
        working-directory: ./cms
    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: compose up
        run:
          docker compose --env-file .env.prod -f compose.yml -f compose.prod.yml
          up -d --build

這邊有幾個地方需要講解一下:

第一段on:

這段主要用來設定這個workflow 在什麼時機會trigger,我們設定了在push的時候,push的時候的branches包括 main,以及有改變的檔案的paths包括cms開頭的

第二段jobs

workflow裡面可以有多個job。 build是我給這個job的名字 runs-on指定他在什麼runner上運行,這邊是運行在self hosted 的runner上 working-directory指定這個job在哪個directory運行 steps job裡面可以有多個steps

第一個step: checkout

用於checkout我們的repository,相當於git clone到runner上並checkout到main branch。actions/checkout@v4是github提供的plugin

第二個step: 運行compose up

run用來執行命令 這邊我們執行docker compose up

建議在depoy的時候,執行的命令應該跟我們在開發時的命令一致,以減少deploy時及開發時有不一樣,避免錯誤。這邊就是使用了我們之前在package.json script 裡的compose:up