towerops-agent/.gitlab-ci.yml

135 lines
3.2 KiB
YAML

# 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