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

如何配置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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.17 07:37:57