Github Actions:单Job输出传递至矩阵Job的解析错误排查
问题分析与修复方案
核心问题定位
报错信息明确指向两个关键问题:
- 解析
fromJson时遇到意外转义字符,说明前一个Job输出的JSON格式存在转义错误 - 矩阵期望接收序列(数组类型),但实际获取的是空值或非数组格式
修复步骤
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_changesJob的输出没有被额外转义(比如输出中出现\"这类字符)
完整示例配置
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
相关产品推荐
相关产品推荐

