From d25f1697c5b5cf0a77930f3edab4cf89b4cdf6d2 Mon Sep 17 00:00:00 2001 From: "info@pi-farm.de" <6+pi-farm@noreply.git.pi-farm.de> Date: Wed, 7 Oct 2026 10:31:35 +0000 Subject: [PATCH] fix build and cleanup steps if Dockerfile.aarch64 does not exist --- .gitea/workflows/build-and-push.yaml | 68 +++++++++++++++++++--------- 1 file changed, 46 insertions(+), 22 deletions(-) diff --git a/.gitea/workflows/build-and-push.yaml b/.gitea/workflows/build-and-push.yaml index af5753e..19693de 100644 --- a/.gitea/workflows/build-and-push.yaml +++ b/.gitea/workflows/build-and-push.yaml @@ -120,7 +120,7 @@ jobs: with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - + - name: Build and Push Docker Image if: steps.check_changes.outputs.should_build == 'true' run: | @@ -143,26 +143,40 @@ jobs: BASE_SHA=$(docker buildx imagetools inspect $BASE --format '{{json .Manifest.Digest}}' 2>/dev/null | tr -d '"' || echo "unknown") - # Bereite die Tags für den initialen Build vor (Gitea immer, Docker Hub optional) + # AMD64 ist immer das primäre Target AMD_TAGS=("-t" "$IMAGE_GITEA:tmp-amd64") - ARM_TAGS=("-t" "$IMAGE_GITEA:tmp-arm64") + GITEA_SOURCES=("$IMAGE_GITEA:tmp-amd64") if [[ "$PUSH" == *"dockerhub"* ]]; then AMD_TAGS+=("-t" "$DOCKERHUB_REPO:tmp-amd64") - ARM_TAGS+=("-t" "$DOCKERHUB_REPO:tmp-arm64") + DH_SOURCES=("$DOCKERHUB_REPO:tmp-amd64") fi - # Build AMD64 & Push zu allen Zielen + # 1. Build AMD64 & Push 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 . - - # Build ARM64 & Push zu allen Zielen - 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 . - - # 1. Manifest auf Gitea erstellen (aus Gitea Temp-Tags) + + # 2. Prüfung auf ARM64 Dockerfile + if [ -f "Dockerfile.aarch64" ]; then + echo "⚙️ Dockerfile.aarch64 gefunden. Baue ARM64 Image..." + + ARM_TAGS=("-t" "$IMAGE_GITEA:tmp-arm64") + GITEA_SOURCES+=("$IMAGE_GITEA:tmp-arm64") + + if [[ "$PUSH" == *"dockerhub"* ]]; then + ARM_TAGS+=("-t" "$DOCKERHUB_REPO:tmp-arm64") + DH_SOURCES+=("$DOCKERHUB_REPO:tmp-arm64") + fi + + 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 . + else + echo "ℹ️ Keine Dockerfile.aarch64 gefunden. ARM64 Build wird übersprungen." + fi + + # 3. Manifest auf Gitea erstellen (nutzt nur die tatsächlich gebauten Temp-Tags) GITEA_MANIFEST_TAGS=("-t" "$IMAGE_GITEA:$TAG") if [[ "$BUILD_TAG_LATEST" == "y" ]]; then GITEA_MANIFEST_TAGS+=("-t" "$IMAGE_GITEA:latest") @@ -170,19 +184,18 @@ jobs: docker buildx imagetools create \ --annotation "index:pi_farm.base_digest=$BASE_SHA" --annotation "index:pi_farm.args_hash=$ARGS_HASH" \ - "${GITEA_MANIFEST_TAGS[@]}" $IMAGE_GITEA:tmp-amd64 $IMAGE_GITEA:tmp-arm64 + "${GITEA_MANIFEST_TAGS[@]}" "${GITEA_SOURCES[@]}" - # 2. Manifest auf Docker Hub erstellen (aus Docker Hub Temp-Tags!) + # 4. Manifest auf Docker Hub erstellen if [[ "$PUSH" == *"dockerhub"* ]]; then DH_MANIFEST_TAGS=("-t" "$DOCKERHUB_REPO:$TAG") if [[ "$BUILD_TAG_LATEST" == "y" ]]; then DH_MANIFEST_TAGS+=("-t" "$DOCKERHUB_REPO:latest") fi - # WICHTIG: Hier werden jetzt als Quelle die Docker Hub Temp-Tags genutzt! docker buildx imagetools create \ --annotation "index:pi_farm.base_digest=$BASE_SHA" --annotation "index:pi_farm.args_hash=$ARGS_HASH" \ - "${DH_MANIFEST_TAGS[@]}" $DOCKERHUB_REPO:tmp-amd64 $DOCKERHUB_REPO:tmp-arm64 + "${DH_MANIFEST_TAGS[@]}" "${DH_SOURCES[@]}" fi - name: Update Documentation and Compose @@ -436,17 +449,23 @@ jobs: TOKEN=$(curl -s -X POST "https://hub.docker.com/v2/users/login/" \ -H "Content-Type: application/json" \ - -d "{\"username\": \"${{ secrets.DOCKERHUB_USERNAME }}\", \"password\": \"${{ secrets.DOCKERHUB_TOKEN }}\"}" | jq -r .token) + -d "{\"username\": \"${{ secrets.DOCKERHUB_USERNAME }}\", \"password\": \"${{ secrets.DOCKERHUB_TOKEN }}\"}" | jq -r .token || echo "") if [ "$TOKEN" != "null" ] && [ -n "$TOKEN" ]; then REPO_PURE=${{ steps.prep.outputs.repo_pure }} DH_USER="${{ secrets.DOCKERHUB_USERNAME }}" - for t in tmp-amd64 tmp-arm64; do + # Nur existierende Tags löschen + CLEAN_TAGS=("tmp-amd64") + if [ -f "Dockerfile.aarch64" ]; then + CLEAN_TAGS+=("tmp-arm64") + fi + + for t in "${CLEAN_TAGS[@]}"; do echo "Deleting tag $t..." STATUS=$(curl -s -o /dev/null -w "%{http_code}" -X DELETE \ "https://hub.docker.com/v2/repositories/${DH_USER}/${REPO_PURE}/tags/$t/" \ - -H "Authorization: JWT ${TOKEN}") + -H "Authorization: JWT ${TOKEN}" || echo "000") echo "Status: $STATUS" done echo "✅ Temp. tags deleted." @@ -459,9 +478,14 @@ jobs: ORG_NAME=$(echo "${{ gitea.repository }}" | cut -d'/' -f1) REPO_NAME=$(echo "${{ gitea.repository }}" | cut -d'/' -f2) - for t in tmp-amd64 tmp-arm64; do - curl -s -X DELETE "https://git.pi-farm.de/api/v1/packages/$ORG_NAME/container/$REPO_NAME/$t" -H "Authorization: token $TOKEN" - curl -s -X DELETE "https://git.pi-farm.de/api/v1/packages/${ORG_NAME,,}/container/${REPO_NAME,,}/$t" -H "Authorization: token $TOKEN" + CLEAN_TAGS=("tmp-amd64") + if [ -f "Dockerfile.aarch64" ]; then + CLEAN_TAGS+=("tmp-arm64") + fi + + for t in "${CLEAN_TAGS[@]}"; do + curl -s -X DELETE "https://git.pi-farm.de/api/v1/packages/$ORG_NAME/container/$REPO_NAME/$t" -H "Authorization: token $TOKEN" || true + curl -s -X DELETE "https://git.pi-farm.de/api/v1/packages/${ORG_NAME,,}/container/${REPO_NAME,,}/$t" -H "Authorization: token $TOKEN" || true done - name: Cleanup Docker Artifacts