towerops-agent/.gitlab-ci.yml

138 lines
3.4 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
# 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