GitHub Actions workflow_dispatch 的 boolean 為何要用 inputs context
手動執行 GitHub Actions 時,workflow_dispatch 的 checkbox 看起來像 boolean;真正容易踩到的地方,是 workflow 裡有兩個地方都能讀到它:inputs 和 github.event.inputs。它們值相同,但型別不完全相同。
結論是:**在條件式需要 boolean 時,優先使用 inputs.<name>;不要把 github.event.inputs.<name> 當成同型別的替代品。**GitHub 文件指出前者會保留 boolean,後者會把 input 轉成字串。
定義一個手動部署開關
name: Deploy
on: workflow_dispatch: inputs: deploy_production: description: Deploy to production required: true type: boolean default: false environment: description: Target environment required: true type: choice options: - staging - production
jobs: deploy: runs-on: ubuntu-latest if: ${{ inputs.deploy_production }} steps: - run: ./scripts/deploy-production.shinputs.deploy_production 在這裡是 boolean,因此未勾選時 job 不會執行。choice 則解析為字串,適合拿來選 environment,但不應被誤當作多個 checkbox 的替代品。
為何字串會讓條件式難讀
事件 payload 裡也能讀到 github.event.inputs.deploy_production,但它是字串。若一定要使用它,必須明確比較:
if: ${{ github.event.inputs.deploy_production == 'true' }}這不是說 event context 錯了;它適合用於記錄原始事件或與其他 payload 欄位一起處理。問題出在把字串欄位拿去寫「是否執行」的條件,讀者很難一眼看出型別,也容易在重構時做出不對稱的比較。
把手動輸入和部署保護分開
checkbox 只是操作者的意圖,不是 production 的授權控制。手動 workflow 還應搭配 environment protection、最小化 GITHUB_TOKEN permissions 與部署前驗證。可把流程拆成兩層:
| 層級 | 作用 |
|---|---|
workflow_dispatch.inputs | 收集本次要跑什麼,例如 environment、dry run、是否允許 production |
| environment protection / permissions | 決定這個 job 是否真的可取得 production secret 與寫入權限 |
例如不要因為有人勾選 deploy_production,就讓同一個 job 自動擁有所有 repository 或雲端權限。把 deployment job 指向受保護的 environment: production,再為它明確給出需要的 scopes。
發布前的最小測試
對這種 workflow,我會至少手動跑兩次:一次不勾 production 開關,確認 deploy job 被略過;另一次在受控環境勾選,確認 environment approval、secret 與輸出符合預期。若 workflow 檔不在 default branch,GitHub 也不會讓 workflow_dispatch 觸發可用,這是另一個常被誤認成 YAML 錯誤的前置條件。
若你的手動 workflow 同時使用 cache,請別把輸入參數當成 cache 信任來源;可接著看 GitHub Actions cache 的 restore-keys 安全邊界。
參考資料:
回報錯字、失效連結,或告訴我你想看的延伸主題。