8888 IMAGE_TAG : " ${{ inputs.docker_tag }}-${{ matrix.arch }}"
8989 BASE_FOLDER : " ${{ inputs.base_folder }}"
9090 NO_CACHE : ' ${{ inputs.NO_CACHE }}'
91+ BUILDX_NO_DEFAULT_ATTESTATIONS : " 1"
9192 - name : Check docker vulnerabilities - json output
9293 run : |
9394 make scan-image-json
@@ -136,6 +137,55 @@ jobs:
136137 DOCKER_TAG : ${{ inputs.docker_tag }}
137138 CONTAINER_NAME : ' ${{ inputs.container_name }}'
138139 ARCHITECTURE : ' ${{ matrix.arch }}'
140+ BUILDX_NO_DEFAULT_ATTESTATIONS : " 1"
141+ - name : Resolve image digest
142+ id : resolve_arch_digest
143+ run : |
144+ DIGEST=$(docker buildx imagetools inspect "ghcr.io/nhsdigital/eps-devcontainers/${CONTAINER_NAME}:${DOCKER_TAG}-${ARCHITECTURE}" | awk '/^Digest:/ {print $2; exit}')
145+ echo "digest=${DIGEST}" >> "$GITHUB_OUTPUT"
146+ echo "Resolved digest ${DIGEST} for ${DOCKER_TAG}-${ARCHITECTURE}"
147+ env :
148+ DOCKER_TAG : ${{ inputs.docker_tag }}
149+ CONTAINER_NAME : ' ${{ inputs.container_name }}'
150+ ARCHITECTURE : ' ${{ matrix.arch }}'
151+ - name : Attest image
152+ uses : actions/attest-build-provenance@977bb373ede98d70efdf65b84cb5f73e068dcc2a
153+ with :
154+ subject-name : ghcr.io/nhsdigital/eps-devcontainers/${{ inputs.container_name }}
155+ subject-digest : ${{ steps.resolve_arch_digest.outputs.digest }}
156+ push-to-registry : false
157+ - name : Summarise attested image
158+ run : |
159+ echo "## ATTESTED IMAGE : ghcr.io/nhsdigital/eps-devcontainers/${CONTAINER_NAME}:${DOCKER_TAG}-${ARCHITECTURE}@${DIGEST}" >> "$GITHUB_STEP_SUMMARY"
160+ env :
161+ DOCKER_TAG : ${{ inputs.docker_tag }}
162+ CONTAINER_NAME : ' ${{ inputs.container_name }}'
163+ ARCHITECTURE : ' ${{ matrix.arch }}'
164+ DIGEST : ${{ steps.resolve_arch_digest.outputs.digest }}
165+ - name : Resolve github actions image digest
166+ id : resolve_githubactions_arch_digest
167+ run : |
168+ DIGEST=$(docker buildx imagetools inspect "ghcr.io/nhsdigital/eps-devcontainers/${CONTAINER_NAME}:githubactions-${DOCKER_TAG}-${ARCHITECTURE}" | awk '/^Digest:/ {print $2; exit}')
169+ echo "digest=${DIGEST}" >> "$GITHUB_OUTPUT"
170+ echo "Resolved digest ${DIGEST} for githubactions-${DOCKER_TAG}-${ARCHITECTURE}"
171+ env :
172+ DOCKER_TAG : ${{ inputs.docker_tag }}
173+ CONTAINER_NAME : ' ${{ inputs.container_name }}'
174+ ARCHITECTURE : ' ${{ matrix.arch }}'
175+ - name : Attest github actions image
176+ uses : actions/attest-build-provenance@977bb373ede98d70efdf65b84cb5f73e068dcc2a
177+ with :
178+ subject-name : ghcr.io/nhsdigital/eps-devcontainers/${{ inputs.container_name }}
179+ subject-digest : ${{ steps.resolve_githubactions_arch_digest.outputs.digest }}
180+ push-to-registry : false
181+ - name : Summarise attested github actions image
182+ run : |
183+ echo "## ATTESTED IMAGE : ghcr.io/nhsdigital/eps-devcontainers/${CONTAINER_NAME}:githubactions-${DOCKER_TAG}-${ARCHITECTURE}@${DIGEST}" >> "$GITHUB_STEP_SUMMARY"
184+ env :
185+ DOCKER_TAG : ${{ inputs.docker_tag }}
186+ CONTAINER_NAME : ' ${{ inputs.container_name }}'
187+ ARCHITECTURE : ' ${{ matrix.arch }}'
188+ DIGEST : ${{ steps.resolve_githubactions_arch_digest.outputs.digest }}
139189 - name : Push latest image
140190 if : ${{ inputs.tag_latest }}
141191 run : |
@@ -152,6 +202,56 @@ jobs:
152202 DOCKER_TAG : ${{ inputs.docker_tag }}
153203 CONTAINER_NAME : ' ${{ inputs.container_name }}'
154204 ARCHITECTURE : ' ${{ matrix.arch }}'
205+ - name : Resolve github actions latest image digest
206+ if : ${{ inputs.tag_latest }}
207+ id : resolve_githubactions_latest_arch_digest
208+ run : |
209+ DIGEST=$(docker buildx imagetools inspect "ghcr.io/nhsdigital/eps-devcontainers/${CONTAINER_NAME}:githubactions-latest-${ARCHITECTURE}" | awk '/^Digest:/ {print $2; exit}')
210+ echo "digest=${DIGEST}" >> "$GITHUB_OUTPUT"
211+ echo "Resolved digest ${DIGEST} for githubactions-latest-${ARCHITECTURE}"
212+ env :
213+ CONTAINER_NAME : ' ${{ inputs.container_name }}'
214+ ARCHITECTURE : ' ${{ matrix.arch }}'
215+ - name : Attest github actions latest image
216+ if : ${{ inputs.tag_latest }}
217+ uses : actions/attest-build-provenance@977bb373ede98d70efdf65b84cb5f73e068dcc2a
218+ with :
219+ subject-name : ghcr.io/nhsdigital/eps-devcontainers/${{ inputs.container_name }}
220+ subject-digest : ${{ steps.resolve_githubactions_latest_arch_digest.outputs.digest }}
221+ push-to-registry : false
222+ - name : Summarise attested github actions latest image
223+ if : ${{ inputs.tag_latest }}
224+ run : |
225+ echo "## ATTESTED IMAGE : ghcr.io/nhsdigital/eps-devcontainers/${CONTAINER_NAME}:githubactions-latest-${ARCHITECTURE}@${DIGEST}" >> "$GITHUB_STEP_SUMMARY"
226+ env :
227+ CONTAINER_NAME : ' ${{ inputs.container_name }}'
228+ ARCHITECTURE : ' ${{ matrix.arch }}'
229+ DIGEST : ${{ steps.resolve_githubactions_latest_arch_digest.outputs.digest }}
230+ - name : Resolve latest image digest
231+ if : ${{ inputs.tag_latest }}
232+ id : resolve_latest_arch_digest
233+ run : |
234+ DIGEST=$(docker buildx imagetools inspect "ghcr.io/nhsdigital/eps-devcontainers/${CONTAINER_NAME}:latest-${ARCHITECTURE}" | awk '/^Digest:/ {print $2; exit}')
235+ echo "digest=${DIGEST}" >> "$GITHUB_OUTPUT"
236+ echo "Resolved digest ${DIGEST} for latest-${ARCHITECTURE}"
237+ env :
238+ CONTAINER_NAME : ' ${{ inputs.container_name }}'
239+ ARCHITECTURE : ' ${{ matrix.arch }}'
240+ - name : Attest latest image
241+ if : ${{ inputs.tag_latest }}
242+ uses : actions/attest-build-provenance@977bb373ede98d70efdf65b84cb5f73e068dcc2a
243+ with :
244+ subject-name : ghcr.io/nhsdigital/eps-devcontainers/${{ inputs.container_name }}
245+ subject-digest : ${{ steps.resolve_latest_arch_digest.outputs.digest }}
246+ push-to-registry : false
247+ - name : Summarise attested latest image
248+ if : ${{ inputs.tag_latest }}
249+ run : |
250+ echo "## ATTESTED IMAGE : ghcr.io/nhsdigital/eps-devcontainers/${CONTAINER_NAME}:latest-${ARCHITECTURE}@${DIGEST}" >> "$GITHUB_STEP_SUMMARY"
251+ env :
252+ CONTAINER_NAME : ' ${{ inputs.container_name }}'
253+ ARCHITECTURE : ' ${{ matrix.arch }}'
254+ DIGEST : ${{ steps.resolve_latest_arch_digest.outputs.digest }}
155255 publish_combined_image :
156256 name : Publish combined image for ${{ inputs.container_name }}
157257 runs-on : ubuntu-22.04
@@ -222,3 +322,101 @@ jobs:
222322 env :
223323 DOCKER_TAG : ${{ inputs.docker_tag }}
224324 CONTAINER_NAME : ' ${{ inputs.container_name }}'
325+
326+ - name : Resolve combined image digest
327+ id : resolve_combined_digest
328+ run : |
329+ DIGEST=$(docker buildx imagetools inspect "ghcr.io/nhsdigital/eps-devcontainers/${CONTAINER_NAME}:${DOCKER_TAG}" | awk '/^Digest:/ {print $2; exit}')
330+ echo "digest=${DIGEST}" >> "$GITHUB_OUTPUT"
331+ echo "Resolved digest ${DIGEST} for ${DOCKER_TAG}"
332+ env :
333+ DOCKER_TAG : ${{ inputs.docker_tag }}
334+ CONTAINER_NAME : ' ${{ inputs.container_name }}'
335+
336+ - name : Attest combined image
337+ uses : actions/attest-build-provenance@977bb373ede98d70efdf65b84cb5f73e068dcc2a
338+ with :
339+ subject-name : ghcr.io/nhsdigital/eps-devcontainers/${{ inputs.container_name }}
340+ subject-digest : ${{ steps.resolve_combined_digest.outputs.digest }}
341+ push-to-registry : false
342+ - name : Summarise attested combined image
343+ run : |
344+ echo "## ATTESTED IMAGE : ghcr.io/nhsdigital/eps-devcontainers/${CONTAINER_NAME}:${DOCKER_TAG}@${DIGEST}" >> "$GITHUB_STEP_SUMMARY"
345+ env :
346+ DOCKER_TAG : ${{ inputs.docker_tag }}
347+ CONTAINER_NAME : ' ${{ inputs.container_name }}'
348+ DIGEST : ${{ steps.resolve_combined_digest.outputs.digest }}
349+
350+ - name : Resolve combined github actions image digest
351+ id : resolve_githubactions_combined_digest
352+ run : |
353+ DIGEST=$(docker buildx imagetools inspect "ghcr.io/nhsdigital/eps-devcontainers/${CONTAINER_NAME}:githubactions-${DOCKER_TAG}" | awk '/^Digest:/ {print $2; exit}')
354+ echo "digest=${DIGEST}" >> "$GITHUB_OUTPUT"
355+ echo "Resolved digest ${DIGEST} for githubactions-${DOCKER_TAG}"
356+ env :
357+ DOCKER_TAG : ${{ inputs.docker_tag }}
358+ CONTAINER_NAME : ' ${{ inputs.container_name }}'
359+
360+ - name : Attest combined github actions image
361+ uses : actions/attest-build-provenance@977bb373ede98d70efdf65b84cb5f73e068dcc2a
362+ with :
363+ subject-name : ghcr.io/nhsdigital/eps-devcontainers/${{ inputs.container_name }}
364+ subject-digest : ${{ steps.resolve_githubactions_combined_digest.outputs.digest }}
365+ push-to-registry : false
366+ - name : Summarise attested combined github actions image
367+ run : |
368+ echo "## ATTESTED IMAGE : ghcr.io/nhsdigital/eps-devcontainers/${CONTAINER_NAME}:githubactions-${DOCKER_TAG}@${DIGEST}" >> "$GITHUB_STEP_SUMMARY"
369+ env :
370+ DOCKER_TAG : ${{ inputs.docker_tag }}
371+ CONTAINER_NAME : ' ${{ inputs.container_name }}'
372+ DIGEST : ${{ steps.resolve_githubactions_combined_digest.outputs.digest }}
373+
374+ - name : Resolve latest github actions image digest
375+ if : ${{ inputs.tag_latest }}
376+ id : resolve_githubactions_latest_digest
377+ run : |
378+ DIGEST=$(docker buildx imagetools inspect "ghcr.io/nhsdigital/eps-devcontainers/${CONTAINER_NAME}:githubactions-latest" | awk '/^Digest:/ {print $2; exit}')
379+ echo "digest=${DIGEST}" >> "$GITHUB_OUTPUT"
380+ echo "Resolved digest ${DIGEST} for githubactions-latest"
381+ env :
382+ CONTAINER_NAME : ' ${{ inputs.container_name }}'
383+
384+ - name : Attest latest github actions image
385+ if : ${{ inputs.tag_latest }}
386+ uses : actions/attest-build-provenance@977bb373ede98d70efdf65b84cb5f73e068dcc2a
387+ with :
388+ subject-name : ghcr.io/nhsdigital/eps-devcontainers/${{ inputs.container_name }}
389+ subject-digest : ${{ steps.resolve_githubactions_latest_digest.outputs.digest }}
390+ push-to-registry : false
391+ - name : Summarise attested latest github actions image
392+ if : ${{ inputs.tag_latest }}
393+ run : |
394+ echo "## ATTESTED IMAGE : ghcr.io/nhsdigital/eps-devcontainers/${CONTAINER_NAME}:githubactions-latest@${DIGEST}" >> "$GITHUB_STEP_SUMMARY"
395+ env :
396+ CONTAINER_NAME : ' ${{ inputs.container_name }}'
397+ DIGEST : ${{ steps.resolve_githubactions_latest_digest.outputs.digest }}
398+
399+ - name : Resolve latest image digest
400+ if : ${{ inputs.tag_latest }}
401+ id : resolve_latest_digest
402+ run : |
403+ DIGEST=$(docker buildx imagetools inspect "ghcr.io/nhsdigital/eps-devcontainers/${CONTAINER_NAME}:latest" | awk '/^Digest:/ {print $2; exit}')
404+ echo "digest=${DIGEST}" >> "$GITHUB_OUTPUT"
405+ echo "Resolved digest ${DIGEST} for latest"
406+ env :
407+ CONTAINER_NAME : ' ${{ inputs.container_name }}'
408+
409+ - name : Attest latest image
410+ if : ${{ inputs.tag_latest }}
411+ uses : actions/attest-build-provenance@977bb373ede98d70efdf65b84cb5f73e068dcc2a
412+ with :
413+ subject-name : ghcr.io/nhsdigital/eps-devcontainers/${{ inputs.container_name }}
414+ subject-digest : ${{ steps.resolve_latest_digest.outputs.digest }}
415+ push-to-registry : false
416+ - name : Summarise attested latest image
417+ if : ${{ inputs.tag_latest }}
418+ run : |
419+ echo "## ATTESTED IMAGE : ghcr.io/nhsdigital/eps-devcontainers/${CONTAINER_NAME}:latest@${DIGEST}" >> "$GITHUB_STEP_SUMMARY"
420+ env :
421+ CONTAINER_NAME : ' ${{ inputs.container_name }}'
422+ DIGEST : ${{ steps.resolve_latest_digest.outputs.digest }}
0 commit comments