109 lines
3.8 KiB
YAML
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"
|