#!/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 "$@" 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."