variables: # Enable Docker BuildKit for multi-arch builds DOCKER_BUILDKIT: 1 IMAGE_NAME: $CI_REGISTRY_IMAGE stages: - build build-and-push: stage: build image: docker:24.0.5 services: - docker:24.0.5-dind before_script: # Log into the GitLab Container Registry using provided CI/CD variables - echo "$CI_REGISTRY_PASSWORD" | docker login $CI_REGISTRY -u "$CI_REGISTRY_USER" --password-stdin # Set up QEMU for multi-architecture builds (equivalent to setup-qemu-action) - docker run --privileged --rm tonistiigi/binfmt --install all # Create and boot a new builder instance (equivalent to setup-buildx-action) - docker buildx create --use --name multi-arch-builder - docker buildx inspect --bootstrap script: # Determine the tags based on the trigger event (Release tag vs Manual branch run) - | if [ -n "$CI_COMMIT_TAG" ]; then # If triggered by a tag (release), build with the specific version and 'latest' TAG_ARGS="-t $IMAGE_NAME:$CI_COMMIT_TAG -t $IMAGE_NAME:latest" else # If triggered manually on a branch, use the branch name as the tag TAG_ARGS="-t $IMAGE_NAME:$CI_COMMIT_REF_SLUG" fi # Build and push the Docker image for both amd64 and arm64 architectures - docker buildx build --push --platform linux/amd64,linux/arm64 $TAG_ARGS . rules: # Trigger automatically when pushing to main branch - if: $CI_COMMIT_BRANCH == "main" # Trigger automatically when a new tag is pushed - if: $CI_COMMIT_TAG # Allow manual triggering from the GitLab Web UI - if: $CI_PIPELINE_SOURCE == "web"