GH-200 數位教科書 開啟互動版

D3:撰寫與維護 actions

D3-O1 建立與疑難排解自訂 actions

自訂 action 是把一段可重用的自動化包起來,讓工作流程在步驟層級用 uses: 呼叫。官方把 action 分成三種類型,選型的第一個問題是「它要在哪些作業系統的 runner 上跑」。

三種 action 類型

類型 可以跑在 適合 要留意
Docker 容器 action 只有 Linux runner;自管 runner 需安裝 Docker 需要特定環境、語言或系統工具 啟動比較慢;在 macOS、Windows runner 上無法執行
JavaScript action Linux、macOS、Windows 需要跨平台、啟動快、用 toolkit 呼叫 API 為了相容所有 GitHub 代管 runner,程式碼應是純 JavaScript,不依賴其他二進位檔
複合(composite)action Linux、macOS、Windows 把多個步驟包成一個 action 不含 job;跑在呼叫它的 job 的機器上;不能直接用 secrets context

JavaScript action

Docker 容器 action

複合 action

不可變 release(與「不可變 actions」)

官方的 immutable releases 說明:發佈之後,release 的 Git 標籤與資產都不能再更動——標籤被鎖定在特定 commit,不能移動,且在該 release 存在時不能刪除;資產(二進位檔、封存檔)不能修改或刪除;標題、發行說明與是否為 pre-release/latest 仍可編輯。刪掉 release 之後可以刪標籤,但不能重複使用標籤名稱。建立不可變的 release 會自動產生記錄標籤、commit SHA 與資產的 release attestation。

官方 Study Guide 同時提到「不可變 actions(immutable actions)在 GitHub 代管 runner 的推出,與它對版本固定與 registry 來源的影響」。我找不到可核對的官方頁面(先前猜的網址回 404,搜尋也只找到第三方文章),所以本站不寫這部分的細節,備考前請在官方頁面確認。

疑難排解 action 的執行

判斷練習

情境 A: 你要寫一個 action,團隊同時用 Ubuntu、Windows 與 macOS 的 runner,邏輯是呼叫 REST API 並整理結果。

解析: 用 JavaScript action(或把步驟包成複合 action)。Docker 容器 action 只能在 Linux runner 執行,Windows 與 macOS 會失敗。

情境 B: 同事把 node_modules 提交進 action 的 repository,說這樣使用者不用另外安裝。

解析: 官方說明提交 node_modules 可能造成問題。改成用 rollup.js 或 @vercel/ncc 把程式碼與相依套件打包成 dist/index.js 並提交,main 指向它。

情境 C: 複合 action 的某個步驟用 run: ./cleanup.sh,但被標為無效。

解析: 複合 action 內有 run 的步驟必須指定 shell(例如 shell: bash)。

來源:About custom actions(GH200-DOC-23)、Metadata syntax(GH200-DOC-24)、Create a JavaScript action(GH200-DOC-25)、Create a composite action(GH200-DOC-26)、Immutable releases(GH200-DOC-30)、Workflow commands(GH200-DOC-03);2026-11-03 以頁面原文比對本節的數字與條件。Docker 容器 action 的教學頁面回 404,沒有讀到;「不可變 actions」沒有可核對的官方頁面。

D3-O2 定義 action 結構與中繼資料

必要的檔案與位置

inputs 與 outputs

項目 規則
輸入 description 每個輸入都需要
輸入 required 選填的布林值;設成 true 並不會自動在缺值時報錯
輸入 default 選填字串,工作流程沒提供該輸入時使用
輸入 deprecationMessage 選填;使用該輸入時以警告記錄
輸出(JavaScript、Docker) 每個輸出需要 description;沒有 value 鍵
輸出(composite) 還需要 value,指向字串或運算式(例如某個步驟的輸出)
輸出大小 每個 job 1 MB、每次工作流程執行合計 50 MB

在 action 內使用工作流程命令

action 靠工作流程命令與環境檔跟執行器溝通:寫入 $GITHUB_OUTPUT 設定輸出,$GITHUB_ENV 設定後續步驟的環境變數,$GITHUB_PATH 擴充 PATH,$GITHUB_STEP_SUMMARY 寫入工作摘要;::add-mask:: 遮蔽值,::error、::warning、::notice 建立註解。toolkit 函式與它們的對應是:core.setOutput 對應 GITHUB_OUTPUT,core.saveState 對應 GITHUB_STATE。細節見領域一。

品牌(branding)

選填的 branding 控制 Marketplace 上的圖示:color 可用 white、black、yellow、blue、green、orange、red、purple、gray-dark;icon 是 Feather 圖示名稱(部分圖示,包括品牌圖示,不在支援清單內)。

判斷練習

情境 A: 複合 action 宣告了輸出 result,但沒有 value,呼叫端拿不到值。

解析: 複合 action 的輸出必須有 value,並指向步驟的輸出,例如 ${{ steps.calc.outputs.result }};產生輸出的步驟要有 id 並寫入 $GITHUB_OUTPUT。JavaScript 與 Docker action 的輸出則只需要 description。

情境 B: 輸入 token 設了 required: true,使用者沒傳值,action 卻照常執行並在後面才出錯。

解析: required: true 不會自動讓缺值報錯。action 要自己檢查輸入,必要時 core.setFailed。

來源:Metadata syntax(GH200-DOC-24)、About custom actions(GH200-DOC-23)、Publish in GitHub Marketplace(GH200-DOC-28)、Workflow commands(GH200-DOC-03);2026-11-03 以頁面原文比對本節的數字與條件。

D3-O3 散布與維護 actions

三種散布模式

模式 做法 要記住
公開 放在公開 repository,任何人都能用 要讓所有人使用,repository 必須是公開的
私有 放在私有 repository,在 Settings → Actions → General → Access 開放給其他 repository 使用 runner 以範圍受限的安裝權杖下載,只有該 repository 的讀取權限,一小時後自動過期
Marketplace 公開 repository,發佈 release 時選擇發佈到 GitHub Marketplace 見下方條件

私有 repository 的共用有一個安全注意:若讓其他 repository 的工作流程能存取私有 repository,那些 repository 的外部協作者也能間接存取它,並且可以看到使用該 action 或工作流程的工作流程執行日誌。官方這一頁只寫了「使用者帳號擁有的 repository」那個選項;組織與企業層級的選項(例如只開放給同組織)這次沒有在所讀頁面讀到,請在官方頁面確認。

發佈到 GitHub Marketplace

版本與發佈策略

判斷練習

情境 A: 你維護的 action 剛發佈 v1.4.0,要讓釘在 v1 的使用者自動取得,但他們不應該被破壞性變更影響。

解析: 發佈 v1.4.0 的 release,並把 v1 與 v1.4 標籤移到這個 commit。主版本標籤只應指向相容的版本;破壞性變更要發 v2。

情境 B: 你的組織啟用了 immutable releases,之後發佈流程在移動 v1 標籤時失敗。

解析: 不可變 release 鎖定標籤到特定 commit,無法被移動,所以不能再用強制推送去移動綁定 release 的標籤。需要調整版本策略(例如讓使用者釘到具體版本標籤或 SHA)。

情境 C: 你想把 action 發佈到 Marketplace,但 Publish 核取方塊是灰的。

解析: 檢查帳號是否已接受 GitHub Marketplace Developer Agreement;其他條件包括 repository 公開、根目錄單一 action.yml、name 唯一,以及雙因素驗證。

來源:Release and maintain actions(GH200-DOC-27)、Publish in GitHub Marketplace(GH200-DOC-28)、Share across private repositories(GH200-DOC-29)、Immutable releases(GH200-DOC-30)、Reuse workflows(GH200-DOC-08);2026-11-03 以頁面原文比對本節的數字與條件。