44name : publish-base-image-manifest
55description : Validate platform digests and publish one multi-platform base image manifest.
66
7+ outputs :
8+ contract-base64 :
9+ description : Exact validated base-image contract for dependent jobs.
10+ value : ${{ steps.contract-output.outputs.contract_base64 }}
11+
712inputs :
813 agent :
914 description : Agent identifier stored in the managed base image contract.
1015 required : true
16+ amd64-digest :
17+ description : Exact amd64 platform digest from the producer job.
18+ required : true
19+ arm64-digest :
20+ description : Exact arm64 platform digest from the producer job.
21+ required : true
1122 display-name :
1223 description : Agent name used in validation errors.
1324 required : true
@@ -27,12 +38,23 @@ inputs:
2738runs :
2839 using : composite
2940 steps :
30- - name : Download platform digests
31- uses : actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
32- with :
33- pattern : ${{ inputs.agent }}-base-digest-${{ github.run_id }}-${{ github.run_attempt }}-*
34- path : ${{ runner.temp }}/digests
35- merge-multiple : true
41+ - name : Restore exact platform digests
42+ shell : bash
43+ env :
44+ AMD64_DIGEST : ${{ inputs.amd64-digest }}
45+ ARM64_DIGEST : ${{ inputs.arm64-digest }}
46+ run : |
47+ set -euo pipefail
48+ for digest in "$AMD64_DIGEST" "$ARM64_DIGEST"; do
49+ [[ "$digest" =~ ^sha256:[0-9a-f]{64}$ ]] || {
50+ echo "ERROR: base-image producer output has an invalid digest." >&2
51+ exit 1
52+ }
53+ done
54+ digest_root="$RUNNER_TEMP/digests"
55+ install -d -m 0700 "$digest_root"
56+ touch "$digest_root/amd64-${AMD64_DIGEST#sha256:}"
57+ touch "$digest_root/arm64-${ARM64_DIGEST#sha256:}"
3658
3759 - name : Set up Docker Buildx
3860 uses : docker/setup-buildx-action@bb05f3f5519dd87d3ba754cc423b652a5edd6d2c # v4.2.0
6587 IMAGE : ${{ inputs.registry }}/${{ inputs.image }}
6688 TAGS : ${{ steps.meta.outputs.tags }}
6789 run : bash "$GITHUB_ACTION_PATH/publish.sh"
90+ - name : Export managed base image contract
91+ id : contract-output
92+ shell : bash
93+ run : |
94+ set -euo pipefail
95+ contract="$RUNNER_TEMP/managed-base-contract/contract.json"
96+ if [ ! -f "$contract" ] || [ -L "$contract" ]; then
97+ echo "ERROR: managed base image contract is missing or is a symbolic link." >&2
98+ exit 1
99+ fi
100+ contract_size="$(wc -c < "$contract" | tr -d '[:space:]')"
101+ if [[ ! "$contract_size" =~ ^[1-9][0-9]{0,5}$ ]] || [ "$contract_size" -gt 65536 ]; then
102+ echo "ERROR: managed base image contract is empty or oversized." >&2
103+ exit 1
104+ fi
105+ printf 'contract_base64=%s\n' "$(base64 -w 0 "$contract")" >> "$GITHUB_OUTPUT"
68106 - name : Upload managed base image contract
69107 uses : actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
70108 with :
0 commit comments