Files
overlord/.gitlab/ci/container-release.yml
T

109 lines
3.8 KiB
YAML

approve-container-release:
stage: package
image: alpine:3.22
rules:
- if: '$CI_PIPELINE_SOURCE == "web" && $RELEASE_VERSION =~ /^\d+\.\d+\.\d+$/'
when: manual
environment:
name: overlord-container-release
script:
- echo "Approved container release ${RELEASE_VERSION}"
container-build:
stage: package
image: docker:27.5.1-cli
services:
- name: docker:27.5.1-dind
command: ["--mtu=1400"]
needs:
- approve-container-release
rules:
- if: '$CI_PIPELINE_SOURCE == "web" && $RELEASE_VERSION =~ /^\d+\.\d+\.\d+$/'
parallel:
matrix:
- PLATFORM: linux/amd64
ARCH: amd64
RUNNER_TAG: saas-linux-small-amd64
- PLATFORM: linux/arm64
ARCH: arm64
RUNNER_TAG: saas-linux-small-arm64
tags:
- $RUNNER_TAG
variables:
DOCKER_TLS_CERTDIR: /certs
before_script:
- echo "$CI_REGISTRY_PASSWORD" | docker login --username "$CI_REGISTRY_USER" --password-stdin "$CI_REGISTRY"
- docker context create ci-builder
- docker buildx create ci-builder --driver docker-container --use
- docker buildx inspect --bootstrap
script:
- |
set -eu
client_version=$(sed -nE 's/.*AgentVersion[[:space:]]*=[[:space:]]*"([0-9]+\.[0-9]+\.[0-9]+)".*/\1/p' Overlord-Client/cmd/agent/config/config.go | head -n1)
server_version=$(sed -nE 's/.*SERVER_VERSION[[:space:]]*=[[:space:]]*"([0-9]+\.[0-9]+\.[0-9]+)".*/\1/p' Overlord-Server/src/version.ts | head -n1)
package_version=$(sed -nE 's/[[:space:]]*"version":[[:space:]]*"([0-9]+\.[0-9]+\.[0-9]+)".*/\1/p' Overlord-Server/package.json | head -n1)
test -n "$client_version"
test "$client_version" = "$server_version"
test "$client_version" = "$package_version"
test "$RELEASE_VERSION" = "$client_version"
- |
set -eu
metadata_file=$(mktemp)
docker buildx build \
--file Dockerfile \
--platform "$PLATFORM" \
--label "org.opencontainers.image.source=$CI_PROJECT_URL" \
--label "org.opencontainers.image.revision=$CI_COMMIT_SHA" \
--cache-from "type=registry,ref=$CI_REGISTRY_IMAGE:buildcache-$ARCH" \
--cache-to "type=registry,ref=$CI_REGISTRY_IMAGE:buildcache-$ARCH,mode=max" \
--output "type=image,name=$CI_REGISTRY_IMAGE,push-by-digest=true,name-canonical=true,push=true" \
--metadata-file "$metadata_file" \
.
digest=$(sed -nE 's/.*"containerimage.digest"[[:space:]]*:[[:space:]]*"sha256:([a-f0-9]+)".*/\1/p' "$metadata_file" | head -n1)
test -n "$digest"
mkdir -p digests
touch "digests/$digest"
artifacts:
expire_in: 1 day
paths:
- digests/
container-publish:
stage: release
image: docker:27.5.1-cli
services:
- name: docker:27.5.1-dind
command: ["--mtu=1400"]
tags:
- saas-linux-small-amd64
needs:
- job: container-build
artifacts: true
rules:
- if: '$CI_PIPELINE_SOURCE == "web" && $RELEASE_VERSION =~ /^\d+\.\d+\.\d+$/'
variables:
DOCKER_TLS_CERTDIR: /certs
before_script:
- echo "$CI_REGISTRY_PASSWORD" | docker login --username "$CI_REGISTRY_USER" --password-stdin "$CI_REGISTRY"
- docker context create ci-builder
- docker buildx create ci-builder --driver docker-container --use
- docker buildx inspect --bootstrap
script:
- |
set -eu
major=${RELEASE_VERSION%%.*}
remainder=${RELEASE_VERSION#*.}
minor=${remainder%%.*}
set --
for digest_file in digests/*; do
set -- "$@" "$CI_REGISTRY_IMAGE@sha256:$(basename "$digest_file")"
done
test "$#" -eq 2
docker buildx imagetools create \
--tag "$CI_REGISTRY_IMAGE:$RELEASE_VERSION" \
--tag "$CI_REGISTRY_IMAGE:$major.$minor" \
--tag "$CI_REGISTRY_IMAGE:$major" \
--tag "$CI_REGISTRY_IMAGE:latest" \
"$@"
docker buildx imagetools inspect "$CI_REGISTRY_IMAGE:$RELEASE_VERSION"