跳至主要内容

GitHub Actions - 基本建構塊與組件

Key Components: Workflows, Jobs, Steps & More

Workflow > Job > Step

Workflow

一個 Workflow 包含一個以上的 Job。
Workflow 可以手動執行,也可以藉由事件觸發自動執行。

Job

Job 用以定義 Runner(執行環境)
一個 Job 包含一個以上的 Step。在預設情況下,Job 採平行執行,但也可更改為按順序執行。
Job 也可根據事先設定的條件決定執行與否。

Step

Step 用以執行 action(shell script) 開發者可以自訂 Action,也可使用第三方編寫的 Action。 Step 依照順序執行,且可以設定執行條件。

Creating a First Workflow

在未曾建立 Workflow 的 GitHub 儲存庫首頁,點擊畫面上方工具列的 action,
然後可以選擇適合的 Workflow 樣版,並以此為基礎編寫 Workflow。
編輯介面的上方有 Workflow 在專案的儲存路徑及檔案名稱。
通常不會更改儲存路徑,檔案名稱則可自由變更。 決定 Workflow 檔案名稱後,可參考以下範例編寫:

first-workflow.yml
# 為 Workflow 命名
name: First Workflow

# 將 Workflow 的執行條件設定為手動執行
on: workflow_dispatch

# 定義 jobs,注意必須是複數形。
jobs:
# 定義 job 名稱,非關鍵詞。
first-job:
# 定義 job 的執行環境(runner)
runs-on: ubuntu-latest
# 定義 steps,注意必須是複數形。
steps:
- name: Print greeting
run: echo "Hello World!"
- name: Print goodbye
run: echo "Done - bye!"
GitHub Actions 官方文件

Running the First Workflow

在 GitHub 線上編輯 Workflow 後,可點擊畫面右側的 Commit changes...

Running Multi-Line Shell Commands

若需要執行多行 Shell 指令,可在指令的上一行結尾添增 pipe symbol,範例如下。

run: |
echo "First output"
echo "Second output"

A New Workflow & The "push" Event

除了在 GitHub 介面建立 Workflow,也可在本地專案資料夾內建立 Workflow 再上傳至遠端。 此時必須在專案根目錄建立專屬目錄及檔案。

終端機指令
mkdir .github
mkdir .github/workflows
touch .github/workflows/fileName.yml

編寫 Workfile

Workflow Triggers (Events)

在 GitHub Actions 有許多事件可觸發 Workflow,事件大致分為兩類,
一類與 GitHub 儲存庫相關,另一類則與儲存庫無關。
下圖是一些常用的事件,詳情則可參考圖片下的官方文件連結。 Workflow Triggers

GitHub Actions 官方文件

Using Actions In Workflows

Action 可以是 Shell Command,也可以是自己或第三方編寫的應用程式,
後者可在 GitHub Marketplace 搜尋並檢視其使用說明。 Checkout 即是一個常用的第三方 Action。

Checking Out Code In Workflows

Shell Command 以關鍵詞 run 執行,Action 應用程式則以關鍵詞 uses 執行。

# run Shell Command
run: echo "Hellow"

# uses Action
uses: actions/someApplication@Version

Configuring Actions

程式語言需要有對應的執行環境才能運行,在 Workflow 當中也不例外。
如果 Job Runner 未預先安裝專案所需的執行環境,就要在 steps 當中編寫安裝執行環境的代碼。
以前述範例「first-workflow.yml」為例,由於檔案中指定以 ubuntu(runs-on: ubuntu-latest)為伺服器,
而 ubuntu-latest 有預先安裝 Node.js,因此不需安裝 Node.js。
若需要安裝執行環境,可在 steps 之下編寫以下代碼。

      - name: Install NodeJS
uses: actions/setup-node@v3
with:
node-version: 18

Jobs: In Parallel vs Sequential

在 job 名稱與 runs-on 之間編寫「needs: previousJobName」,
如此該 job 會在指定的 previous job 完成後才執行,而非與其他 job 平行執行。

Jobs in sequential 範例
jobs:
job1:
runs-on: ubuntu-latest
steps:
# Write step detail
job2:
needs: jobName
runs-on: ubuntu-latest

Using Multiple Triggers (Events)

Workflow 中的 on 可加入多個描述,如此可使 Workflow 因多種事件而執行。

name: My Workflow
on: [push, workflow_dispatch, ...]

Expressions & Context Objects

利用 Workflow 執行 Shell Command 時,可以利用 echo ${{}} 印出 Context Object。
下列範例代碼中,toJSON() 是 Expression,用以將輸出結果轉為易讀的 JSON 格式。 Context Object 及 Expression 的詳細說明可參考代碼下的官方文件。

GitHub Actions Context Objects & Expressions 範例代碼
        steps:
- name: Output GitHub context
run: echo "${{toJSON(github)}}"