---
# System prepended metadata

title: 【學習筆記】用 GitHub Actions 實現 CI/CD

---

# 【學習筆記】用 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