diff --git a/.gitea/workflows/build-and-push.yaml b/.gitea/workflows/build-and-push.yaml index fa8a6b2..286ca7b 100644 --- a/.gitea/workflows/build-and-push.yaml +++ b/.gitea/workflows/build-and-push.yaml @@ -318,38 +318,57 @@ jobs: - name: Push README to Docker Hub if: steps.check_changes.outputs.should_build == 'true' && contains(steps.prep.outputs.push_targets, 'dockerhub') run: | - # Tool Check & Install + # 1. Sicherstellen, dass jq da ist if ! command -v jq &> /dev/null; then - echo "Installing jq..." - (apt-get update && apt-get install -y jq) || (apk add --no-cache jq) || echo "Could not install jq" + apt-get update && apt-get install -y jq || apk add --no-cache jq || true fi - # Token holen + echo "🚀 Starte README Update auf Docker Hub..." + + # 2. Login Token holen 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) - if [ "$TOKEN" != "null" ] && [ -n "$TOKEN" ]; then - REPO_PURE=${{ steps.prep.outputs.repo_pure }} - DH_USER="${{ secrets.DOCKERHUB_USERNAME }}" - - # Kurzbeschreibung sicher für JSON formatieren - SHORT_DESC=$(echo -e "${{ env.DESCRIPTION }}" | head -n 1 | cut -c 1-100) + if [ "$TOKEN" == "null" ] || [ -z "$TOKEN" ]; then + echo "❌ Fehler: Konnte kein Login-Token abrufen. Prüfe die Credentials!" + exit 1 + fi - echo "📤 Übertrage README und Metadata zu Docker Hub..." - # Wir nutzen jq, um das gesamte JSON-Objekt sicher zu bauen (verhindert Quotes-Fehler) - JSON_PAYLOAD=$(jq -n \ - --arg desc "$SHORT_DESC" \ - --arg full_desc "$(cat README.md)" \ - '{description: $desc, full_description: $full_desc}') + # 3. Variablen vorbereiten + REPO_PURE="${{ steps.prep.outputs.repo_pure }}" + DH_USER="${{ secrets.DOCKERHUB_USERNAME }}" + + # Kurzbeschreibung aus ENV oder Fallback + SHORT_DESC=$(echo -e "${{ env.DESCRIPTION }}" | head -n 1 | cut -c 1-100) + [ -z "$SHORT_DESC" ] && SHORT_DESC="Docker Image für $REPO_PURE" - curl -s -X PATCH "https://hub.docker.com/v2/repositories/${DH_USER}/${REPO_PURE}/" \ - -H "Authorization: JWT ${TOKEN}" \ - -H "Content-Type: application/json" \ - -d "$JSON_PAYLOAD" - echo "✅ Docker Hub erfolgreich aktualisiert." + echo "📦 Verarbeite README.md (${REPO_PURE})..." + + # 4. JSON Payload sicher bauen + # --rawfile lädt die Datei direkt in eine Variable, was Escaping-Fehler verhindert + jq -n \ + --arg desc "$SHORT_DESC" \ + --rawfile full_desc README.md \ + '{description: $desc, full_description: $full_desc}' > payload.json + + # 5. API Request mit detaillierter Ausgabe + echo "📤 Sende Daten an Docker Hub API..." + RESPONSE=$(curl -s -w "\n%{http_code}" -X PATCH \ + "https://hub.docker.com/v2/repositories/${DH_USER}/${REPO_PURE}/" \ + -H "Authorization: JWT ${TOKEN}" \ + -H "Content-Type: application/json" \ + -d @payload.json) + + # Antwort auswerten + HTTP_STATUS=$(echo "$RESPONSE" | tail -n 1) + BODY=$(echo "$RESPONSE" | head -n -1) + + if [ "$HTTP_STATUS" -eq 200 ]; then + echo "✅ README erfolgreich aktualisiert (HTTP 200)." else - echo "❌ Docker Hub Login fehlgeschlagen (Token ist leer)." + echo "❌ Fehler beim Update! HTTP Status: $HTTP_STATUS" + echo "Antwort von Docker Hub: $BODY" exit 1 fi