diff --git a/scripts/upsert-github-release.sh b/scripts/upsert-github-release.sh new file mode 100755 index 0000000..94fb270 --- /dev/null +++ b/scripts/upsert-github-release.sh @@ -0,0 +1,107 @@ +#!/usr/bin/env bash +set -euo pipefail + +# Voraussetzungen: +# - GITHUB_TOKEN +# - GITHUB_OWNER +# - GITHUB_REPO +# - TAG +# - WORKDIR (z. B. /tmp/gitea_release_v0.1.0) + +VERBOSE="${VERBOSE:-false}" +CURL_BASE="curl -s" + +# Funktion zur bedingten curl-Ausgabe +curl_exec() { + if [[ "$VERBOSE" == "true" ]]; then + curl -v "$@" + else + curl -s "$@" > /dev/null + fi +} + + +if [[ -z "${TAG:-}" ]]; then + echo "❌ TAG is not set." + exit 1 +fi + +GITHUB_API_URL="https://api.github.com" +RELEASE_JSON="$WORKDIR/release.json" +ASSETS_DIR="$WORKDIR/assets" + +if [[ ! -f "$RELEASE_JSON" ]]; then + echo "❌ $RELEASE_JSON nicht gefunden." + exit 1 +fi + +RELEASE_NAME=$(jq -r '.name' "$RELEASE_JSON") +RELEASE_BODY=$(jq -r '.body' "$RELEASE_JSON") +RELEASE_DRAFT=$(jq -r '.draft' "$RELEASE_JSON") +RELEASE_PRERELEASE=$(jq -r '.prerelease' "$RELEASE_JSON") + +RESPONSE_FILE=$(mktemp) +HTTP_CODE=$(curl -s -w "%{http_code}" -o "$RESPONSE_FILE" \ + -H "Authorization: token $GITHUB_TOKEN" \ + "$GITHUB_API_URL/repos/$GITHUB_OWNER/$GITHUB_REPO/releases/tags/$TAG" || true) + +if [[ "$HTTP_CODE" == "200" ]]; then + EXISTING_RELEASE=$(cat "$RESPONSE_FILE") + RELEASE_ID=$(echo "$EXISTING_RELEASE" | jq -r '.id') + echo "πŸ“ Release $TAG existiert bereits (ID: $RELEASE_ID), wird aktualisiert." + + echo "$EXISTING_RELEASE" | jq -c '.assets[]?' | while read -r asset; do + ASSET_ID=$(echo "$asset" | jq -r '.id') + NAME=$(echo "$asset" | jq -r '.name') + echo "❌ LΓΆsche bestehendes Asset: $NAME ($ASSET_ID)" + curl_exec -X DELETE \ + -H "Authorization: token $GITHUB_TOKEN" \ + "$GITHUB_API_URL/repos/$GITHUB_OWNER/$GITHUB_REPO/releases/assets/$ASSET_ID" + done + + echo "πŸ”„ Aktualisiere Release-Metadaten ..." + curl_exec -X PATCH \ + -H "Authorization: token $GITHUB_TOKEN" \ + -H "Content-Type: application/json" \ + -d "$(jq -n \ + --arg name "$RELEASE_NAME" \ + --arg body "$RELEASE_BODY" \ + --arg tag "$TAG" \ + --argjson draft "$RELEASE_DRAFT" \ + --argjson prerelease "$RELEASE_PRERELEASE" \ + '{name: $name, body: $body, draft: $draft, prerelease: $prerelease, tag_name: $tag}')" \ + "$GITHUB_API_URL/repos/$GITHUB_OWNER/$GITHUB_REPO/releases/$RELEASE_ID" + +else + echo "πŸ“¦ Release $TAG existiert nicht – wird erstellt (HTTP $HTTP_CODE)." + echo "Antwort: $(cat "$RESPONSE_FILE")" + + echo "πŸš€ Erstelle neuen Release ..." + CREATE_RESPONSE=$(curl_exec -X POST \ + -H "Authorization: token $GITHUB_TOKEN" \ + -H "Content-Type: application/json" \ + -d "$(jq -n \ + --arg tag "$TAG" \ + --arg name "$RELEASE_NAME" \ + --arg body "$RELEASE_BODY" \ + --argjson draft "$RELEASE_DRAFT" \ + --argjson prerelease "$RELEASE_PRERELEASE" \ + '{tag_name: $tag, name: $name, body: $body, draft: $draft, prerelease: $prerelease}')" \ + "$GITHUB_API_URL/repos/$GITHUB_OWNER/$GITHUB_REPO/releases") + + RELEASE_ID=$(echo "$CREATE_RESPONSE" | jq -r '.id') +fi + +UPLOAD_URL="https://uploads.github.com/repos/$GITHUB_OWNER/$GITHUB_REPO/releases/$RELEASE_ID/assets" + +for file in "$ASSETS_DIR"/*; do + FILENAME=$(basename "$file") + echo "⬆ Lade Asset $FILENAME hoch ..." + curl_exec -X POST \ + -H "Authorization: token $GITHUB_TOKEN" \ + -H "Content-Type: application/octet-stream" \ + --data-binary "@$file" \ + "$UPLOAD_URL?name=$FILENAME" +done + +echo "βœ… Release $TAG ist nun auf GitHub aktuell." \ No newline at end of file