# Infrastructure Pipeline - Mosaic Stack # Docker build, Trivy scan, and publish for postgres + openbao images # # Triggers on: docker/** # No quality gates — infrastructure images (base image + config only) when: - event: [push, manual, tag] path: include: - "docker/**" - ".woodpecker/infra.yml" variables: - &kaniko_setup | mkdir -p /kaniko/.docker echo "{\"auths\":{\"git.mosaicstack.dev\":{\"username\":\"$GITEA_USER\",\"password\":\"$GITEA_TOKEN\"}}}" > /kaniko/.docker/config.json steps: # === Docker Build & Push === docker-build-postgres: image: gcr.io/kaniko-project/executor:debug environment: GITEA_USER: from_secret: gitea_username GITEA_TOKEN: from_secret: gitea_token CI_COMMIT_BRANCH: ${CI_COMMIT_BRANCH} CI_COMMIT_TAG: ${CI_COMMIT_TAG} commands: - *kaniko_setup - | DESTINATIONS="" if [ -n "$CI_COMMIT_TAG" ]; then DESTINATIONS="--destination git.mosaicstack.dev/mosaic/stack-postgres:$CI_COMMIT_TAG" elif [ "$CI_COMMIT_BRANCH" = "main" ]; then DESTINATIONS="--destination git.mosaicstack.dev/mosaic/stack-postgres:latest" fi /kaniko/executor --context docker/postgres --dockerfile docker/postgres/Dockerfile --snapshot-mode=redo $DESTINATIONS when: - branch: [main] event: [push, manual, tag] docker-build-openbao: image: gcr.io/kaniko-project/executor:debug environment: GITEA_USER: from_secret: gitea_username GITEA_TOKEN: from_secret: gitea_token CI_COMMIT_BRANCH: ${CI_COMMIT_BRANCH} CI_COMMIT_TAG: ${CI_COMMIT_TAG} commands: - *kaniko_setup - | DESTINATIONS="" if [ -n "$CI_COMMIT_TAG" ]; then DESTINATIONS="--destination git.mosaicstack.dev/mosaic/stack-openbao:$CI_COMMIT_TAG" elif [ "$CI_COMMIT_BRANCH" = "main" ]; then DESTINATIONS="--destination git.mosaicstack.dev/mosaic/stack-openbao:latest" fi /kaniko/executor --context docker/openbao --dockerfile docker/openbao/Dockerfile --snapshot-mode=redo $DESTINATIONS when: - branch: [main] event: [push, manual, tag] # === Container Security Scans === security-trivy-postgres: image: aquasec/trivy:latest environment: GITEA_USER: from_secret: gitea_username GITEA_TOKEN: from_secret: gitea_token CI_COMMIT_BRANCH: ${CI_COMMIT_BRANCH} CI_COMMIT_TAG: ${CI_COMMIT_TAG} commands: - | if [ -n "$$CI_COMMIT_TAG" ]; then SCAN_TAG="$$CI_COMMIT_TAG" elif [ "$$CI_COMMIT_BRANCH" = "main" ]; then SCAN_TAG="latest" else SCAN_TAG="latest" fi mkdir -p ~/.docker echo "{\"auths\":{\"git.mosaicstack.dev\":{\"username\":\"$$GITEA_USER\",\"password\":\"$$GITEA_TOKEN\"}}}" > ~/.docker/config.json trivy image --exit-code 1 --severity HIGH,CRITICAL --ignore-unfixed \ --ignorefile .trivyignore \ git.mosaicstack.dev/mosaic/stack-postgres:$$SCAN_TAG when: - branch: [main] event: [push, manual, tag] depends_on: - docker-build-postgres security-trivy-openbao: image: aquasec/trivy:latest environment: GITEA_USER: from_secret: gitea_username GITEA_TOKEN: from_secret: gitea_token CI_COMMIT_BRANCH: ${CI_COMMIT_BRANCH} CI_COMMIT_TAG: ${CI_COMMIT_TAG} commands: - | if [ -n "$$CI_COMMIT_TAG" ]; then SCAN_TAG="$$CI_COMMIT_TAG" elif [ "$$CI_COMMIT_BRANCH" = "main" ]; then SCAN_TAG="latest" else SCAN_TAG="latest" fi mkdir -p ~/.docker echo "{\"auths\":{\"git.mosaicstack.dev\":{\"username\":\"$$GITEA_USER\",\"password\":\"$$GITEA_TOKEN\"}}}" > ~/.docker/config.json trivy image --exit-code 1 --severity HIGH,CRITICAL --ignore-unfixed \ --ignorefile .trivyignore \ git.mosaicstack.dev/mosaic/stack-openbao:$$SCAN_TAG when: - branch: [main] event: [push, manual, tag] depends_on: - docker-build-openbao # === Package Linking === link-packages: image: alpine:3 environment: GITEA_TOKEN: from_secret: gitea_token commands: - apk add --no-cache curl - sleep 10 - | set -e link_package() { PKG="$$1" echo "Linking $$PKG..." for attempt in 1 2 3; do STATUS=$$(curl -s -o /tmp/link-response.txt -w "%{http_code}" -X POST \ -H "Authorization: token $$GITEA_TOKEN" \ "https://git.mosaicstack.dev/api/v1/packages/mosaic/container/$$PKG/-/link/stack") if [ "$$STATUS" = "201" ] || [ "$$STATUS" = "204" ]; then echo " Linked $$PKG" return 0 elif [ "$$STATUS" = "400" ]; then echo " $$PKG already linked" return 0 elif [ "$$STATUS" = "404" ] && [ $$attempt -lt 3 ]; then echo " $$PKG not found yet, retrying in 5s (attempt $$attempt/3)..." sleep 5 else echo " FAILED: $$PKG status $$STATUS" cat /tmp/link-response.txt return 1 fi done } link_package "stack-postgres" link_package "stack-openbao" when: - branch: [main] event: [push, manual, tag] depends_on: - security-trivy-postgres - security-trivy-openbao