diff --git a/.gitea/workflows/build-and-push.yaml b/.gitea/workflows/build-and-push.yaml index 3bd958a..6710398 100644 --- a/.gitea/workflows/build-and-push.yaml +++ b/.gitea/workflows/build-and-push.yaml @@ -134,50 +134,51 @@ jobs: source <(grep -v '^#' buildargs.env | sed 's/\r$//') set +a - # 1. Ziel-Images definieren - # Wir starten immer mit Gitea - TARGETS=("-t $IMAGE_GITEA:tmp-amd64" "-t $IMAGE_GITEA:tmp-arm64") - FINAL_TAGS=("-t $IMAGE_GITEA:$TAG" "-t $IMAGE_GITEA:latest") + # 1. Gemeinsame Build-Args in ein Array + DOCKER_ARGS=() + keys=$(grep -v '^#' buildargs.env | cut -d'=' -f1 | tr -d '\r') + for k in $keys; do + DOCKER_ARGS+=("--build-arg" "$k=${!k}") + done + + # Base SHA ermitteln + BASE_SHA=$(docker buildx imagetools inspect $BASE --format '{{json .Manifest.Digest}}' 2>/dev/null | tr -d '"' || echo "unknown") - # 2. Docker Hub Check + # 2. Arrays für die Tags (AMD64 und ARM64 getrennt) + AMD_TAGS=("-t" "$IMAGE_GITEA:tmp-amd64") + ARM_TAGS=("-t" "$IMAGE_GITEA:tmp-arm64") + + # Docker Hub hinzufügen, falls aktiviert if [[ "$PUSH" == *"dockerhub"* ]]; then DOCKERHUB_REPO="${{ secrets.DOCKERHUB_USERNAME }}/$REPO_PURE" echo "📢 Docker Hub Push aktiviert für: $DOCKERHUB_REPO" - TARGETS+=("-t $DOCKERHUB_REPO:tmp-amd64" "-t $DOCKERHUB_REPO:tmp-arm64") - FINAL_TAGS+=("-t $DOCKERHUB_REPO:$TAG" "-t $DOCKERHUB_REPO:latest") + AMD_TAGS+=("-t" "$DOCKERHUB_REPO:tmp-amd64") + ARM_TAGS+=("-t" "$DOCKERHUB_REPO:tmp-arm64") fi - # 3. Build-Args Array (wie besprochen) - DOCKER_ARGS=() - keys=$(grep -v '^#' buildargs.env | cut -d'=' -f1 | tr -d '\r') - for k in $keys; do DOCKER_ARGS+=("--build-arg" "$k=${!k}"); done + # 3. Multi-Arch Build (jetzt mit sauberen Arrays) + # AMD64 + docker buildx build "${DOCKER_ARGS[@]}" "${AMD_TAGS[@]}" \ + --pull --platform linux/amd64 -f Dockerfile \ + --label "pi_farm.base_digest=$BASE_SHA" \ + --label "pi_farm.args_hash=$ARGS_HASH" \ + --push . - BASE_SHA=$(docker buildx imagetools inspect $BASE --format '{{json .Manifest.Digest}}' 2>/dev/null | tr -d '"' || echo "unknown") - - # 4. Multi-Arch Build (Pusht die Fragmente zu allen Zielen) - # Wir filtern hier nach Architektur-Tags - AMD_TARGETS=$(echo "${TARGETS[@]}" | tr ' ' '\n' | grep 'amd64' | xargs) - ARM_TARGETS=$(echo "${TARGETS[@]}" | tr ' ' '\n' | grep 'arm64' | xargs) - - docker buildx build "${DOCKER_ARGS[@]}" --pull --platform linux/amd64 -f Dockerfile \ - --label "pi_farm.base_digest=$BASE_SHA" --label "pi_farm.args_hash=$ARGS_HASH" \ - $AMD_TARGETS --push . + # ARM64 + docker buildx build "${DOCKER_ARGS[@]}" "${ARM_TAGS[@]}" \ + --pull --platform linux/arm64 -f Dockerfile.aarch64 \ + --label "pi_farm.base_digest=$BASE_SHA" \ + --label "pi_farm.args_hash=$ARGS_HASH" \ + --push . - docker buildx build "${DOCKER_ARGS[@]}" --pull --platform linux/arm64 -f Dockerfile.aarch64 \ - --label "pi_farm.base_digest=$BASE_SHA" --label "pi_farm.args_hash=$ARGS_HASH" \ - $ARM_TARGETS --push . - - # 5. Manifeste zusammenführen (Multi-Registry Support) - # Wir erstellen das Manifest für Gitea UND Docker Hub - # Hier loopen wir durch die finalen Image-Namen (Gitea und ggf. Dockerhub) - - # Gitea Manifest + # 4. Manifeste finalisieren + # Gitea docker buildx imagetools create \ --annotation "index:pi_farm.base_digest=$BASE_SHA" \ --annotation "index:pi_farm.args_hash=$ARGS_HASH" \ -t $IMAGE_GITEA:$TAG -t $IMAGE_GITEA:latest $IMAGE_GITEA:tmp-amd64 $IMAGE_GITEA:tmp-arm64 - # Docker Hub Manifest (falls gewünscht) + # Docker Hub (Manifest für die finalen Tags erstellen) if [[ "$PUSH" == *"dockerhub"* ]]; then DOCKERHUB_REPO="${{ secrets.DOCKERHUB_USERNAME }}/$REPO_PURE" docker buildx imagetools create \ @@ -185,7 +186,7 @@ jobs: --annotation "index:pi_farm.args_hash=$ARGS_HASH" \ -t $DOCKERHUB_REPO:$TAG -t $DOCKERHUB_REPO:latest $IMAGE_GITEA:tmp-amd64 $IMAGE_GITEA:tmp-arm64 fi - + - name: Push README to Docker Hub if: steps.check_changes.outputs.should_build == 'true' && contains(env.PUSH, 'dockerhub') run: |