【GitHub Actions CI 實戰】#01 認識 GitHub Actions:Workflow、Job、Step 核心概念

測驗:認識 GitHub Actions 核心概念

共 5 題,點選答案後會立即顯示結果

1. GitHub Actions 的 Workflow 檔案應該存放在哪個目錄下?

  • A. .github/actions/
  • B. workflows/
  • C. .github/workflows/
  • D. .workflows/

2. 在 GitHub Actions 中,多個 Job 預設的執行方式是什麼?

  • A. 按照定義順序依序執行
  • B. 平行(同時)執行
  • C. 隨機順序執行
  • D. 只執行第一個 Job

3. 若要讓某個 Job 在另一個 Job 完成後才執行,應該使用哪個關鍵字?

  • A. depends-on
  • B. after
  • C. requires
  • D. needs

4. 在 Step 中,若要使用現成的 GitHub Action,應該使用哪個關鍵字?

  • A. run
  • B. action
  • C. uses
  • D. import

5. CI(Continuous Integration,持續整合)的核心理念是什麼?

  • A. 每天固定時間自動部署程式碼到正式環境
  • B. 每次程式碼變更都自動執行測試和檢查,及早發現問題
  • C. 所有開發者共用同一個分支進行開發
  • D. 手動合併程式碼後再執行測試

前言

當你開始參與團隊專案,或者想讓自己的開源專案更專業時,你可能會聽到「CI/CD」這個詞。每次 push 程式碼後,自動執行測試、自動檢查程式碼風格、自動部署到伺服器——這些看起來很厲害的自動化流程,其實透過 GitHub Actions 就能輕鬆實現。

本篇文章將帶你認識 GitHub Actions 的核心概念,讓你能夠讀懂專案中的 workflow 設定檔,並撰寫自己的第一個自動化流程。

為什麼需要 CI/CD?

在深入 GitHub Actions 之前,讓我們先理解什麼是 CI/CD。

CI(Continuous Integration,持續整合)

想像一個多人協作的專案:每個人在自己的分支上開發,最後都要合併到主分支。如果沒有自動化檢查,可能會發生:

  • 合併後才發現程式碼有語法錯誤
  • 測試沒跑過就合併,導致功能壞掉
  • 程式碼風格不一致,造成維護困難

CI 的核心理念是:每次程式碼變更都自動執行測試和檢查,及早發現問題。

CD(Continuous Deployment/Delivery,持續部署/交付)

通過 CI 檢查後,CD 負責將程式碼自動部署到測試環境或正式環境,減少人工操作的錯誤和時間成本。

GitHub Actions 是什麼?

GitHub Actions 是 GitHub 內建的自動化平台,讓你可以在特定事件發生時(例如 push 程式碼、建立 Pull Request),自動執行預先定義的任務。

它的優勢包括:

  1. 與 GitHub 深度整合:不需要額外設定第三方服務
  2. 免費額度充足:公開專案無限免費,私有專案每月有免費額度
  3. 豐富的生態系統:有大量現成的 Actions 可以直接使用
  4. YAML 設定:使用易讀的 YAML 格式定義流程

核心概念架構

GitHub Actions 的架構可以用以下層級理解:

Workflow(工作流程)
    └── Job(工作)
            └── Step(步驟)
                    └── Action(動作)

讓我們逐一解析。

Workflow(工作流程)

Workflow 是最上層的概念,代表一個完整的自動化流程。它定義了:

  • 何時執行(Event trigger)
  • 執行什麼(Jobs)

每個 Workflow 對應一個 YAML 檔案,存放在 .github/workflows/ 目錄下。

# .github/workflows/ci.yml
name: CI Pipeline  # Workflow 的名稱

on: push  # 觸發條件:當有 push 時執行

jobs:  # 定義要執行的工作
  # ... jobs 內容
Code language: PHP (php)

Job(工作)

一個 Workflow 可以包含多個 Job,每個 Job 代表一組相關的任務。

重點特性:

  • 預設平行執行:多個 Job 會同時執行
  • 獨立環境:每個 Job 在獨立的 Runner 上執行
  • 可設定相依性:透過 needs 讓 Job 按順序執行
jobs:
  test:  # Job 的 ID
    name: Run Tests  # Job 的顯示名稱
    runs-on: ubuntu-latest  # 執行環境
    steps:
      # ... steps 內容

  deploy:
    name: Deploy
    runs-on: ubuntu-latest
    needs: test  # 等 test job 完成後才執行
    steps:
      # ... steps 內容
Code language: PHP (php)

Step(步驟)

Step 是 Job 中的最小執行單位,按順序執行。每個 Step 可以是:

  • 執行 shell 指令:使用 run
  • 使用現成的 Action:使用 uses
steps:
  - name: Checkout code  # 步驟名稱
    uses: actions/checkout@v4  # 使用官方 checkout action

  - name: Install dependencies
    run: npm install  # 執行 shell 指令

  - name: Run tests
    run: npm test
Code language: PHP (php)

Runner(執行器)

Runner 是實際執行 Job 的虛擬機器。GitHub 提供多種 hosted runner:

Runner 說明
ubuntu-latest Ubuntu Linux,最常用
windows-latest Windows Server
macos-latest macOS
jobs:
  build:
    runs-on: ubuntu-latest  # 指定使用 Ubuntu runner
Code language: PHP (php)

Event Triggers(觸發事件)

Workflow 透過 on 關鍵字定義何時觸發。以下是常見的觸發事件:

push 和 pull_request

最常用的兩個事件:

on:
  push:
    branches: [main, develop]  # 只在這些分支 push 時觸發
  pull_request:
    branches: [main]  # 只在對 mainPR 時觸發
Code language: CSS (css)

schedule(定時執行)

使用 cron 語法設定定時任務:

on:
  schedule:
    - cron: '0 0 * * *'  # 每天午夜執行
Code language: PHP (php)

workflow_dispatch(手動觸發)

允許在 GitHub 介面上手動觸發:

on:
  workflow_dispatch:  # 啟用手動觸發按鈕
Code language: PHP (php)

常用的官方 Actions

GitHub 和社群提供了大量現成的 Actions,以下是最常見的幾個:

actions/checkout

幾乎每個 Workflow 都需要的 Action,將程式碼 checkout 到 Runner:

- uses: actions/checkout@v4

actions/setup-node

設定 Node.js 環境:

- uses: actions/setup-node@v4
  with:
    node-version: '20'  # 指定 Node.js 版本
Code language: PHP (php)

actions/cache

快取依賴項,加速執行時間:

- uses: actions/cache@v4
  with:
    path: ~/.npm
    key: npm-${{ hashFiles('package-lock.json') }}
Code language: PHP (php)

實作:建立第一個 Workflow

讓我們實際建立一個簡單的 CI workflow。

步驟 1:建立目錄結構

在專案根目錄建立 .github/workflows/ 資料夾:

mkdir -p .github/workflows

步驟 2:建立 workflow 檔案

建立 .github/workflows/ci.yml

name: CI

on:
  push:
    branches: [main]
  pull_request:
    branches: [main]

jobs:
  build:
    name: Build and Test
    runs-on: ubuntu-latest

    steps:
      - name: Checkout repository
        uses: actions/checkout@v4

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '20'

      - name: Install dependencies
        run: npm ci

      - name: Run linter
        run: npm run lint

      - name: Run tests
        run: npm test
Code language: HTTP (http)

步驟 3:理解這個 Workflow

讓我們逐行解讀:

  1. name: CI:Workflow 的名稱,會顯示在 GitHub Actions 頁面
  2. on:定義觸發條件
    • 當 push 到 main 分支時觸發
    • 當對 main 分支發 PR 時觸發
  3. jobs.build:定義一個名為 build 的 Job
    • runs-on: ubuntu-latest:使用 Ubuntu 環境執行
  4. steps:定義執行步驟
    • checkout 程式碼
    • 設定 Node.js 環境
    • 安裝依賴
    • 執行 linter
    • 執行測試

步驟 4:查看執行結果

Push 程式碼後,可以在 GitHub 的 Actions 頁面查看執行狀態:

  1. 進入專案頁面
  2. 點擊上方的 “Actions” 標籤
  3. 選擇對應的 Workflow 查看詳細日誌

YAML 語法重點

GitHub Actions 使用 YAML 格式,以下是一些常見的語法:

縮排

YAML 使用空格縮排(不能用 Tab),通常使用 2 個空格:

jobs:
  build:        # 2 空格縮排
    steps:      # 4 空格縮排
      - name:   # 6 空格縮排
Code language: PHP (php)

陣列

使用 - 表示陣列項目:

branches:
  - main
  - develop

或使用行內格式:

branches: [main, develop]
Code language: CSS (css)

多行字串

使用 | 保留換行:

- name: Multiple commands
  run: |
    echo "Line 1"
    echo "Line 2"
    npm install
Code language: PHP (php)

總結

本篇介紹了 GitHub Actions 的核心概念:

  1. Workflow:定義自動化流程的 YAML 檔案
  2. Job:Workflow 中的工作單位,預設平行執行
  3. Step:Job 中按順序執行的步驟
  4. Runner:執行 Job 的虛擬機器環境
  5. Event:觸發 Workflow 的事件

理解這些概念後,你就能讀懂大多數專案中的 workflow 設定檔,也能開始建立自己的自動化流程。

下一篇我們將深入探討如何使用 Secrets 管理敏感資訊,以及如何設定環境變數。

延伸閱讀

進階測驗:認識 GitHub Actions 核心概念

測驗目標:驗證你是否能在實際情境中應用所學。
共 5 題,包含情境題與錯誤診斷題。

1. 你負責一個 Node.js 專案,希望在每次 push 到 main 分支或對 main 發 PR 時,自動執行 lint 和測試。以下哪個 workflow 設定最符合需求? 情境題

  • A. on: push 只設定 push 事件
  • B. on: { push: { branches: [main] }, pull_request: { branches: [main] } }
  • C. on: workflow_dispatch 手動觸發
  • D. on: schedule 定時執行

2. 你的 CI 流程需要先執行測試(test job),測試通過後才能部署(deploy job)。應該如何設定 deploy job? 情境題

jobs: test: runs-on: ubuntu-latest steps: – uses: actions/checkout@v4 – run: npm test deploy: runs-on: ubuntu-latest # 這裡需要加什麼設定? steps: – uses: actions/checkout@v4 – run: npm run deploy
  • A. 加上 depends-on: test
  • B. 加上 after: test
  • C. 加上 needs: test
  • D. 不需要額外設定,Job 預設會按順序執行

3. 你想在 Step 中執行多條 shell 指令,以下哪種寫法是正確的? 情境題

  • A. 使用 run: npm install; npm test 用分號分隔
  • B. 每條指令寫成獨立的 Step
  • C. 使用 run: ["npm install", "npm test"] 陣列格式
  • D. 使用 run: | 加上多行指令(每行一條)

4. 小明建立了以下 workflow 檔案,但 GitHub Actions 沒有執行。最可能的原因是什麼? 錯誤診斷

# 檔案位置:.github/workflow/ci.yml name: CI on: push jobs: build: runs-on: ubuntu-latest steps: – uses: actions/checkout@v4 – run: npm test
  • A. 目錄名稱錯誤,應該是 .github/workflows/(複數)
  • B. 缺少 branches 設定
  • C. runs-on 應該使用 ubuntu-22.04 而非 ubuntu-latest
  • D. 缺少 name 屬性在 steps 中

5. 以下 workflow 設定有語法錯誤,導致無法執行。問題出在哪裡? 錯誤診斷

name: CI on: push jobs: build: runs-on: ubuntu-latest steps: – uses: actions/checkout@v4
  • A. on: push 應該改成 on: [push]
  • B. YAML 縮排錯誤:runs-onsteps 應該在 build: 下方縮排
  • C. 缺少 name 屬性在 build job 中
  • D. actions/checkout@v4 版本太新,應使用 v3

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *