You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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下拉选项与组织变量同步:

  1. 创建维护工作流文件.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 # 替换为你的默认分支
  1. 部署工作流的options字段改为静态数组(初始值可从组织变量复制),后续会被维护工作流自动更新:
on:
  workflow_dispatch:
    inputs:
      ENVIRONMENT:
        required: true
        type: choice
        description: "The environment of the deployment"
        options:
          - "dev"
          - "staging"
          - "prod"

内容的提问来源于stack exchange,提问作者amacrobert

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 07:53:12