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

GH-200 名詞庫

D1 撰寫與管理工作流程

schedule
以 cron 設定的定時觸發,只在預設分支的檔案上執行;最短間隔每 5 分鐘,高負載時可能延遲,公開 repository 60 天無活動會停用。
workflow_dispatch
手動觸發,可定義 inputs;只在預設分支的檔案上可用,最多 25 個頂層 input、資料量不超過 65,535 個字元。
workflow_call
讓工作流程可被其他工作流程呼叫的事件,在 inputs 與 secrets 底下宣告可接受的參數。
repository_dispatch
由外部以 API 送出的自訂事件;event_type 最多 100 個字元,client_payload 最多 10 個頂層屬性。
pull_request
PR 事件,預設只在 opened、synchronize、reopened 執行;GITHUB_SHA 是 PR 的合併 commit。
pull_request_target
在基底 repository 預設分支的 context 執行的特權觸發條件,可取得 secrets;不要搭配 checkout 不受信任的 PR 程式碼。
GITHUB_SHA
觸發執行的 commit;pull_request 是合併 commit,schedule 與 workflow_run 是預設分支的最後 commit。
GITHUB_REF
觸發執行的 ref;pull_request 是 refs/pull/編號/merge,schedule 是預設分支。
permissions
設定 GITHUB_TOKEN 權限,可放在工作流程或 job 層;只要明確設定其中一項,沒列出的權限都變成 none。
inputs context
保留 boolean 型別的輸入值 context,可直接用在條件。
github.event.inputs
舊式輸入值 context,會把 boolean 轉成字串,所以與 false 比較永遠不成立。
needs
建立 job 相依;被需要的 job 失敗或略過時,依賴它的 job 也會被略過。
always()
狀態檢查函式,用在 job 的 if 時,無論相依 job 結果如何都執行。
context 可用位置
不同位置可用的 context 不同,例如 jobs.<id>.if 可用 github、needs、vars、inputs,不含 secrets 與 env。
vars context
讀取組織、repository、環境層級設定變數的 context,未設定時是空字串。
steps outcome
套用 continue-on-error 之前的步驟結果。
steps conclusion
套用 continue-on-error 之後的步驟結果。
strategy.matrix
依變數組合展開成多個 job;每次執行最多 256 個 job。
include
矩陣的擴充:加進所有不衝突的原始組合,會覆寫既有值時成為獨立的新組合。
exclude
從矩陣移除特定組合,可只寫部分欄位比對。
fail-fast
啟用時,一個 continue-on-error 為 false 的組合失敗,所有進行中與排隊的 job 都被取消。
max-parallel
限制同時執行的矩陣 job 數量。
服務容器 services
在 job 內宣告的相依服務;job 在容器內用標籤當主機,直接在 runner 上用 localhost 並設定 ports。
快取鍵 key
快取的識別;查找順序為完全相同、key 前綴、restore-keys;快取不可變,要更新就用新鍵。
restore-keys
找不到完全相同的 key 時依序比對的備援鍵。
成品 artifact
在 job 之間或執行之後保存的檔案;v4 不可變,預設保留 90 天。
GITHUB_ENV
寫入後讓之後的步驟取得環境變數;寫入的那一步看不到。
GITHUB_OUTPUT
寫入步驟輸出,步驟需有 id,用 steps.<id>.outputs 讀取。
GITHUB_STEP_SUMMARY
寫入工作摘要的 Markdown 檔,每個步驟上限 1 MiB。

D2 使用與疑難排解工作流程

Search logs
日誌頁的搜尋,只搜尋已展開的步驟。
Download log archive
從日誌頁下載封存檔;只重跑部分 job 時,封存檔只含重跑的 job。
gh run view
用命令列看執行日誌;--log 看整次,--log-failed 只看失敗步驟。
ACTIONS_STEP_DEBUG
設為 true 讓步驟日誌更詳細,並顯示 ::debug:: 訊息。
ACTIONS_RUNNER_DEBUG
設為 true 啟用 runner 診斷記錄,封存檔多出 runner-diagnostic-logs 資料夾。
Enable debug logging
重新執行時勾選,同時啟用 runner 診斷與步驟除錯;CLI 用 --debug。
runner.debug
context,可讓步驟只在除錯記錄啟用時執行。
Re-run failed jobs
只重跑失敗的 job;沿用原本的 GITHUB_SHA 與 GITHUB_REF。
gh run rerun
命令列重跑;加 --failed 只重跑失敗的 job,加 --job 重跑單一 job。
重新執行的限制
初次執行後 30 天內、最多重跑 50 次;工作流程被停用時不能重跑。
成品下載端點
REST 下載成品,archive_format 必須是 zip,回應 302 導向。
Location 網址
下載導向的網址,只有 1 分鐘有效。
expired 與 expires_at
成品物件的欄位,用來判斷是否已被保留期清掉。
gh run delete
命令列刪除整次執行;刪除執行時它的成品也一併刪除。
可重用工作流程
在 job 層級用 uses 呼叫整個工作流程檔,可用 secrets,最多 10 層,不能發佈到 Marketplace。
複合 action
在步驟層級呼叫的一組步驟,跑在呼叫它的 job 的機器上,不能直接用 secrets。
起始工作流程
新工作流程的起點範本,複製後就是自己的獨立檔案。
workflow-templates
組織 .github repository 中放起始工作流程範本的目錄。
.properties.json
範本的中繼資料檔,name 與 description 必填。
$default-branch
範本內的佔位符,建立時被換成 repository 的預設分支名。
Disable workflow
停用工作流程使其不再觸發;不會取消進行中的執行,停用期間不能重跑。
github.event_name
辨認這次執行由哪個事件觸發的欄位。

D3 撰寫與維護 actions

Docker 容器 action
runs.using 為 docker,只能在 Linux runner 執行,啟動較慢。
JavaScript action
runs.using 為 node20 或 node24,可跨 Linux、macOS、Windows,啟動快。
composite(runs.using)
把多個步驟包成一個 action,每個有 run 的步驟必須指定 shell。
action.yml
action 的中繼資料檔,也可命名為 action.yaml,定義輸入、輸出與 runs。
name、description、runs
action.yml 頂層必填的三個鍵;author 與 inputs 是選填。
main
JavaScript action 必填,指向執行的檔案,通常是打包後的 dist/index.js。
pre 與 post
JavaScript action 在 main 前後執行的檔案;pre-if 與 post-if 預設都是 always()。
@actions/core
toolkit 套件,提供輸入輸出、結束狀態與除錯訊息,例如 core.setOutput。
@actions/github
toolkit 套件,回傳已驗證的 Octokit 用戶端並可存取 context。
core.setFailed
記錄訊息並設定失敗結束碼,讓 action 失敗。
rollup.js 與 @vercel/ncc
把程式碼與相依套件打包成單一檔案的工具,取代提交 node_modules。
inputs 的 required
只是標記,缺值時不會自動報錯,action 要自己檢查。
inputs 的 default
工作流程沒提供該輸入時使用的字串。
deprecationMessage
輸入被使用時以警告記錄的訊息。
複合 action 的 value
複合 action 輸出必填的鍵,指向某個步驟的輸出。
github.action_path
指向 action 所在目錄的路徑,可用來呼叫目錄內的指令碼。
branding
選填,控制 Marketplace 的圖示與顏色。
私有 action 共用
在私有 repository 的 Settings → Actions → General → Access 開放給其他 repository。
GitHub Marketplace 發佈
要公開 repository、根目錄單一 action.yml、name 唯一,且帳號接受開發者協議;符合條件即立即發佈,不經 GitHub 審核。
主版本標籤
如 v1,要指向最新且相容的 commit,使用者釘在 v1 就能取得相容更新。
immutable release
發佈後標籤與資產不能更動;鎖定的標籤不能移動,也不能強制推送。
語意化版本
以 v1.1.3 這類標籤建立 release,並維持主、次版本標籤。

D4 管理企業的 GitHub Actions

允許的 actions 政策
組織可選全部啟用、停用,或限制為組織自己的加選定來源。
只允許組織自己的 actions
會封鎖所有 GitHub 作者的 actions,包含 actions/checkout。
樣式語法
OWNER/REPO@TAG-OR-SHA;* 為萬用字元,! 開頭表示封鎖,最多 1000 個樣式。
要求固定完整 commit SHA
適用於組織與 GitHub 作者的 actions;可重用工作流程仍可用標籤。
本機 action
以 ./ 路徑參照的 action,不受企業或組織 Actions 政策限制。
企業政策覆蓋
企業啟用的政策下層可選擇停用;企業停用的政策下層不能再啟用。
fork PR 核准政策
公開 repository 的外部協作者可設需要核准;預設所有首次貢獻者需核准,pull_request_target 一律執行。
預設 GITHUB_TOKEN 權限
新組織對 contents 與 packages 預設唯讀;企業更嚴格時組織不能選更寬鬆。
建立與核准 PR 設定
Allow GitHub Actions to create and approve pull requests,預設停用。
保留期
預設 90 天,公開 repository 可設 1–90 天,私有與 internal 可設 1–400 天。
快取保留與容量
預設 7 天與每個 repository 10 GB;企業可設上限。
自訂映像
只能搭配 larger runners 使用,儲存另計入 Actions 儲存。
larger runners
有更多核心或 GPU 的 GitHub 代管 runner,用於 Team 與 Enterprise Cloud。
靜態 IP 位址範圍
larger runners 的選用功能,需 Enterprise Cloud,macOS 不支援。
最大並行數
larger runners 同時可執行的 job 上限。
自管 runner
自己部署與維護的 runner,job 之間狀態可能殘留,有 repository、組織、企業三種範圍。
自管 runner 連線需求
出站 HTTPS 443、至少 70 kbps,並連到 github.com、api.github.com 等網域;使用 IP 允許清單要加入 runner 的 IP。
runner 自動更新
預設啟用;停用後必須在新版釋出後 30 天內更新,否則 GitHub 不再排 job 給它。
暫時性 runner
註冊時用 --ephemeral,執行一個 job 後取消註冊,日誌要轉送外部。
runner 群組
組織有預設群組;群組預設只開放私有 repository,可覆寫。
job 如何選 runner
標籤與群組都符合的線上閒置 runner;60 秒沒接起會重新排隊,排隊超過 24 小時失敗。
runner 狀態
Idle 為閒置、Active 為執行中、Offline 為未連線。
_diag 日誌
runner 安裝目錄中的日誌:Runner_、Worker_、SelfUpdate。
config --check
檢查網路連線,需搭配 --url 與 --pat。
secrets 層級
組織、repository、環境三層;同名時環境優先於 repository 與組織。
環境 secret 與審核
啟用必要審核者時,核准前 job 拿不到環境 secret。
variables
設定變數,用 vars context 讀取,不遮蔽,不要放機密。
secret 的限制
不能直接用在 if;fork 與 Dependabot 觸發的工作流程拿不到;不會自動傳給可重用工作流程。
REST 設定 secret
用 LibSodium 以公鑰加密,PUT 時帶 encrypted_value 與 key_id。
超過 48 KB 的 secret
官方做法是用 gpg 加密檔案並把密碼存成 secret;日誌不會被遮蔽。

D5 保護與最佳化自動化

script injection
${{ }} 在 shell 執行前被替換成文字,不受信任的值可能變成指令;用中間環境變數或改用 action 防範。
中間環境變數
把運算式的值設成 env,指令碼內以 $NAME 引用,值不會成為指令碼語法。
環境 environment
含保護規則、secrets 與 variables 的部署目標;job 通過規則才會執行。
必要審核者
最多 6 個人或團隊,其中一人核准即可。
防止自我審核
阻止使用者核准自己觸發的執行。
等待計時器
job 在環境上繼續之前的延遲,以分鐘計。
部署分支與標籤
限制哪些分支與標籤可以部署到該環境,兩者分別設定。
管理員繞過
預設管理員可繞過環境保護規則,可在設定中取消。
Verified creator
Marketplace 上身分已驗證的徽章,是有用訊號,但不能取代檢視原始碼。
完整 commit SHA 固定
標籤可被移動或刪除,SHA 不會;要確認 SHA 來自原 repository 而非 fork。
lockfile
鎖定工作流程相依項目的確切 commit,官方說對採用者取代 SHA 固定。
Dependabot 與 actions
version updates 開 PR 更新 actions;alerts 不涵蓋釘在 SHA 的 actions。
CODEOWNERS
把 .github/workflows 加入,讓工作流程修改需指定審核者核准。
OpenSSF Scorecards
自動標出風險做法的工具,檢查包含 script injection、權杖權限與固定版本。
GITHUB_TOKEN 生命週期
每個 job 開始建立;代管 runner 最長 6 小時,自管 runner 最多更新到 24 小時。
GITHUB_TOKEN 與 PAT
前者限單一 repository 且通常不觸發新執行;跨 repository 或需觸發時用 GitHub App 權杖或 PAT。
OIDC
以短期權杖取代雲端長期憑證;雲端端必須定義信任條件。
id-token: write
允許工作流程請求 OIDC 權杖,不給任何資源的寫入權限。
sub claim
OIDC 權杖的主體,預設如 repo:組織/儲存庫:environment:環境名稱,可用 REST 自訂。
OIDC 簽發者與受眾
簽發者是 token.actions.githubusercontent.com;預設受眾是 repository 擁有者的網址。
artifact attestation
對建置來源的簽章聲明,用 actions/attest 產生,需 id-token、contents、attestations 權限。
SLSA Build Level
單獨使用證明為 Level 2;在共用可重用工作流程建置可達 Level 3。
gh attestation verify
消費者驗證成品證明的指令,搭配 -R 組織/儲存庫。
concurrency
同群組只同時執行一個;群組名稱不分大小寫,cancel-in-progress 取消執行中的。
queue: max
最多 100 個等待中的執行,不能與 cancel-in-progress: true 同時使用。
job 時間上限
GitHub 代管 runner 6 小時、自管 runner 5 天;整次執行最長 35 天。
方案內含用量
是金額而非分鐘數;標準代管 runner 在公開 repository 免費,larger runners 要計費。