@@ -190,16 +190,9 @@ jobs:
190190
191191 echo "deployment_mode=${deployment_mode}" >> "$GITHUB_OUTPUT"
192192
193- - name : Login to Amazon ECR
194- id : login-ecr
193+ - name : Prepare build metadata
194+ id : build-check
195195 if : ${{ steps.decide.outputs.deployment_mode == 'build' }}
196- uses : aws-actions/amazon-ecr-login@062b18b96a7aff071d4dc91bc00c4c1a7945b076
197-
198- - name : Build, publish and emit digest manifest
199- id : build
200- if : ${{ steps.decide.outputs.deployment_mode == 'build' }}
201- env :
202- ECR_REGISTRY : ${{ steps.login-ecr.outputs.registry }}
203196 run : |
204197 set -euo pipefail
205198
@@ -208,10 +201,18 @@ jobs:
208201 GIT_TAG="${TAG_PREFIX}git-${SHORT_SHA}"
209202 REL_TAG="${TAG_PREFIX}rel-${RELEASE_STAMP}"
210203
211- IMAGE_URI_GIT="${ECR_REGISTRY}/${ECR_REPOSITORY}:${GIT_TAG}"
212- IMAGE_URI_REL="${ECR_REGISTRY}/${ECR_REPOSITORY}:${REL_TAG}"
204+ REPOSITORY_URI="$(
205+ aws ecr describe-repositories \
206+ --repository-names "${ECR_REPOSITORY}" \
207+ --region "${AWS_REGION}" \
208+ --query 'repositories[0].repositoryUri' \
209+ --output text
210+ )"
211+
212+ IMAGE_URI_GIT="${REPOSITORY_URI}:${GIT_TAG}"
213+ IMAGE_URI_REL="${REPOSITORY_URI}:${REL_TAG}"
213214
214- IMAGE_DIGEST ="$(
215+ EXISTING_IMAGE_DIGEST ="$(
215216 aws ecr describe-images \
216217 --repository-name "${ECR_REPOSITORY}" \
217218 --region "${AWS_REGION}" \
@@ -220,19 +221,58 @@ jobs:
220221 --output text 2>/dev/null || true
221222 )"
222223
223- if [ -z "${IMAGE_DIGEST}" ] || [ "${IMAGE_DIGEST}" = "None" ]; then
224- docker build -f "${DOCKERFILE_PATH }" -t "${IMAGE_URI_GIT}" -t "${IMAGE_URI_REL }" "${DOCKER_CONTEXT_PATH}"
225- docker push "${IMAGE_URI_GIT} "
226- docker push "${IMAGE_URI_REL}"
224+ SHOULD_BUILD="false"
225+ if [ -z "${EXISTING_IMAGE_DIGEST }" ] || [ "${EXISTING_IMAGE_DIGEST }" = "None" ]; then
226+ SHOULD_BUILD="true "
227+ fi
227228
228- IMAGE_DIGEST="$(
229- aws ecr describe-images \
230- --repository-name "${ECR_REPOSITORY}" \
231- --region "${AWS_REGION}" \
232- --image-ids imageTag="${GIT_TAG}" \
233- --query 'imageDetails[0].imageDigest' \
234- --output text
235- )"
229+ echo "git_tag=${GIT_TAG}" >> "$GITHUB_OUTPUT"
230+ echo "release_tag=${REL_TAG}" >> "$GITHUB_OUTPUT"
231+ echo "repository_uri=${REPOSITORY_URI}" >> "$GITHUB_OUTPUT"
232+ echo "image_uri_git=${IMAGE_URI_GIT}" >> "$GITHUB_OUTPUT"
233+ echo "image_uri_rel=${IMAGE_URI_REL}" >> "$GITHUB_OUTPUT"
234+ echo "existing_image_digest=${EXISTING_IMAGE_DIGEST}" >> "$GITHUB_OUTPUT"
235+ echo "should_build=${SHOULD_BUILD}" >> "$GITHUB_OUTPUT"
236+
237+ - name : Login to Amazon ECR
238+ id : login-ecr
239+ if : ${{ steps.decide.outputs.deployment_mode == 'build' && steps.build-check.outputs.should_build == 'true' }}
240+ uses : aws-actions/amazon-ecr-login@062b18b96a7aff071d4dc91bc00c4c1a7945b076
241+
242+ - name : Set up Docker Buildx
243+ if : ${{ steps.decide.outputs.deployment_mode == 'build' && steps.build-check.outputs.should_build == 'true' }}
244+ uses : docker/setup-buildx-action@v3
245+
246+ - name : Build and publish image with layer caching
247+ id : build-image
248+ if : ${{ steps.decide.outputs.deployment_mode == 'build' && steps.build-check.outputs.should_build == 'true' }}
249+ uses : docker/build-push-action@v6
250+ with :
251+ context : ${{ env.DOCKER_CONTEXT_PATH }}
252+ file : ${{ env.DOCKERFILE_PATH }}
253+ push : true
254+ tags : |
255+ ${{ steps.build-check.outputs.image_uri_git }}
256+ ${{ steps.build-check.outputs.image_uri_rel }}
257+ cache-from : type=gha,scope=${{ env.ECR_REPOSITORY }}
258+ cache-to : type=gha,mode=max,scope=${{ env.ECR_REPOSITORY }}
259+
260+ - name : Emit build digest manifest
261+ id : build
262+ if : ${{ steps.decide.outputs.deployment_mode == 'build' }}
263+ env :
264+ REPOSITORY_URI : ${{ steps.build-check.outputs.repository_uri }}
265+ GIT_TAG : ${{ steps.build-check.outputs.git_tag }}
266+ REL_TAG : ${{ steps.build-check.outputs.release_tag }}
267+ EXISTING_IMAGE_DIGEST : ${{ steps.build-check.outputs.existing_image_digest }}
268+ SHOULD_BUILD : ${{ steps.build-check.outputs.should_build }}
269+ BUILT_IMAGE_DIGEST : ${{ steps.build-image.outputs.digest }}
270+ run : |
271+ set -euo pipefail
272+
273+ IMAGE_DIGEST="${EXISTING_IMAGE_DIGEST}"
274+ if [ "${SHOULD_BUILD}" = "true" ]; then
275+ IMAGE_DIGEST="${BUILT_IMAGE_DIGEST}"
236276 else
237277 echo "Immutable tag '${GIT_TAG}' already exists. Reusing existing image digest."
238278 fi
@@ -242,7 +282,7 @@ jobs:
242282 exit 1
243283 fi
244284
245- IMAGE_URI_PINNED="${ECR_REGISTRY}/${ECR_REPOSITORY }@${IMAGE_DIGEST}"
285+ IMAGE_URI_PINNED="${REPOSITORY_URI }@${IMAGE_DIGEST}"
246286 echo "image_version=${GIT_TAG}" >> "$GITHUB_OUTPUT"
247287 echo "image_digest=${IMAGE_DIGEST}" >> "$GITHUB_OUTPUT"
248288 echo "image_uri=${IMAGE_URI_PINNED}" >> "$GITHUB_OUTPUT"
0 commit comments