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