如何配置GitHub Actions策略矩阵以基于用户输入动态读取JSON列表中的值
如何配置GitHub Actions策略矩阵以基于用户输入动态读取JSON列表中的值
嗨,我来帮你搞定这个需求!要实现基于用户选择的团队,从预设的JSON映射里动态生成GitHub Actions的策略矩阵,咱们可以把工作流拆成准备矩阵和执行任务两个核心步骤,下面给你一步步拆解并给出完整的示例。
核心思路
GitHub Actions的策略矩阵本身不支持直接从JSON动态取值,但咱们可以先通过一个前置作业,用jq工具解析JSON并提取对应团队的球员列表,再把这个列表传递给后续作业作为矩阵的数据源。
完整工作流示例
我把你的原有工作流改造了一下,你可以直接用:
name: Matrix team test on: workflow_dispatch: inputs: bosunEnvironment: # 用户选择的Bosun环境 description: 'Bosun Environment' required: true default: 'dev' type: choice options: - 'dev' - 'stg' - 'prd' stsReplay: # 用户选择的球队 description: 'team to pick' required: true default: 'real-madrid' type: choice options: - 'manu' - 'chelsea' - 'real-madrid' - 'fc-barcelona' - 'bayern' - 'ac-milan' env: # 这里直接写正常的JSON就行,不用转义双引号,YAML的|块标量会保留格式 REPLAY_MAP_JSON: | { "manu": ["casemiro","dalot","rashford"], "chelsea": ["sterling","james","silva"], "real-madrid": ["benzema","modric","vinicius"], "fc-barcelona": ["messi","gavi","pedri"], "bayern": ["muller","neuer","sane"], "ac-milan": ["leao","ibrahimovic","tonali"] } jobs: # 第一步:准备矩阵数据,提取用户选择球队的球员列表 prepare-matrix: runs-on: ubuntu-latest outputs: # 定义输出,供后续作业使用 player-matrix: ${{ steps.set-matrix.outputs.matrix }} steps: - name: 从JSON提取对应球队的球员列表 id: set-matrix run: | # 用jq工具根据用户输入的球队名,提取JSON里的球员数组 MATRIX_VALUES=$(echo "$REPLAY_MAP_JSON" | jq -r '.["${{ github.event.inputs.stsReplay }}"]') # 加个判断:如果没找到对应球队的球员,直接报错终止 if [ -z "$MATRIX_VALUES" ] || [ "$MATRIX_VALUES" == "null" ]; then echo "Error: 找不到球队 ${{ github.event.inputs.stsReplay }} 的球员数据!" exit 1 fi # 将提取到的数组输出为GitHub Actions可识别的格式 echo "matrix=$MATRIX_VALUES" >> $GITHUB_OUTPUT # 第二步:使用动态生成的矩阵执行测试任务 team-test: # 依赖prepare-matrix作业,确保先拿到矩阵数据 needs: prepare-matrix runs-on: ubuntu-latest strategy: # 用fromJson把输出的字符串转换成数组,作为矩阵的player维度 matrix: player: ${{ fromJson(needs.prepare-matrix.outputs.player-matrix) }} steps: - name: 执行${{ matrix.player }}的测试任务 run: | echo "正在为球队 ${{ github.event.inputs.stsReplay }} 的球员 ${{ matrix.player }} 执行测试..." echo "当前Bosun环境:${{ github.event.inputs.bosunEnvironment }}" # 这里替换成你的实际测试/部署命令
关键细节说明
jq工具的使用:Ubuntu默认的GitHub Actions runner已经预装了jq,它能轻松解析JSON。.["${{ github.event.inputs.stsReplay }}"]这种写法,能兼容像fc-barcelona这种带连字符的键名,比直接用.manu更稳妥。fromJson()函数:因为前置作业输出的是JSON字符串,必须用这个函数把它转换成GitHub Actions能识别的数组,否则矩阵会把整个字符串当成一个元素。- 错误处理:加个判断逻辑可以避免用户选择了不存在的球队(虽然你的输入是下拉选择,但万一后续修改JSON时漏了某个球队,这个判断能及时报错)。
备注:内容来源于stack exchange,提问作者Vishal Varghese
相关产品推荐
相关产品推荐

