diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 8e2ca76..c813030 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -90,15 +90,27 @@ jobs: exit 1 fi payload=$(python3 scripts/release-helper.py build-payload --github) - release_json=$(curl -fsS -X POST \ + # Look up existing release by tag (idempotent on re-run). + release_json=$(curl -fsS \ -H "Authorization: token ${GITHUB_TOKEN}" \ -H "Accept: application/vnd.github+json" \ - -H "Content-Type: application/json" \ - -d "$payload" \ - "${GH_API_URL}/repos/${REPO}/releases") - release_id=$(echo "$release_json" | python3 scripts/release-helper.py extract-id) - upload_url=$(echo "$release_json" | python3 scripts/release-helper.py extract-upload-url) - echo "Created GitHub release id=$release_id" + "${GH_API_URL}/repos/${REPO}/releases/tags/${TAG}" \ + || true) + if [ -n "$release_json" ] && echo "$release_json" | python3 -c 'import json,sys; sys.exit(0 if json.loads(sys.stdin.read()).get("id") else 1)' 2>/dev/null; then + release_id=$(echo "$release_json" | python3 scripts/release-helper.py extract-id) + upload_url=$(echo "$release_json" | python3 scripts/release-helper.py extract-upload-url) + echo "Reusing existing GitHub release id=$release_id for tag $TAG" + else + release_json=$(curl -fsS -X POST \ + -H "Authorization: token ${GITHUB_TOKEN}" \ + -H "Accept: application/vnd.github+json" \ + -H "Content-Type: application/json" \ + -d "$payload" \ + "${GH_API_URL}/repos/${REPO}/releases") + release_id=$(echo "$release_json" | python3 scripts/release-helper.py extract-id) + upload_url=$(echo "$release_json" | python3 scripts/release-helper.py extract-upload-url) + echo "Created GitHub release id=$release_id" + fi curl -fsS -X POST \ -H "Authorization: token ${GITHUB_TOKEN}" \ -H "Accept: application/vnd.github+json" \ @@ -118,13 +130,23 @@ jobs: API="${GH_API_URL%/}/api/v1" fi payload=$(python3 scripts/release-helper.py build-payload) - release_json=$(curl -fsS -X POST \ + # Look up existing release by tag (idempotent on re-run). + release_json=$(curl -fsS \ -H "Authorization: token ${GITEA_TOKEN}" \ - -H "Content-Type: application/json" \ - -d "$payload" \ - "${API}/repos/${REPO}/releases") - release_id=$(echo "$release_json" | python3 scripts/release-helper.py extract-id) - echo "Created Gitea release id=$release_id" + "${API}/repos/${REPO}/releases/tags/${TAG}" \ + || true) + if [ -n "$release_json" ] && echo "$release_json" | python3 -c 'import json,sys; sys.exit(0 if json.loads(sys.stdin.read()).get("id") else 1)' 2>/dev/null; then + release_id=$(echo "$release_json" | python3 scripts/release-helper.py extract-id) + echo "Reusing existing Gitea release id=$release_id for tag $TAG" + else + release_json=$(curl -fsS -X POST \ + -H "Authorization: token ${GITEA_TOKEN}" \ + -H "Content-Type: application/json" \ + -d "$payload" \ + "${API}/repos/${REPO}/releases") + release_id=$(echo "$release_json" | python3 scripts/release-helper.py extract-id) + echo "Created Gitea release id=$release_id" + fi curl -fsS -X POST \ -H "Authorization: token ${GITEA_TOKEN}" \ -H "Content-Type: application/zip" \ diff --git a/scripts/release-helper.py b/scripts/release-helper.py index df4d6cc..0c96aa3 100644 --- a/scripts/release-helper.py +++ b/scripts/release-helper.py @@ -71,6 +71,8 @@ def main() -> int: return extract_field("id") if cmd == "extract-upload-url": return extract_field("upload_url") + if cmd == "extract-tag": + return extract_field("tag_name") return usage()