Skip to content

Instantly share code, notes, and snippets.

@maximgubar
Created December 3, 2024 07:18
Show Gist options
  • Save maximgubar/1a28cc7fd17c8b21282393d54943ba04 to your computer and use it in GitHub Desktop.
Save maximgubar/1a28cc7fd17c8b21282393d54943ba04 to your computer and use it in GitHub Desktop.
Gitlab build docker image and push both to GitLab and AWS Registry
.build-app-image-target-based:
image: docker:${DOCKER_VERSION}
services:
- docker:${DOCKER_VERSION}-dind
variables:
DOCKER_BUILDKIT: '1'
DOCKER_HOST: tcp://docker:2375
DOCKER_TLS_CERTDIR: ''
APP_NAME: api
DOCKER_CONTEXT: api
TARGETS: ""
before_script:
- apk add --no-cache py3-pip > /dev/null
- pip install awscli > /dev/null
- AWS_ACCESS_KEY_ID="${AWS_ACCESS_KEY_ID_STAGING}" AWS_SECRET_ACCESS_KEY="${AWS_SECRET_ACCESS_KEY_STAGING}" aws ecr get-login-password | docker login --username AWS --password-stdin $DOCKER_REGISTRY_STAGING > /dev/null
- AWS_ACCESS_KEY_ID="${AWS_ACCESS_KEY_ID_PROD}" AWS_SECRET_ACCESS_KEY="${AWS_SECRET_ACCESS_KEY_PROD}" aws ecr get-login-password | docker login --username AWS --password-stdin $DOCKER_REGISTRY_PROD > /dev/null
- docker info
- docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
script:
- if [[ -n "$CI_COMMIT_TAG" ]]; then
echo "This build is for tag $CI_COMMIT_TAG";
export LOCAL_LATEST_IMAGE="$CI_REGISTRY_IMAGE/${APP_NAME}:${CI_DEFAULT_BRANCH}-latest";
else
echo "This build is for commit $CI_COMMIT_SHA";
export LOCAL_LATEST_IMAGE="$CI_REGISTRY_IMAGE/${APP_NAME}:${CI_COMMIT_REF_SLUG}-latest";
fi
- cd $DOCKER_CONTEXT
- |
cache_from_args=""
for target in $TARGETS; do
target_local_latest_image="$CI_REGISTRY_IMAGE/${APP_NAME}:$target-${CI_COMMIT_REF_SLUG}-latest"
target_local_default_latest_image="$CI_REGISTRY_IMAGE/${APP_NAME}:$target-${CI_DEFAULT_BRANCH}-latest"
cache_from_args="--cache-from=$target_local_latest_image $cache_from_args"
docker pull $target_local_latest_image || docker pull $target_local_default_latest_image || true
time docker build --progress=plain --build-arg BUILDKIT_INLINE_CACHE=1 --target $target --cache-from $target_local_latest_image --cache-from $target_local_default_latest_image --tag $target_local_latest_image .
docker push $target_local_latest_image
done
echo "cache_from_args: $cache_from_args"
- docker pull $LOCAL_LATEST_IMAGE || true
- >
time docker build
--progress=plain
--build-arg BUILDKIT_INLINE_CACHE=1
--cache-from $LOCAL_LATEST_IMAGE $cache_from_args
--label "org.opencontainers.image.title=$CI_PROJECT_TITLE"
--label "org.opencontainers.image.created=$CI_JOB_STARTED_AT"
--label "org.opencontainers.image.revision=$CI_COMMIT_SHORT_SHA"
--label "org.opencontainers.image.version=$CI_COMMIT_REF_NAME"
--tag $DOCKER_REGISTRY_STAGING:${APP_NAME}-$CI_COMMIT_SHORT_SHA
--tag $LOCAL_LATEST_IMAGE
.
- echo "Pushing the image to local registry" && time docker push $LOCAL_LATEST_IMAGE
- echo "Pushing the image to the registry" && docker push $DOCKER_REGISTRY_STAGING:${APP_NAME}-$CI_COMMIT_SHORT_SHA
- if [ "$CI_COMMIT_TAG" != "" ]; then echo "Pushing to prod registry" && docker tag $DOCKER_REGISTRY_STAGING:${APP_NAME}-$CI_COMMIT_SHORT_SHA $DOCKER_REGISTRY_PROD:${APP_NAME}-$CI_COMMIT_SHORT_SHA && docker push $DOCKER_REGISTRY_PROD:${APP_NAME}-$CI_COMMIT_SHORT_SHA; fi
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment