Skip to content

Commit a658ebc

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 12fb807 commit a658ebc

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
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

Comments
 (0)