# GitLab CI/CD Configuration for Towerops Agent # Builds and publishes Docker image to GitLab Container Registry stages: - test - build - release variables: # GitLab Container Registry REGISTRY: registry.gitlab.com IMAGE_NAME: graham/towerops-agent # Docker BuildKit for better caching DOCKER_BUILDKIT: 1 DOCKER_TLS_CERTDIR: "/certs" # Test stage - compile and check code test: stage: test image: rust:1.75-alpine before_script: - apk add --no-cache musl-dev script: - cargo check --release - cargo fmt -- --check - cargo clippy -- -D warnings only: - branches - merge_requests cache: key: ${CI_COMMIT_REF_SLUG}-cargo paths: - target/ - .cargo/ # Build Docker image for branches (test build) build:test: stage: build image: docker:24-dind services: - docker:24-dind before_script: - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY script: - | docker build \ --tag $REGISTRY/$IMAGE_NAME:$CI_COMMIT_REF_SLUG \ --tag $REGISTRY/$IMAGE_NAME:$CI_COMMIT_SHORT_SHA \ . - docker push $REGISTRY/$IMAGE_NAME:$CI_COMMIT_REF_SLUG - docker push $REGISTRY/$IMAGE_NAME:$CI_COMMIT_SHORT_SHA only: - branches except: - main - tags # Build and push for main branch build:main: stage: build image: docker:24-dind services: - docker:24-dind before_script: - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY script: - | docker build \ --tag $REGISTRY/$IMAGE_NAME:latest \ --tag $REGISTRY/$IMAGE_NAME:main-$CI_COMMIT_SHORT_SHA \ . - docker push $REGISTRY/$IMAGE_NAME:latest - docker push $REGISTRY/$IMAGE_NAME:main-$CI_COMMIT_SHORT_SHA - echo "IMAGE_TAG=latest" >> build.env artifacts: reports: dotenv: build.env only: - main # Release build for tags (versioned releases) release: stage: release image: docker:24-dind services: - docker:24-dind before_script: - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY script: - | # Extract version from tag (assumes tags like v0.1.0) VERSION=${CI_COMMIT_TAG#v} docker build \ --tag $REGISTRY/$IMAGE_NAME:$VERSION \ --tag $REGISTRY/$IMAGE_NAME:$CI_COMMIT_TAG \ --tag $REGISTRY/$IMAGE_NAME:latest \ . docker push $REGISTRY/$IMAGE_NAME:$VERSION docker push $REGISTRY/$IMAGE_NAME:$CI_COMMIT_TAG docker push $REGISTRY/$IMAGE_NAME:latest echo "Released version: $VERSION" echo "IMAGE_TAG=$VERSION" >> release.env artifacts: reports: dotenv: release.env only: - tags except: - branches build:multiarch: stage: build image: docker:24-dind services: - docker:24-dind before_script: - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY # Enable buildx for multi-arch - docker buildx create --use --name multiarch-builder - docker buildx inspect --bootstrap script: - | VERSION=${CI_COMMIT_TAG#v} docker buildx build \ --platform linux/amd64,linux/arm64 \ --tag $REGISTRY/$IMAGE_NAME:$VERSION \ --tag $REGISTRY/$IMAGE_NAME:latest \ --push \ . only: - tags