# 【學習筆記】用 GitHub Actions 實現 CI/CD CI/CD 幫助開發者透過自動化的方式持續進行測試、交付和驗證,讓開發者可以專注在開發上面,而 Github Actions 讓我們透過建立工作流(workflow),在 Github 上面完成 CI/CD,自動測試和部署 Github 上的 repo。 ## 檔案架構 工作流(workflow)設定檔必須放在 `.github/workflows/` 這個目錄下,GitHub 會偵測和執行放在這個目錄中的 YAML 檔案。 ``` repository/ ├── .github/ │ └── workflows/ │ └── workflow.yml ├── folder/ ├── README.md └── ... ``` ## 用 YAML 設定 workflow 以一個簡單的例子說明 workflow 的語法和執行方式: ```yaml name: Deploy my project to production on: push: branches: - main schedule: - cron: "0 0 * * 0" workflow_dispatch: ``` - `name` 是 workflow 的名稱,會顯示在 Github Actions 的頁面上。 - `on` 定義了什麼時候會觸發這個 workflow,可以設定多種觸發方式,例如:push、pull_request、schedule 等。 - `push` 定義 push 到指定分支的時候會觸發,在這個例子中指定的分支是 `main`。 - `schedule` 依照 cron 排程,指定的時間就會觸發。 - `workflow_dispatch` 允許手動在 GitHub Actions 頁面點擊按鈕來觸發這個 workflow。 一個標準的 `cron` 表達式有五個欄位,每個欄位都代表一個時間單位: |欄位|名稱 | 允許值 | 範例| | ---|---|---|---| 一 |分鐘| 0-59| `30` 代表每小時的第 30 分鐘執行| 二 |小時| 0-23 |`8` 代表每天上午 8 點執行| 三| 日| 1-31| `1,15` 代表每個月的 1 號和 15 號執行| 四| 月| 1-12| `*` 代表每個月都執行| 五| 星期 | 0-6(0 表示日)| `0` 代表每週日執行| ```yaml jobs: deploy: # job name that defined by yourself runs-on: ubuntu-latest steps: - name: Checkout my code uses: actions/checkout@v4 - name: Setup Python uses: actions/setup-python@v5 with: python-version: '3.11' - name: Run my deployment script env: API_KEY: ${{ secrets.MY_API_KEY }} DEPLOY_TOKEN: ${{ secrets.DEPLOY_TOKEN }} run: python deploy.py ``` - `jobs` 定義了這個工作流要做的一系列任務(jobs),一個工作流可以包含多個任務,它們可以並行或依序執行。 - `runs-on` 定義這個任務在哪種作業系統上運行,GitHub 有提供 Linux、Windows 和 macOS 虛擬機器。 - `steps` 包含了任務中要執行的所有步驟,每個步驟會依序執行。 - `name` 是步驟的名稱,會顯示在 logs 中。 - `uses` 用來引用一個已有的 GitHub Action。 - `actions/checkout` 這個 action 用來將儲存庫的程式碼下載到環境中。 - `actions/setup-python` 安裝 Python。 - `run` 用來執行 shell 指令。 - `env` 區塊用來設定這個步驟的環境變數,設定 `${{ secrets.SECRET_NAME }}` 可以安全讀取 GitHub Secrets 中儲存的密鑰。 [這裡](https://docs.github.com/en/actions/reference/workflows-and-actions/events-that-trigger-workflows)包含更多 Github Actions 的語法。 ## 添加 Actions secrets 在當前 repo 中,進入 `Settings` > `Secrets and variables` > `Actions` > `New repository secret` 來添加環境變數。 ## Refernece - https://docs.github.com/en/actions/reference/workflows-and-actions/workflow-syntax - https://medium.com/starbugs/%E5%AF%A6%E4%BD%9C%E9%96%8B%E6%BA%90%E5%B0%8F%E5%B7%A5%E5%85%B7-%E8%88%87-github-actions-%E7%9A%84%E7%AC%AC%E4%B8%80%E6%AC%A1%E7%9B%B8%E9%81%87-3dd2d70eeb