stages: - build - deploy variables: DOCKER_BUILDKIT: 1 CI_BUILDX_ARCHS: "linux/amd64" workflow: auto_cancel: on_new_commit: interruptible build: stage: build interruptible: true tags: - gitlabrunner image: docker:27 services: - docker:27-dind before_script: - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY script: # Pull latest image for layer caching (ignore failures if not exists) - docker pull $CI_REGISTRY_IMAGE:latest || true # Build with cache-from for faster builds and inline cache for future builds - docker build --cache-from $CI_REGISTRY_IMAGE:latest --build-arg BUILDKIT_INLINE_CACHE=1 -f k8s/Dockerfile -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA -t $CI_REGISTRY_IMAGE:latest . - docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA - docker push $CI_REGISTRY_IMAGE:latest rules: - if: $CI_COMMIT_BRANCH == "main" deploy: stage: deploy needs: ["build"] tags: - gitlabrunner image: name: bitnami/kubectl:latest entrypoint: [''] script: - kubectl config get-contexts - kubectl config use-context graham/towerops:towerops # Deploy new version (migrations run on app start) - kubectl set image deployment/towerops towerops=$CI_REGISTRY_IMAGE:$CI_COMMIT_SHA -n towerops - kubectl rollout status deployment/towerops -n towerops --timeout=5m environment: name: production kubernetes: namespace: towerops rules: - if: $CI_COMMIT_BRANCH == "main"