135 lines
3.2 KiB
YAML
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.83-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
|