The agent version was always showing 0.1.0 because build.rs tried to run 'git describe' inside the Docker build, but .git directory wasn't copied into the image. Changes: - Add VERSION build arg to Dockerfile - Pass VERSION as env var to cargo build commands - Update GitLab CI to pass --build-arg VERSION - Modify build.rs to prefer BUILD_VERSION env var over git commands This ensures the version displayed by the agent matches the Docker image tag it was built with.
135 lines
4.1 KiB
YAML
135 lines
4.1 KiB
YAML
# GitLab CI/CD Configuration for Towerops Agent
|
|
# Builds and publishes Docker image to Docker Hub
|
|
|
|
stages:
|
|
- test
|
|
- build
|
|
- release
|
|
|
|
variables:
|
|
# Docker Hub Registry
|
|
REGISTRY: docker.io
|
|
IMAGE_NAME: gmcintire/towerops-agent
|
|
# Docker BuildKit for better caching
|
|
DOCKER_BUILDKIT: 1
|
|
# Disable TLS for buildx compatibility
|
|
DOCKER_TLS_CERTDIR: ""
|
|
|
|
# Test stage - compile and check code
|
|
test:
|
|
stage: test
|
|
image: rust:1.83-alpine
|
|
before_script:
|
|
- apk add --no-cache musl-dev protobuf-dev
|
|
- rustup component add rustfmt clippy
|
|
script:
|
|
- cargo check --release
|
|
- cargo fmt -- --check
|
|
- cargo clippy -- -D warnings
|
|
- cargo test
|
|
only:
|
|
- branches
|
|
- merge_requests
|
|
cache:
|
|
key: ${CI_COMMIT_REF_SLUG}-cargo
|
|
paths:
|
|
- target/
|
|
|
|
# Build Docker image for branches (test build)
|
|
build:test:
|
|
stage: build
|
|
image: docker:24-dind
|
|
services:
|
|
- docker:24-dind
|
|
before_script:
|
|
- docker login -u $DOCKERHUB_USERNAME -p $DOCKERHUB_TOKEN
|
|
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 (amd64 only for speed)
|
|
# Tags with timestamp for Watchtower auto-updates
|
|
build:main:
|
|
stage: build
|
|
image: docker:24-dind
|
|
services:
|
|
- docker:24-dind
|
|
before_script:
|
|
- echo "$DOCKERHUB_TOKEN" | docker login -u "$DOCKERHUB_USERNAME" --password-stdin
|
|
- docker buildx create --driver docker-container --name builder --use || docker buildx use builder
|
|
- docker buildx inspect --bootstrap
|
|
- apk add --no-cache git grep sed
|
|
# Generate version from git describe (includes commit count since last tag)
|
|
- VERSION=$(git describe --tags --always --dirty=-modified | sed 's/^v//')
|
|
- TIMESTAMP=$(date +%Y%m%d-%H%M%S)
|
|
- echo "Building version $VERSION at $TIMESTAMP"
|
|
script:
|
|
- |
|
|
docker buildx build \
|
|
--platform linux/amd64 \
|
|
--build-arg VERSION=$VERSION \
|
|
--cache-from type=registry,ref=$REGISTRY/$IMAGE_NAME:buildcache \
|
|
--cache-to type=registry,ref=$REGISTRY/$IMAGE_NAME:buildcache,mode=max \
|
|
--tag $REGISTRY/$IMAGE_NAME:latest \
|
|
--tag $REGISTRY/$IMAGE_NAME:main \
|
|
--tag $REGISTRY/$IMAGE_NAME:$VERSION \
|
|
--tag $REGISTRY/$IMAGE_NAME:main-$CI_COMMIT_SHORT_SHA \
|
|
--tag $REGISTRY/$IMAGE_NAME:main-$TIMESTAMP \
|
|
--push \
|
|
.
|
|
- echo "IMAGE_TAG=$VERSION" >> build.env
|
|
- echo "Built and pushed with tags:"
|
|
- echo " - latest (for production)"
|
|
- echo " - main (for Watchtower tracking)"
|
|
- echo " - $VERSION (git describe)"
|
|
- echo " - main-$CI_COMMIT_SHORT_SHA (commit)"
|
|
- echo " - main-$TIMESTAMP (timestamp)"
|
|
artifacts:
|
|
reports:
|
|
dotenv: build.env
|
|
only:
|
|
- main
|
|
|
|
# Release build for tags (multi-architecture with caching)
|
|
# Note: Multi-arch builds are slow (~15-20 min) due to QEMU emulation for ARM64
|
|
release:multiarch:
|
|
stage: release
|
|
image: docker:24-dind
|
|
services:
|
|
- docker:24-dind
|
|
before_script:
|
|
- echo "$DOCKERHUB_TOKEN" | docker login -u "$DOCKERHUB_USERNAME" --password-stdin
|
|
- docker buildx create --driver docker-container --name multiarch-builder --use || docker buildx use multiarch-builder
|
|
- docker buildx inspect --bootstrap
|
|
script:
|
|
- |
|
|
VERSION=${CI_COMMIT_TAG#v}
|
|
|
|
docker buildx build \
|
|
--platform linux/amd64,linux/arm64 \
|
|
--build-arg VERSION=$VERSION \
|
|
--cache-from type=registry,ref=$REGISTRY/$IMAGE_NAME:buildcache \
|
|
--cache-to type=registry,ref=$REGISTRY/$IMAGE_NAME:buildcache,mode=max \
|
|
--tag $REGISTRY/$IMAGE_NAME:$VERSION \
|
|
--tag $REGISTRY/$IMAGE_NAME:$CI_COMMIT_TAG \
|
|
--tag $REGISTRY/$IMAGE_NAME:latest \
|
|
--push \
|
|
.
|
|
|
|
echo "Released version: $VERSION"
|
|
echo "IMAGE_TAG=$VERSION" >> release.env
|
|
artifacts:
|
|
reports:
|
|
dotenv: release.env
|
|
only:
|
|
- tags
|