GitHub Actions嵌套复用工作流矩阵解析失败问题求助
核心问题定位
你遇到的是两层嵌套工作流中矩阵参数传递的解析时机冲突:主工作流M生成的JSON矩阵字符串传给A后,A的debug任务能正常解析,但调用B时用同样的fromJson(inputs.matrix-input)却报矩阵为空,本质是GitHub Actions对嵌套工作流的参数注入、策略解析的优先级和时机有差异。
可能的原因及解决办法
1. 嵌套调用时的策略解析时机过早
当在A中直接把fromJson(inputs.matrix-input)写进B的strategy.matrix里,GitHub Actions会在工作流初始化阶段就尝试解析这个表达式,但此时A的inputs.matrix-input还没完成参数注入(因为A本身是被M调用的,参数注入时机晚于B的策略初始化),导致解析时拿到空值。
解决办法:
在A中先把解析后的矩阵存为作业级输出,再传递给B:
# 工作流A的配置 jobs: debug-output-A: runs-on: ubuntu-latest outputs: parsed-matrix: ${{ steps.parse-step.outputs.matrix }} steps: - id: parse-step run: echo "matrix=${{ fromJson(inputs.matrix-input) }}" >> $GITHUB_OUTPUT call-B-with-matrix: needs: debug-output-A uses: ./path/to/B.yml with: matrix-input: ${{ needs.debug-output-A.outputs.parsed-matrix }}
然后在工作流B中直接使用传入的参数解析矩阵:
# 工作流B的配置 jobs: JOB1: runs-on: ubuntu-latest strategy: matrix: ${{ fromJson(inputs.matrix-input) }}
2. JSON字符串的隐性转义问题
M生成的JSON字符串在传递到A的过程中,可能出现了隐性转义(比如双引号被转义成\"),debug任务直接输出时看起来是正常JSON,但嵌套调用时二次解析会因为转义问题失败,返回空值。
验证方法:
在A的debug任务里加一步打印原始参数:
- name: Print raw matrix input run: echo "Raw matrix input: ${{ inputs.matrix-input }}"
如果输出里有\"这种转义字符,就说明存在转义问题。
解决办法:
在M生成矩阵字符串时,确保输出未转义的纯JSON,比如用jq生成时加-r参数:
# 主工作流M中生成矩阵的步骤 - id: generate-matrix run: | MATRIX=$(jq -n '{"os": ["ubuntu-latest", "windows-latest"]}' -r) echo "matrix=$MATRIX" >> $GITHUB_OUTPUT
3. 参数类型的隐性冲突
GitHub Actions可复用工作流的参数默认是字符串类型,但如果在传递时没有显式声明,可能出现隐性类型转换问题,导致B接收到的参数为空。
解决办法:
在A和B的参数定义中显式声明类型为字符串:
# 工作流A的参数定义 inputs: matrix-input: description: "Matrix JSON string" type: string # 工作流B的参数定义 inputs: matrix-input: description: "Matrix JSON string" type: string
额外验证步骤
- 尝试在A中把解析后的矩阵硬编码到调用B的参数里,如果能正常运行,就确认是参数传递时机的问题;
- 检查工作流文件的缩进和语法,确保
strategy.matrix的缩进正确,没有语法错误导致解析失败。
内容的提问来源于stack exchange,提问作者Pavel Gurkov

