# 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 # Optional: Multi-architecture build (amd64 + arm64) # Uncomment if you need ARM support (e.g., for Raspberry Pi) # # 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