name: Docker Build Split on: push: branches: - 3.23 workflow_dispatch: env: # Das Ziel-Repo (Das saubere Repo) IMAGE_NAME: git.pi-farm.de/pi-farm/docker-baseimage-alpine # Das Cache-Repo (Für die Zwischen-Images) - MUSS IN GITEA EXISTIEREN CACHE_IMAGE_NAME: git.pi-farm.de/pi-farm/docker-baseimage-alpine-cache jobs: build: name: Build amd64 & arm64 separately runs-on: buildx-multiarch steps: - name: Checkout repository uses: actions/checkout@v4 - name: Set image tag from branch run: | VERSION=$(git rev-parse --abbrev-ref HEAD) if [ -z "$VERSION" ]; then echo "ERROR: could not determine branch name" exit 1 fi echo "VERSION=$VERSION" >> $GITEA_ENV echo "BUILD_DATE=$(date -u +%Y-%m-%dT%H:%M:%SZ)" >> $GITEA_ENV - name: Login to registry run: | echo "${{ secrets.REGISTRY_PASSWORD }}" | docker login \ git.pi-farm.de \ -u ${{ secrets.REGISTRY_USER }} \ --password-stdin - name: Setup buildx run: | docker buildx rm multiarch || true docker buildx create \ --name multiarch \ --driver docker-container \ --use docker buildx inspect --bootstrap # SCHRITT 1: AMD64 bauen -> In das CACHE Repo pushen - name: Build & push amd64 (Cache) run: | docker buildx build \ --platform linux/amd64 \ -f Dockerfile \ --build-arg BUILD_DATE=${BUILD_DATE} \ --build-arg VERSION=${VERSION} \ -t ${CACHE_IMAGE_NAME}:${VERSION}-amd64 \ --push \ . # SCHRITT 2: ARM64 bauen -> In das CACHE Repo pushen - name: Build & push arm64 (Cache) run: | docker buildx build \ --platform linux/arm64 \ -f Dockerfile.aarch64 \ --build-arg BUILD_DATE=${BUILD_DATE} \ --build-arg VERSION=${VERSION} \ -t ${CACHE_IMAGE_NAME}:${VERSION}-arm64 \ --push \ . # SCHRITT 3: Manifest erstellen -> In das PROD Repo pushen # Hier geschieht die Magie: Wir nehmen die Quellen aus dem Cache-Repo # und erstellen das Manifest im Prod-Repo. - name: Create and push manifest to Prod run: | docker buildx imagetools create \ -t ${IMAGE_NAME}:${VERSION} \ ${CACHE_IMAGE_NAME}:${VERSION}-amd64 \ ${CACHE_IMAGE_NAME}:${VERSION}-arm64