如何从仓库文件提取值到GitHub Actions YAML工作流输入选项?
解决方案说明
首先明确:GitHub Actions的on.workflow_dispatch.inputs属于静态配置,在工作流触发前就需要确定所有选项,因此无法直接在on阶段调用actions/checkout或jq这类工具动态读取config.json的内容。下面提供两种可行的实现思路:
方案一:预先生成工作流文件
通过脚本读取config.json的内容,自动更新工作流YAML中的选项列表,确保两者同步。
示例Shell脚本(依赖jq)
#!/bin/bash # 从config.json提取types的所有键,格式化为YAML选项格式 OPTIONS=$(jq -r '.types | keys[] | " - \(. )"' config.json) # 替换工作流文件里的options区块 sed -i.bak "/options:/,/^[^ ]/c\ options:\n$OPTIONS" .github/workflows/office.yml # 删除备份文件 rm .github/workflows/office.yml.bak
使用方式:
- 每次修改
config.json后,运行该脚本更新工作流文件 - 可以将脚本配置为Git预提交钩子,自动在提交前更新工作流,避免手动操作遗漏
方案二:改用文本输入+运行时验证
如果不想频繁修改工作流文件,可以将输入类型改为文本框,在工作流运行阶段验证输入是否合法。
示例工作流配置
name: The Office on: workflow_dispatch: inputs: cast: description: '请输入角色名称(可选值:Michael、Dwight、Jim)' required: true type: string jobs: validate-execute: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: 验证输入的角色合法性 id: validate_cast run: | # 提取合法角色列表 VALID_ROLES=$(jq -r '.types | keys | join(", ")' config.json) # 检查输入是否在合法列表中 if ! jq -e --arg input "${{ github.event.inputs.cast }}" '.types | has($input)' config.json; then echo "错误:输入的角色不在合法范围内,可选角色:$VALID_ROLES" exit 1 fi # 输出验证后的角色名称,供后续步骤使用 echo "validated_cast=${{ github.event.inputs.cast }}" >> $GITHUB_OUTPUT - name: 执行后续任务 run: | echo "当前选择的角色是:${{ steps.validate_cast.outputs.validated_cast }}" # 这里添加你的业务逻辑
总结
如果必须使用choice类型的下拉选项,只能通过预生成工作流文件的方式实现;若可以接受文本输入,方案二更灵活,无需频繁修改工作流配置。
内容的提问来源于stack exchange,提问作者mrhonest
相关产品推荐
相关产品推荐

