如何获取采用Matrix Strategy的并行作业的全部输出供后续作业使用?
如何获取GitHub Actions并行矩阵作业的所有输出?
针对你提到的场景(第一个矩阵作业并行生成输出,第二个作业依赖并获取所有这些输出),可以通过以下几种方式实现,根据你的具体需求选择:
1. 直接映射对应矩阵任务的输出(适用于第二个作业矩阵与第一个完全匹配)
如果第二个作业的矩阵组合和第一个完全一致,你可以在第一个作业中为每个矩阵任务定义带唯一标识的输出,然后在第二个作业中通过矩阵变量直接获取对应任务的输出。
第一个矩阵作业配置:
jobs: generate-outputs: runs-on: ${{ matrix.os }} strategy: matrix: os: [ubuntu-latest, windows-latest, macos-latest] arch: [x64, arm64] outputs: # 用矩阵变量作为输出key的一部分,确保每个任务输出唯一 result-${{ matrix.os }}-${{ matrix.arch }}: ${{ steps.gen-output.outputs.result }} steps: - name: Generate task-specific output id: gen-output run: | # 模拟生成对应矩阵组合的输出内容 echo "result=output_${{ matrix.os }}_${{ matrix.arch }}" >> $GITHUB_OUTPUT
第二个矩阵作业配置:
process-outputs: runs-on: ${{ matrix.os }} strategy: matrix: os: [ubuntu-latest, windows-latest, macos-latest] arch: [x64, arm64] needs: generate-outputs steps: - name: Fetch and process corresponding output run: | echo "Processing output from ${{ matrix.os }}-${{ matrix.arch }}: ${{ needs.generate-outputs.outputs['result-${{ matrix.os }}-${{ matrix.arch }}'] }}"
2. 通过Artifact收集所有输出(适用于需要批量处理所有结果)
如果第二个作业需要一次性获取所有矩阵任务的输出,使用Artifact上传/下载是更可靠的方式(避免作业输出的大小限制)。
第一个矩阵作业配置:
jobs: generate-outputs: runs-on: ${{ matrix.os }} strategy: matrix: os: [ubuntu-latest, windows-latest, macos-latest] arch: [x64, arm64] steps: - name: Generate output file run: | # 将输出写入文件,文件名或内容包含矩阵标识 echo "output_${{ matrix.os }}_${{ matrix.arch }}" > task_output.txt - name: Upload output as artifact uses: actions/upload-artifact@v4 with: name: task-output-${{ matrix.os }}-${{ matrix.arch }} path: task_output.txt
第二个作业配置(可处理所有输出):
process-all-outputs: runs-on: ubuntu-latest needs: generate-outputs steps: - name: Download all task artifacts uses: actions/download-artifact@v4 with: path: all-task-outputs - name: Batch process all outputs run: | echo "All matrix task outputs:" # 遍历所有下载的输出文件并打印内容 for output_file in all-task-outputs/*/task_output.txt; do cat "$output_file" done
3. 遍历矩阵作业的上下文数组(适用于动态获取所有输出)
GitHub Actions中,当作业使用矩阵策略时,needs.<job-name>会返回一个包含所有矩阵任务上下文的数组,你可以遍历这个数组来获取每个任务的输出。
第二个作业配置:
process-all-outputs: runs-on: ubuntu-latest needs: generate-outputs steps: - name: Iterate all matrix task outputs run: | # 使用jq解析needs数组,提取每个任务的输出 echo '${{ toJSON(needs.generate-outputs) }}' | jq -r '.[] | .outputs.result'
注意事项
- 作业输出有大小限制(单条输出最大1MB),如果输出内容较大,优先选择Artifact方式。
- 遍历
needs数组时,确保Runner环境安装了jq工具(如Ubuntu默认自带,Windows需额外安装)。
内容的提问来源于stack exchange,提问作者Memphis Meng
相关产品推荐
相关产品推荐

