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
相关产品推荐
相关产品推荐

