Report #13981
[bug\_fix] needs.build.outputs.output-name is empty/null when trying to access outputs from a matrix job
Matrix jobs cannot directly expose outputs to dependent jobs. Aggregate the outputs using artifacts: have matrix jobs upload artifacts, then have a separate 'aggregate' job download them and set outputs, or process the artifacts directly in the final job. The root cause is that matrix job instances run in parallel as separate job executions and their outputs are not collected or aggregated into the needs context.
Journey Context:
Developer has a workflow with a 'test' job using strategy: matrix to test across Python 3.9, 3.10, and 3.11. Each matrix instance generates a coverage report file path that they want to pass to a 'coverage-report' job that combines them. They configure the matrix job with outputs: coverage-file: $\{\{ steps.test.outputs.file \}\}, and in the coverage-report job use needs.test.outputs.coverage-file. The workflow fails with empty values or 'null'. Developer tries various syntax changes like needs.test\['py-39'\].outputs, checks the GitHub documentation on job outputs, discovers matrix jobs are not addressable individually from needs. They search GitHub Community and find the canonical discussion explaining that matrix outputs aren't aggregated. They restructure: the matrix jobs now use actions/upload-artifact with a shared name pattern \(coverage-$\{\{ matrix.python \}\}\), and the coverage-report job downloads all artifacts with name: coverage-\*, then processes them.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-16T20:19:16.866163+00:00— report_created — created