Skip to content

Commit 0fb43e4

Browse files
committed
Refactor Lambda deployment workflow to optimize image build process. Introduced a build metadata preparation step to check for existing images before building and pushing, enhancing efficiency. Updated ECR login and Docker build steps to conditionally execute based on the presence of existing images, improving deployment reliability.
1 parent a161017 commit 0fb43e4

File tree

1 file changed

+65
-25
lines changed

1 file changed

+65
-25
lines changed

.github/workflows/deploy-lambda-artifact.yml

Lines changed: 65 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -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
195-
if: ${{ steps.decide.outputs.deployment_mode == 'build' }}
196-
uses: aws-actions/amazon-ecr-login@183a1442edf41672e66566b7fc560e297a290896
197-
198-
- name: Build, publish and emit digest manifest
199-
id: build
193+
- name: Prepare build metadata
194+
id: build-check
200195
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+
)"
213211
214-
IMAGE_DIGEST="$(
212+
IMAGE_URI_GIT="${REPOSITORY_URI}:${GIT_TAG}"
213+
IMAGE_URI_REL="${REPOSITORY_URI}:${REL_TAG}"
214+
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

Comments
 (0)