如何用GitHub组织变量填充workflow_dispatch选择输入选项?
解决GitHub Actions中用组织级变量填充workflow_dispatch choice选项的问题
问题重现
我尝试在组织内的GitHub Actions工作流中,用组织级变量ENV_LIST(合法JSON数组字符串)填充workflow_dispatch的choice输入选项,配置如下:
on: workflow_dispatch: inputs: ENVIRONMENT: required: true type: choice description: "The environment of the deployment" options: ${{ fromJSON(vars.ENV_LIST) }}
但配置无法正常工作:GUI切换到对应分支会自动切回主分支,用gh workflow run执行返回500错误。
核心原因
GitHub Actions的on.workflow_dispatch.inputs.*.options属于工作流静态配置段,不支持动态表达式解析。
GitHub在加载工作流定义时,会直接解析on段的配置,不会执行fromJSON()这类运行时表达式来生成选项列表。这种非法写法会导致工作流解析失败,进而出现GUI异常、命令行返回500错误的情况。
可行解决方案
方案一:输入字符串+合法性验证(简单直接)
放弃静态下拉选项,改用字符串输入,在工作流中验证输入是否属于组织变量允许的环境列表:
on: workflow_dispatch: inputs: ENVIRONMENT: required: true type: string description: "部署环境,可选值:${{ vars.ENV_LIST }}" jobs: validate-environment: runs-on: ubuntu-latest steps: - name: 验证环境合法性 env: ALLOWED_ENVS: ${{ vars.ENV_LIST }} INPUT_ENV: ${{ github.event.inputs.ENVIRONMENT }} run: | # 解析JSON数组并验证输入是否在列表中 if ! echo "$ALLOWED_ENVS" | jq -e --arg env "$INPUT_ENV" '.[] | select(. == $env)' > /dev/null; then echo "错误:环境 $INPUT_ENV 不在允许列表中,可选值为 $(echo "$ALLOWED_ENVS" | jq -r '.[]' | tr '\n' ', ')" exit 1 fi # 后续部署步骤...
方案二:自动同步静态选项(保留GUI下拉)
通过一个维护工作流,定时从组织变量拉取环境列表,自动更新目标工作流的静态options字段,实现GUI下拉选项与组织变量同步:
- 创建维护工作流文件
.github/workflows/update-env-options.yml:
on: schedule: - cron: '0 0 * * *' # 每天自动更新一次 workflow_dispatch: # 支持手动触发更新 jobs: update-workflow-options: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: 解析环境列表为YAML格式 id: parse-envs env: ENV_LIST: ${{ vars.ENV_LIST }} run: | # 将JSON数组转换为YAML数组格式字符串 YAML_OPTIONS=$(echo "$ENV_LIST" | jq -r '.[] | "- \"" + . + "\""' | paste -sd '\n' -) echo "yaml_options<<EOF" >> "$GITHUB_OUTPUT" echo "$YAML_OPTIONS" >> "$GITHUB_OUTPUT" echo "EOF" >> "$GITHUB_OUTPUT" - name: 更新部署工作流的选项 uses: fjogeleit/yaml-update-action@v0.14.0 with: file: .github/workflows/your-deploy-workflow.yml # 替换为你的部署工作流路径 property: 'on.workflow_dispatch.inputs.ENVIRONMENT.options' value: ${{ steps.parse-envs.outputs.yaml_options }} commitChange: true commitMessage: '同步组织环境选项列表' branch: main # 替换为你的默认分支
- 部署工作流的
options字段改为静态数组(初始值可从组织变量复制),后续会被维护工作流自动更新:
on: workflow_dispatch: inputs: ENVIRONMENT: required: true type: choice description: "The environment of the deployment" options: - "dev" - "staging" - "prod"
内容的提问来源于stack exchange,提问作者amacrobert
相关产品推荐
相关产品推荐

