GitHub Actions 組織 Workflow Template:用 .github 統一新專案 CI 起點
當一個組織開始維護第二個、第五個或第二十個 repository,最先失控的通常不是 workflow 能不能跑,而是每個專案都從不同版本的 CI YAML 複製開始。有人忘了 permissions,有人把 Node 版本寫死在舊版,還有人把部署 secret 直接放進「範例」裡。
GitHub Actions 有一個容易和 reusable workflow 混淆的功能:組織可以在名為 .github 的 repository 中建立 workflow-templates,讓有權限建立 workflow 的成員從共同起點新增 YAML。 Template 是建立時的起始檔案,不會自動回推更新已存在的 workflow;需要中央維護和持續套用時,應再評估 reusable workflow。
本文依 GitHub 官方目前的 workflow template 文件整理一個最小 CI 範例。範例檔案是示意,沒有在實際 organization 中建立或執行;套用前仍要配合組織的 Actions policy、允許的 action 清單與 repository 權限測試。
Workflow Template 和其他重用方式有什麼不同?
| 方式 | 主要用途 | 現有 repository 會自動收到後續更新嗎? |
|---|---|---|
| Organization workflow template | 建立新 workflow 時提供可選起點 | 不會,建立後就是該 repository 的檔案 |
| Reusable workflow | 把 job/部署流程集中在一個受控 YAML | 會,caller 每次執行都呼叫目前指定的版本 |
| Composite action | 在單一 job step 重用多個步驟 | 會依 action ref 取用,但不能包含多個 jobs |
Template 適合「讓新專案少走彎路」;reusable workflow 適合「讓所有專案執行同一套中央流程」。兩者可以一起用:Template 只負責產生 caller workflow,caller 再呼叫中央 reusable workflow。
如果 caller 需要傳遞 secrets,先對照站內的 secrets: inherit 與 reusable workflow 權限檢查;如果重點是限制誰能觸發 workflow,則應另外閱讀 workflow execution protections 的 ruleset 設計。
先建立組織的 .github repository
GitHub 官方流程的第一步,是在 organization 中建立一個名稱正好為 .github 的 repository。接著在該 repository 建立:
.github/└── workflow-templates/ ├── zeroone-node-ci.yml └── zeroone-node-ci.properties.json如果需要自訂圖示,再把 SVG 放在同一個 workflow-templates 目錄,並在 metadata 的 iconName 參照檔名(不含副檔名)。也可以使用 GitHub 支援的 Octicon;不需要為了 template 另建一個公開 action repository。
Workflow 檔案:把安全預設放進起點
以下 zeroone-node-ci.yml 是一個可再依組織 Node/pnpm 規範調整的起始檔案:
name: Organization Node CI
on: push: branches: [$default-branch] pull_request: branches: [$default-branch]
permissions: contents: read
jobs: check: runs-on: ubuntu-latest steps: - name: Check out repository uses: actions/checkout@v6
- name: Enable Corepack run: corepack enable
- name: Set up Node.js uses: actions/setup-node@v6 with: node-version: '22' cache: pnpm
- name: Install dependencies run: pnpm install --frozen-lockfile
- name: Run checks run: pnpm check$default-branch 是 GitHub workflow template 的特殊 placeholder;建立 workflow 時會替換成該 repository 的 default branch。它不是 shell 變數,也不是要在 template repository 先填成 main。若組織有不同的 package manager、Node 版本或檢查命令,應在 template 裡明確寫出規範,不要要求每個新專案建立後再猜。
範例用固定的 Node 22 當作組織起點,避免把 package manager 版本誤當成 Node 版本。如果各 repository 以 .nvmrc、.node-version 或 package.json 的 Node 欄位管理 runtime,應把 template 的 node-version 改成相應的 node-version-file,並把這個檔案契約寫進新專案規範。這也是 Template 需要先在代表性 repository 試跑的原因:起點一致不等於所有專案的 runtime 契約相同。
Metadata:讓 template 出現在正確的清單
metadata 檔案必須和 workflow 使用相同的基本檔名,副檔名則改成 .properties.json:
{ "name": "ZeroOne Node CI", "description": "Install pnpm dependencies and run the repository checks.", "iconName": "octicon code", "categories": [ "JavaScript", "TypeScript" ], "filePatterns": [ "package.json$", "^pnpm-lock[.]yaml$" ]}這幾個欄位的用途是:
name和description:建立 workflow 時顯示給使用者看的文字。iconName:可使用workflow-templates內的 SVG,或 GitHub 支援的 Octicon。categories:使用 starter-workflows 的一般分類、Linguist language 或支援的 tech stack 名稱。filePatterns:只在 repository root 有檔案符合正規表示式時,讓 GitHub 推薦這個 template。
filePatterns 是推薦條件,不是安全控制,也不是 workflow trigger。它不會阻止使用者手動選擇 template,更不會代替 workflow 裡的 dependency、Node 版本和權限檢查。
從 GitHub UI 使用組織 Template
檔案放進組織 .github/workflow-templates 後,成員在 repository 的 Actions 頁面建立新 workflow 時,就能看到組織提供的 template。建議先用一個測試 repository 驗證:
- repository 的 default branch 名稱不是
main時,確認$default-branch被替換成正確值。 - 有
package.json和pnpm-lock.yaml時,確認filePatterns讓 template 出現在合理的推薦位置。 - 建立後打開實際產生的
.github/workflows/*.yml,確認 placeholder 已被替換、YAML 結構正確。 - 在沒有 secrets 的分支先執行 CI,確認
contents: read足以支援 checkout 與檢查。 - 檢查組織 Actions policy 是否允許
actions/checkout、actions/setup-node或 template 內使用的其他 action。
建立後的 workflow 是 repository 自己的檔案。日後修改 .github repository 裡的 template,不會自動修改已經被複製到各專案的 YAML;這個邊界要在 template description 和團隊文件中明確說出來。
需要中央更新時,改用 Reusable Workflow
如果目標是讓 security check、部署 approval 或 runtime patch 能集中更新,可以讓 template 產生一個 caller:
name: Organization controlled CI
on: push: branches: [$default-branch] pull_request: branches: [$default-branch]
permissions: contents: read
jobs: ci: uses: example-org/platform-workflows/.github/workflows/node-ci.yml@<commit-sha> permissions: contents: read上例把真正的 job 放在另一個 repository 的 reusable workflow,Template 只提供呼叫入口。生產環境應使用受信任的 commit SHA,並在 platform repository 建立 review、測試和變更紀錄;使用 mutable branch 或 tag 會讓 caller 取得未預期的 workflow 版本。
若 reusable workflow 放在 private repository,組織還要設定哪些 private repositories 可以存取它。GitHub 也提醒,允許其他 repository 使用 private action/workflow 時,外部協作者可能透過 workflow log 間接看到該 private repository 提供的內容,因此不能把「共享」當成自動安全隔離。
Template 的安全預設清單
把 template 當成供應鏈入口,而不是漂亮的 YAML 範本。至少做這些檢查:
- 預設
GITHUB_TOKEN只開啟 job 真正需要的 permission,CI 起點通常從contents: read開始。 - 不要在 template 中放 organization secret、API key、registry token 或示範用的真實值。
- 第三方 action 在穩定後 pin 到受信任的 commit SHA,並安排升級窗口。
filePatterns只負責推薦,不要把它當作「只有某類 repository 才能執行」的邏輯。- 如果 template 會呼叫 reusable workflow,把 caller、called workflow、secret 傳遞和 permission 寫成一份測試案例。
- 若組織啟用了 workflow execution protections,確認新 template 的觸發事件不會被政策意外擋下,或反過來繞過應有的人工核准。
這樣的設計可以把新專案的起點標準化,同時保留 repository 對自身程式碼和部署流程的 ownership。Template 解決複製起點,Reusable Workflow 解決中央執行;不要用其中一個工具假裝另一個工具的生命週期。
常見問題
Q: 修改 .github repository 後,所有專案的 workflow 會一起更新嗎?
A: 不會。Organization workflow template 只在使用者建立新 workflow 時提供檔案起點;已建立的 YAML 已經存在目標 repository。要中央更新,請改用 reusable workflow,或另行設計明確的升級流程。
Q: .github repository 要公開嗎?
A: 官方流程的重點是 organization 內有一個名為 .github 的 repository 和 workflow-templates 目錄;可見性和組織方案、權限政策有關。先確認 organization 成員在建立 workflow 時能看見 template,不要直接假設公開 repository 才能運作。
Q: filePatterns 可以限制不符合條件的 repository 使用嗎?
A: 不行。它控制推薦情境,不是存取控制。真正的執行限制應放在 workflow 條件、repository/organization Actions policy 或部署端權限。
Q: Template 裡可以直接使用 actions/checkout@v6 嗎?
A: 可以把它當成官方文件示範的版本起點,但仍要依 organization allowlist、版本支援和自己的測試策略確認。生產環境應記錄 action 版本或 pin SHA,並安排定期升級,而不是永遠複製同一個舊版本。
Q: 什麼時候該用 Composite Action?
A: 如果只是把同一個 job 裡的多個步驟包成一個可重用 step,可以考慮 composite action;如果需要多個 jobs、不同 runner、獨立 log 和 job-level 權限,reusable workflow 更合適。Template 則是建立時的檔案起點。
查證範圍:本文於 2026-09-08 檢查 GitHub 官方 Creating workflow templates、Reusing workflow configurations 與分享 organization workflow 說明;YAML 和 JSON 為示意,未在實際 organization 建立或執行。
參考資料:
GitHub Docs:Creating workflow templates for your organization
GitHub Docs:Reusing workflow configurations
GitHub Docs:Sharing actions and workflows with your organization
回報錯字、失效連結,或告訴我你想看的延伸主題。