cluster

Infrastructure files for Nordgedanken and Midnightthoughts.
git clone git://archive.git.mtrnord.blog/MTRNord/cluster.git
Log | Files | Refs | README

commit 6557d36889467a8028296f9cfcfad71ace380ad2
parent e8154b964a6036711b4b6e60350f5594a1b590df
Author: MTRNord <MTRNord@users.noreply.github.com>
Date:   Fri, 10 Apr 2026 02:19:48 +0200

fix typo

Signed-off-by: MTRNord <MTRNord@users.noreply.github.com>

Diffstat:
Dapps/talos_cluster/jenkins/seeds/jobs/gitops-multiarch-builds.groovy | 330-------------------------------------------------------------------------------
Aapps/talos_cluster/jenkins/seeds/jobs/gitops_multiarch_builds.groovy | 330+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 330 insertions(+), 330 deletions(-)

diff --git a/apps/talos_cluster/jenkins/seeds/jobs/gitops-multiarch-builds.groovy b/apps/talos_cluster/jenkins/seeds/jobs/gitops-multiarch-builds.groovy @@ -1,330 +0,0 @@ -// Seed job: GitOps multi-arch build pipeline -// Auto-creates the image build pipeline job from this definition - -pipelineJob('gitops-multiarch-builds') { - description('Multi-arch container image builds for GitOps infrastructure') - - triggers { - githubPush() - // Check for updates daily at 3 AM UTC - cron('H 3 * * *') - } - - parameters { - choice( - name: 'BUILD_IMAGE', - choices: ['matrix-backup', 'continuwuity', 'blog', 'bookwyrm', 'all'], - description: 'Which image(s) to build' - ) - } - - definition { - cps { - script(''' - pipeline { - agent any - - options { - timestamps() - timeout(time: 4, unit: 'HOURS') - buildDiscarder(logRotator(numToKeepStr: '10', artifactNumToKeepStr: '5')) - } - - triggers { - githubPush() - // Nightly check for upstream updates (3 AM UTC) - cron('H 3 * * *') - } - - environment { - REGISTRY = 'registry.midnightthoughts.space' - REGISTRY_URL = 'https://registry.midnightthoughts.space' - DOCKER_CONFIG = '/var/run/secrets/docker.io' - COSIGN_KEY_PATH = '/var/run/secrets/cosign/key' - } - - stages { - stage('Prepare Build Environment') { - steps { - script { - echo "=== Preparing multi-arch build environment ===" - sh ''' - # Register QEMU handlers for multi-arch builds - docker run --rm --privileged multiarch/qemu-user-static --reset -p yes || true - - # Verify QEMU is registered - ls -la /proc/sys/fs/binfmt_misc/ || echo "binfmt_misc not available" - - # Enable buildx for multi-arch support - docker buildx create --use --name multiarch-builder || docker buildx use multiarch-builder - docker buildx inspect --bootstrap - ''' - } - } - } - - stage('Clone Repository') { - steps { - checkout scm - } - } - - stage('Build Images') { - parallel { - stage('matrix-backup') { - when { - expression { params.BUILD_IMAGE == 'matrix-backup' || params.BUILD_IMAGE == 'all' } - } - steps { - script { - build_matrix_backup() - } - } - } - - stage('continuwuity') { - when { - expression { params.BUILD_IMAGE == 'continuwuity' || params.BUILD_IMAGE == 'all' } - } - steps { - script { - build_continuwuity() - } - } - } - - stage('blog') { - when { - expression { params.BUILD_IMAGE == 'blog' || params.BUILD_IMAGE == 'all' } - } - steps { - script { - build_blog() - } - } - } - - stage('bookwyrm') { - when { - expression { params.BUILD_IMAGE == 'bookwyrm' || params.BUILD_IMAGE == 'all' } - } - steps { - script { - build_bookwyrm() - } - } - } - } - } - } - - post { - always { - cleanWs() - } - success { - echo "✓ Build pipeline completed successfully!" - } - failure { - echo "✗ Build pipeline failed!" - } - } - } - '''.stripIndent()) - sandbox(true) - } - } -} - -def build_matrix_backup() { - echo "=== Building matrix-backup ===" - docker.image('docker:latest').inside('--privileged') { - sh ''' - set -eu - - # Configure Docker login - mkdir -p ~/.docker - cp ${DOCKER_CONFIG}/config.json ~/.docker/config.json 2>/dev/null || true - - # Get image metadata - TAG_TS=$(date -u +%Y%m%d-%H%M%S) - TAG_SHA="sha-$(git rev-parse --short HEAD)" - IMAGE="${REGISTRY}/mtrnord/cluster/matrix-backup" - - echo "Building multi-arch image: ${IMAGE}" - echo "Tags: ${TAG_TS}, main, ${TAG_SHA}" - - # Build and push multi-arch image - docker buildx build \\ - --platform linux/amd64,linux/arm64 \\ - --tag "${IMAGE}:${TAG_TS}" \\ - --tag "${IMAGE}:main" \\ - --tag "${IMAGE}:${TAG_SHA}" \\ - --push \\ - -f apps/talos_cluster/image-builder/matrix-backup/Dockerfile \\ - apps/talos_cluster/image-builder/matrix-backup/ - - # Sign all pushed digests with cosign - docker run --rm \\ - -v ${COSIGN_KEY_PATH}:/cosign/key:ro \\ - -v ~/.docker:/root/.docker:ro \\ - gcr.io/projectsigstore/cosign:latest \\ - sign --key /cosign/key "${IMAGE}:${TAG_TS}" - - docker run --rm \\ - -v ${COSIGN_KEY_PATH}:/cosign/key:ro \\ - -v ~/.docker:/root/.docker:ro \\ - gcr.io/projectsigstore/cosign:latest \\ - sign --key /cosign/key "${IMAGE}:main" - - docker run --rm \\ - -v ${COSIGN_KEY_PATH}:/cosign/key:ro \\ - -v ~/.docker:/root/.docker:ro \\ - gcr.io/projectsigstore/cosign:latest \\ - sign --key /cosign/key "${IMAGE}:${TAG_SHA}" - ''' - } -} - -def build_continuwuity() { - echo "=== Building continuwuity ===" - docker.image('docker:latest').inside('--privileged') { - sh ''' - set -eu - - # Configure Docker login - mkdir -p ~/.docker - cp ${DOCKER_CONFIG}/config.json ~/.docker/config.json 2>/dev/null || true - - # Get image metadata - TAG_SHA="sha-$(git rev-parse --short HEAD)" - IMAGE="${REGISTRY}/mtrnord/cluster/continuwuity" - - echo "Building multi-arch image: ${IMAGE}" - echo "Tags: main, ${TAG_SHA}" - - # Build and push multi-arch image - docker buildx build \\ - --platform linux/amd64,linux/arm64 \\ - --tag "${IMAGE}:main" \\ - --tag "${IMAGE}:${TAG_SHA}" \\ - --push \\ - -f apps/talos_cluster/image-builder/continuwuity/Dockerfile \\ - apps/talos_cluster/image-builder/continuwuity/ - - # Sign all pushed digests with cosign - docker run --rm \\ - -v ${COSIGN_KEY_PATH}:/cosign/key:ro \\ - -v ~/.docker:/root/.docker:ro \\ - gcr.io/projectsigstore/cosign:latest \\ - sign --key /cosign/key "${IMAGE}:main" - - docker run --rm \\ - -v ${COSIGN_KEY_PATH}:/cosign/key:ro \\ - -v ~/.docker:/root/.docker:ro \\ - gcr.io/projectsigstore/cosign:latest \\ - sign --key /cosign/key "${IMAGE}:${TAG_SHA}" - ''' - } -} - -def build_blog() { - echo "=== Building blog ===" - docker.image('docker:latest').inside('--privileged') { - sh ''' - set -eu - - # Configure Docker login - mkdir -p ~/.docker - cp ${DOCKER_CONFIG}/config.json ~/.docker/config.json 2>/dev/null || true - - # Get image metadata - TAG_TS=$(date -u +%Y%m%d-%H%M%S) - TAG_SHA="sha-$(git rev-parse --short HEAD)" - IMAGE="${REGISTRY}/mtrnord/blog" - - echo "Building multi-arch image: ${IMAGE}" - echo "Tags: ${TAG_TS}, latest, ${TAG_SHA}" - - # Build and push multi-arch image - docker buildx build \\ - --platform linux/amd64,linux/arm64 \\ - --tag "${IMAGE}:${TAG_TS}" \\ - --tag "${IMAGE}:latest" \\ - --tag "${IMAGE}:${TAG_SHA}" \\ - --push \\ - -f apps/talos_cluster/image-builder/blog/Dockerfile \\ - apps/talos_cluster/image-builder/blog/ - - # Sign all pushed digests with cosign - docker run --rm \\ - -v ${COSIGN_KEY_PATH}:/cosign/key:ro \\ - -v ~/.docker:/root/.docker:ro \\ - gcr.io/projectsigstore/cosign:latest \\ - sign --key /cosign/key "${IMAGE}:${TAG_TS}" - - docker run --rm \\ - -v ${COSIGN_KEY_PATH}:/cosign/key:ro \\ - -v ~/.docker:/root/.docker:ro \\ - gcr.io/projectsigstore/cosign:latest \\ - sign --key /cosign/key "${IMAGE}:latest" - - docker run --rm \\ - -v ${COSIGN_KEY_PATH}:/cosign/key:ro \\ - -v ~/.docker:/root/.docker:ro \\ - gcr.io/projectsigstore/cosign:latest \\ - sign --key /cosign/key "${IMAGE}:${TAG_SHA}" - ''' - } -} - -def build_bookwyrm() { - echo "=== Building bookwyrm ===" - docker.image('docker:latest').inside('--privileged') { - sh ''' - set -eu - - # Configure Docker login - mkdir -p ~/.docker - cp ${DOCKER_CONFIG}/config.json ~/.docker/config.json 2>/dev/null || true - - # Get upstream version - VERSION=$(docker run --rm curlimages/curl:latest \\ - curl -sf "https://api.github.com/repos/bookwyrm-social/bookwyrm/releases/latest" | \\ - grep '"tag_name"' | head -1 | cut -d'"' -f4) - - if [ -z "$VERSION" ]; then - echo "ERROR: could not determine upstream version" - exit 1 - fi - - IMAGE="${REGISTRY}/mtrnord/cluster/bookwyrm" - - echo "Building multi-arch image: ${IMAGE}" - echo "Tags: ${VERSION}, latest" - - # Build and push multi-arch image - docker buildx build \\ - --platform linux/amd64,linux/arm64 \\ - --build-arg VERSION="${VERSION}" \\ - --tag "${IMAGE}:${VERSION}" \\ - --tag "${IMAGE}:latest" \\ - --push \\ - -f apps/talos_cluster/image-builder/bookwyrm/Dockerfile \\ - apps/talos_cluster/image-builder/bookwyrm/ - - # Sign all pushed digests with cosign - docker run --rm \\ - -v ${COSIGN_KEY_PATH}:/cosign/key:ro \\ - -v ~/.docker:/root/.docker:ro \\ - gcr.io/projectsigstore/cosign:latest \\ - sign --key /cosign/key "${IMAGE}:${VERSION}" - - docker run --rm \\ - -v ${COSIGN_KEY_PATH}:/cosign/key:ro \\ - -v ~/.docker:/root/.docker:ro \\ - gcr.io/projectsigstore/cosign:latest \\ - sign --key /cosign/key "${IMAGE}:latest" - ''' - } -} diff --git a/apps/talos_cluster/jenkins/seeds/jobs/gitops_multiarch_builds.groovy b/apps/talos_cluster/jenkins/seeds/jobs/gitops_multiarch_builds.groovy @@ -0,0 +1,330 @@ +// Seed job: GitOps multi-arch build pipeline +// Auto-creates the image build pipeline job from this definition + +pipelineJob('gitops-multiarch-builds') { + description('Multi-arch container image builds for GitOps infrastructure') + + triggers { + githubPush() + // Check for updates daily at 3 AM UTC + cron('H 3 * * *') + } + + parameters { + choice( + name: 'BUILD_IMAGE', + choices: ['matrix-backup', 'continuwuity', 'blog', 'bookwyrm', 'all'], + description: 'Which image(s) to build' + ) + } + + definition { + cps { + script(''' + pipeline { + agent any + + options { + timestamps() + timeout(time: 4, unit: 'HOURS') + buildDiscarder(logRotator(numToKeepStr: '10', artifactNumToKeepStr: '5')) + } + + triggers { + githubPush() + // Nightly check for upstream updates (3 AM UTC) + cron('H 3 * * *') + } + + environment { + REGISTRY = 'registry.midnightthoughts.space' + REGISTRY_URL = 'https://registry.midnightthoughts.space' + DOCKER_CONFIG = '/var/run/secrets/docker.io' + COSIGN_KEY_PATH = '/var/run/secrets/cosign/key' + } + + stages { + stage('Prepare Build Environment') { + steps { + script { + echo "=== Preparing multi-arch build environment ===" + sh ''' + # Register QEMU handlers for multi-arch builds + docker run --rm --privileged multiarch/qemu-user-static --reset -p yes || true + + # Verify QEMU is registered + ls -la /proc/sys/fs/binfmt_misc/ || echo "binfmt_misc not available" + + # Enable buildx for multi-arch support + docker buildx create --use --name multiarch-builder || docker buildx use multiarch-builder + docker buildx inspect --bootstrap + ''' + } + } + } + + stage('Clone Repository') { + steps { + checkout scm + } + } + + stage('Build Images') { + parallel { + stage('matrix-backup') { + when { + expression { params.BUILD_IMAGE == 'matrix-backup' || params.BUILD_IMAGE == 'all' } + } + steps { + script { + build_matrix_backup() + } + } + } + + stage('continuwuity') { + when { + expression { params.BUILD_IMAGE == 'continuwuity' || params.BUILD_IMAGE == 'all' } + } + steps { + script { + build_continuwuity() + } + } + } + + stage('blog') { + when { + expression { params.BUILD_IMAGE == 'blog' || params.BUILD_IMAGE == 'all' } + } + steps { + script { + build_blog() + } + } + } + + stage('bookwyrm') { + when { + expression { params.BUILD_IMAGE == 'bookwyrm' || params.BUILD_IMAGE == 'all' } + } + steps { + script { + build_bookwyrm() + } + } + } + } + } + } + + post { + always { + cleanWs() + } + success { + echo "✓ Build pipeline completed successfully!" + } + failure { + echo "✗ Build pipeline failed!" + } + } + } + '''.stripIndent()) + sandbox(true) + } + } +} + +def build_matrix_backup() { + echo "=== Building matrix-backup ===" + docker.image('docker:latest').inside('--privileged') { + sh ''' + set -eu + + # Configure Docker login + mkdir -p ~/.docker + cp ${DOCKER_CONFIG}/config.json ~/.docker/config.json 2>/dev/null || true + + # Get image metadata + TAG_TS=$(date -u +%Y%m%d-%H%M%S) + TAG_SHA="sha-$(git rev-parse --short HEAD)" + IMAGE="${REGISTRY}/mtrnord/cluster/matrix-backup" + + echo "Building multi-arch image: ${IMAGE}" + echo "Tags: ${TAG_TS}, main, ${TAG_SHA}" + + # Build and push multi-arch image + docker buildx build \\ + --platform linux/amd64,linux/arm64 \\ + --tag "${IMAGE}:${TAG_TS}" \\ + --tag "${IMAGE}:main" \\ + --tag "${IMAGE}:${TAG_SHA}" \\ + --push \\ + -f apps/talos_cluster/image-builder/matrix-backup/Dockerfile \\ + apps/talos_cluster/image-builder/matrix-backup/ + + # Sign all pushed digests with cosign + docker run --rm \\ + -v ${COSIGN_KEY_PATH}:/cosign/key:ro \\ + -v ~/.docker:/root/.docker:ro \\ + gcr.io/projectsigstore/cosign:latest \\ + sign --key /cosign/key "${IMAGE}:${TAG_TS}" + + docker run --rm \\ + -v ${COSIGN_KEY_PATH}:/cosign/key:ro \\ + -v ~/.docker:/root/.docker:ro \\ + gcr.io/projectsigstore/cosign:latest \\ + sign --key /cosign/key "${IMAGE}:main" + + docker run --rm \\ + -v ${COSIGN_KEY_PATH}:/cosign/key:ro \\ + -v ~/.docker:/root/.docker:ro \\ + gcr.io/projectsigstore/cosign:latest \\ + sign --key /cosign/key "${IMAGE}:${TAG_SHA}" + ''' + } +} + +def build_continuwuity() { + echo "=== Building continuwuity ===" + docker.image('docker:latest').inside('--privileged') { + sh ''' + set -eu + + # Configure Docker login + mkdir -p ~/.docker + cp ${DOCKER_CONFIG}/config.json ~/.docker/config.json 2>/dev/null || true + + # Get image metadata + TAG_SHA="sha-$(git rev-parse --short HEAD)" + IMAGE="${REGISTRY}/mtrnord/cluster/continuwuity" + + echo "Building multi-arch image: ${IMAGE}" + echo "Tags: main, ${TAG_SHA}" + + # Build and push multi-arch image + docker buildx build \\ + --platform linux/amd64,linux/arm64 \\ + --tag "${IMAGE}:main" \\ + --tag "${IMAGE}:${TAG_SHA}" \\ + --push \\ + -f apps/talos_cluster/image-builder/continuwuity/Dockerfile \\ + apps/talos_cluster/image-builder/continuwuity/ + + # Sign all pushed digests with cosign + docker run --rm \\ + -v ${COSIGN_KEY_PATH}:/cosign/key:ro \\ + -v ~/.docker:/root/.docker:ro \\ + gcr.io/projectsigstore/cosign:latest \\ + sign --key /cosign/key "${IMAGE}:main" + + docker run --rm \\ + -v ${COSIGN_KEY_PATH}:/cosign/key:ro \\ + -v ~/.docker:/root/.docker:ro \\ + gcr.io/projectsigstore/cosign:latest \\ + sign --key /cosign/key "${IMAGE}:${TAG_SHA}" + ''' + } +} + +def build_blog() { + echo "=== Building blog ===" + docker.image('docker:latest').inside('--privileged') { + sh ''' + set -eu + + # Configure Docker login + mkdir -p ~/.docker + cp ${DOCKER_CONFIG}/config.json ~/.docker/config.json 2>/dev/null || true + + # Get image metadata + TAG_TS=$(date -u +%Y%m%d-%H%M%S) + TAG_SHA="sha-$(git rev-parse --short HEAD)" + IMAGE="${REGISTRY}/mtrnord/blog" + + echo "Building multi-arch image: ${IMAGE}" + echo "Tags: ${TAG_TS}, latest, ${TAG_SHA}" + + # Build and push multi-arch image + docker buildx build \\ + --platform linux/amd64,linux/arm64 \\ + --tag "${IMAGE}:${TAG_TS}" \\ + --tag "${IMAGE}:latest" \\ + --tag "${IMAGE}:${TAG_SHA}" \\ + --push \\ + -f apps/talos_cluster/image-builder/blog/Dockerfile \\ + apps/talos_cluster/image-builder/blog/ + + # Sign all pushed digests with cosign + docker run --rm \\ + -v ${COSIGN_KEY_PATH}:/cosign/key:ro \\ + -v ~/.docker:/root/.docker:ro \\ + gcr.io/projectsigstore/cosign:latest \\ + sign --key /cosign/key "${IMAGE}:${TAG_TS}" + + docker run --rm \\ + -v ${COSIGN_KEY_PATH}:/cosign/key:ro \\ + -v ~/.docker:/root/.docker:ro \\ + gcr.io/projectsigstore/cosign:latest \\ + sign --key /cosign/key "${IMAGE}:latest" + + docker run --rm \\ + -v ${COSIGN_KEY_PATH}:/cosign/key:ro \\ + -v ~/.docker:/root/.docker:ro \\ + gcr.io/projectsigstore/cosign:latest \\ + sign --key /cosign/key "${IMAGE}:${TAG_SHA}" + ''' + } +} + +def build_bookwyrm() { + echo "=== Building bookwyrm ===" + docker.image('docker:latest').inside('--privileged') { + sh ''' + set -eu + + # Configure Docker login + mkdir -p ~/.docker + cp ${DOCKER_CONFIG}/config.json ~/.docker/config.json 2>/dev/null || true + + # Get upstream version + VERSION=$(docker run --rm curlimages/curl:latest \\ + curl -sf "https://api.github.com/repos/bookwyrm-social/bookwyrm/releases/latest" | \\ + grep '"tag_name"' | head -1 | cut -d'"' -f4) + + if [ -z "$VERSION" ]; then + echo "ERROR: could not determine upstream version" + exit 1 + fi + + IMAGE="${REGISTRY}/mtrnord/cluster/bookwyrm" + + echo "Building multi-arch image: ${IMAGE}" + echo "Tags: ${VERSION}, latest" + + # Build and push multi-arch image + docker buildx build \\ + --platform linux/amd64,linux/arm64 \\ + --build-arg VERSION="${VERSION}" \\ + --tag "${IMAGE}:${VERSION}" \\ + --tag "${IMAGE}:latest" \\ + --push \\ + -f apps/talos_cluster/image-builder/bookwyrm/Dockerfile \\ + apps/talos_cluster/image-builder/bookwyrm/ + + # Sign all pushed digests with cosign + docker run --rm \\ + -v ${COSIGN_KEY_PATH}:/cosign/key:ro \\ + -v ~/.docker:/root/.docker:ro \\ + gcr.io/projectsigstore/cosign:latest \\ + sign --key /cosign/key "${IMAGE}:${VERSION}" + + docker run --rm \\ + -v ${COSIGN_KEY_PATH}:/cosign/key:ro \\ + -v ~/.docker:/root/.docker:ro \\ + gcr.io/projectsigstore/cosign:latest \\ + sign --key /cosign/key "${IMAGE}:latest" + ''' + } +}