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

Github Actions:单Job输出传递至矩阵Job的解析错误排查

问题分析与修复方案

核心问题定位

报错信息明确指向两个关键问题:

  1. 解析fromJson时遇到意外转义字符,说明前一个Job输出的JSON格式存在转义错误
  2. 矩阵期望接收序列(数组类型),但实际获取的是空值或非数组格式

修复步骤

1. 修正detect_changes Job的输出格式

确保输出的是合法的JSON数组,避免手动拼接导致的转义问题,推荐用jq工具自动生成标准JSON:

jobs:
  detect_changes:
    runs-on: ubuntu-latest
    outputs:
      changed_charts: ${{ steps.get_changes.outputs.charts }}
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - name: 获取变更的Chart目录
        id: get_changes
        run: |
          # 提取charts下变更的子目录,去重后生成JSON数组
          CHANGED_DIRS=$(git diff --name-only ${{ github.event.before }} ${{ github.sha }} -- charts/ | grep -E 'charts/[^/]+/' | cut -d'/' -f2 | uniq | jq -R . | jq -s .)
          echo "charts=$CHANGED_DIRS" >> $GITHUB_OUTPUT

关键细节:

  • 用jq -R .将每个目录转为JSON字符串,jq -s .组合成数组,确保格式绝对合规
  • 使用GITHUB_OUTPUT而非旧版set-output语法,避免额外转义

2. 修正Test_from_first_job的矩阵配置

确保正确依赖前一个Job,并处理空数组的边界情况:

Test_from_first_job:
    needs: detect_changes
    # 空数组时跳过Job,避免矩阵为空报错
    if: ${{ fromJson(needs.detect_changes.outputs.changed_charts) != '[]' }}
    runs-on: ubuntu-latest
    strategy:
      matrix:
        chart: ${{ fromJson(needs.detect_changes.outputs.changed_charts) }}
    steps:
      - uses: actions/checkout@v4
      
      - name: 处理Chart ${{ matrix.chart }}
        run: |
          echo "正在处理目录:charts/${{ matrix.chart }}"
          # 此处添加Helm打包、测试等逻辑

3. 排查常见转义坑点

如果仍出现解析错误,检查以下内容:

  • 禁止手动拼接JSON字符串(比如echo '["dir1", "dir2"]'),必须用工具生成标准格式
  • 确认detect_changes Job的输出没有被额外转义(比如输出中出现\"这类字符)

完整示例配置

name: Helm Package and Push
on:
  push:
    branches:
      - chartChange
    paths:
      - 'charts/**'

jobs:
  detect_changes:
    runs-on: ubuntu-latest
    outputs:
      changed_charts: ${{ steps.get_changes.outputs.charts }}
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - name: 检测变更的Chart目录
        id: get_changes
        run: |
          CHANGED=$(git diff --name-only ${{ github.event.before }} ${{ github.sha }} -- charts/ | awk -F/ '{print $2}' | sort -u | jq -R . | jq -s .)
          echo "charts=$CHANGED" >> $GITHUB_OUTPUT

  Test_from_first_job:
    needs: detect_changes
    if: ${{ fromJson(needs.detect_changes.outputs.changed_charts) != '[]' }}
    runs-on: ubuntu-latest
    strategy:
      matrix:
        chart: ${{ fromJson(needs.detect_changes.outputs.changed_charts) }}
    steps:
      - uses: actions/checkout@v4

      - name: Helm 语法检查
        run: helm lint charts/${{ matrix.chart }}

      - name: Helm 打包
        run: helm package charts/${{ matrix.chart }}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 01:21:05