feat(scripts): add script to manage GitHub releases
- Introduces a Bash script to create or update GitHub releases - Supports uploading release assets and modifying metadata - Handles token-based authentication and error conditions - Improves release management with automated workflows
This commit is contained in:
107
scripts/upsert-github-release.sh
Executable file
107
scripts/upsert-github-release.sh
Executable file
@@ -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."
|
Reference in New Issue
Block a user