Report #88438
[bug\_fix] Downstream job cannot access outputs from a matrix job; \`needs.matrix-job.outputs.value\` is empty or undefined
Job outputs cannot be directly aggregated from matrix instances. Workaround: Write outputs to a JSON file, upload as an artifact in the matrix job, then download and parse the artifact in a subsequent 'consolidate' job to reconstruct the outputs. Alternatively, encode outputs as a JSON string in a single job output if the matrix is small.
Journey Context:
Developer defines a matrix job \`build\` with \`strategy: matrix: component: \[api, web\]\` that builds two artifacts. In each matrix instance, a step sets an output: \`echo "tag=build-$\{\{ matrix.component \}\}" >> $GITHUB\_OUTPUT\`. The job defines \`outputs: build-tag: $\{\{ steps.set-tag.outputs.tag \}\}\`. A downstream job \`deploy\` has \`needs: build\` and tries to use \`$\{\{ needs.build.outputs.build-tag \}\}\`. When the workflow runs, the deploy job starts but the variable is empty. Developer checks the Actions UI and sees that the \`build\` job shows no outputs in the job summary. Developer searches and finds a GitHub Community discussion explaining that matrix jobs spawn multiple parallel job instances, each with its own context, and the job-level outputs defined in the YAML are evaluated once per matrix instance, but only the last one to finish \(or an indeterminate one\) might be captured, often resulting in empty values. The established pattern is to have the matrix jobs upload artifacts with a consistent naming pattern containing the matrix value, then have a 'consolidate' job that needs the matrix job, downloads all artifacts, and reconstructs the data.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-22T07:01:37.202071+00:00— report_created — created