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

GitHub Action动态计算Matrix输出无法被fromJSON解析问题

动态生成GitHub Action Matrix JSON数组失败问题排查

问题背景

需求是根据输入参数build-all动态生成GitHub Action的matrix:当build-all为false时,仅使用BUILD_MATRIX(来自GitHub Secrets的JSON对象数组)的第一个元素;为true时使用完整数组。当前实现的Workflow代码如下:

compute-matrix:
  name: Compute matrix
  runs-on: ubuntu-latest
  needs: [get-environment-info]
  environment: ${{ needs.get-environment-info.outputs.environment }}
  outputs:
    matrix: steps.matrix.outputs.matrix

  steps:
    - name: Matrix
      if: github.event.inputs.build-all == 'false'
      id: matrix
      run: |
        echo '${{ env.BUILD_MATRIX }}' > build-matrix.json
        MATRIX=$(cat build-matrix.json | jq '[.[0]] | tostring')
        echo "matrix=$MATRIX" >> $GITHUB_OUTPUT

    - name: Checkout
      uses: actions/checkout@v3
      with:
        fetch-depth: 0

    - name: Upload output
      uses: ./.github/actions/upload-artifact
      with:
        key: matrix
        value: ${{ steps.matrix.outcome == 'success' && steps.matrix.outputs.matrix || env.BUILD_MATRIX }}

    - name: Print
      run: |
        echo ${{ steps.matrix.outputs.matrix }}

another-job:
  name: Another Job
  runs-on: ubuntu-latest
  needs: [get-environment-info, compute-matrix]
  environment: ${{ needs.get-environment-info.outputs.environment }}
  strategy:
    matrix: 
      app: ${{ fromJSON(needs.compute-matrix.outputs.matrix) }}

报错信息

调试时发现artifact中的JSON是合法的,但后续job使用fromJSON读取输出时出现错误:

Error when evaluating 'strategy' for job 'another-job'. .github/workflows/wf.yaml (Line: 775, Col: 14): Error parsing fromJson,.github/workflows/wf.yaml (Line: 775, Col: 14): Error reading JToken from JsonReader. Path '', line 0, position 0.,.github/workflows/wf.yaml (Line: 775, Col: 14): Unexpected value ''

问题原因

核心问题在于**compute-matrix的output没有处理Matrix步骤被跳过的情况**:

  • 当build-all为true时,if条件不满足,Matrix步骤会被跳过,此时steps.matrix.outputs.matrix是空字符串。
  • 当前compute-matrix的output直接取这个空值,后续fromJSON解析空字符串必然报错。

解决方案

修改compute-matrix的output定义,复用上传artifact时的判断逻辑,确保无论Matrix步骤是否执行,都能输出合法的JSON:

compute-matrix:
  name: Compute matrix
  runs-on: ubuntu-latest
  needs: [get-environment-info]
  environment: ${{ needs.get-environment-info.outputs.environment }}
  outputs:
    # 关键修改:判断步骤是否成功,否则使用原始BUILD_MATRIX
    matrix: ${{ steps.matrix.outcome == 'success' && steps.matrix.outputs.matrix || env.BUILD_MATRIX }}

  steps:
    - name: Matrix
      if: github.event.inputs.build-all == 'false'
      id: matrix
      run: |
        echo '${{ env.BUILD_MATRIX }}' > build-matrix.json
        MATRIX=$(cat build-matrix.json | jq '[.[0]] | tostring')
        echo "matrix=$MATRIX" >> $GITHUB_OUTPUT

    # 其他步骤保持不变...

额外验证点

  • 确认BUILD_MATRIX本身是合法的JSON数组字符串,无语法错误。
  • 本地运行jq命令验证输出:将BUILD_MATRIX内容保存到文件,执行jq '[.[0]] | tostring',确认输出是带引号的合法JSON字符串。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 18:43:24