fix(release): delete leftover tag on re-run; support \\n in changelog input
- Gitea's DELETE /releases/:id does not remove the tag, so re-running the workflow for the same version failed with 409 (curl exit 22). The re-run safety block now also deletes the tag via git/refs/tags. - Replace curl -sf with an api() wrapper that prints Gitea's error body on HTTP >= 400 instead of failing silently. - The workflow_dispatch changelog input is single-line (Gitea has no multiline input type); convert literal \\n to real newlines and document it in the input description.
This commit is contained in:
1 parent
29d0c1a73f
commit
44e8c7322e
1 file changed
+26
-7
@@ -8,7 +8,7 @@ on:
|
|||||||
required: true
|
required: true
|
||||||
type: string
|
type: string
|
||||||
changelog:
|
changelog:
|
||||||
description: "Release notes (markdown, shown on the release page)"
|
description: "Release notes (markdown, shown on the release page). Single-line field — use literal \\n for line breaks."
|
||||||
required: false
|
required: false
|
||||||
type: string
|
type: string
|
||||||
|
|
||||||
@@ -178,19 +178,38 @@ jobs:
|
|||||||
REPO="${GITEA_REPOSITORY:-$GITHUB_REPOSITORY}"
|
REPO="${GITEA_REPOSITORY:-$GITHUB_REPOSITORY}"
|
||||||
TOKEN="${RELEASE_TOKEN:-$GITHUB_TOKEN}"
|
TOKEN="${RELEASE_TOKEN:-$GITHUB_TOKEN}"
|
||||||
VERSION=$(jq -r '.inputs.version' "$GITHUB_EVENT_PATH")
|
VERSION=$(jq -r '.inputs.version' "$GITHUB_EVENT_PATH")
|
||||||
CHANGELOG=$(jq -r '.inputs.changelog // ""' "$GITHUB_EVENT_PATH")
|
# The dispatch input is a single-line field; turn literal \n into real newlines.
|
||||||
|
CHANGELOG=$(jq -r '.inputs.changelog // ""' "$GITHUB_EVENT_PATH" | sed 's/\\n/\n/g')
|
||||||
TAG="v$VERSION"
|
TAG="v$VERSION"
|
||||||
API="$SERVER/api/v1/repos/$REPO"
|
API="$SERVER/api/v1/repos/$REPO"
|
||||||
AUTH="Authorization: token $TOKEN"
|
AUTH="Authorization: token $TOKEN"
|
||||||
|
|
||||||
# Re-run safety: drop a previous release (and its tag) for this version.
|
# curl wrapper: on HTTP >= 400, print the response body (Gitea's error
|
||||||
OLD_ID=$(curl -sf -H "$AUTH" "$API/releases/tags/$TAG" | jq -r '.id // empty')
|
# message) before failing — plain `curl -f` hides it (exit 22).
|
||||||
|
api() {
|
||||||
|
local code body
|
||||||
|
body=$(mktemp)
|
||||||
|
code=$(curl -s -o "$body" -w '%{http_code}' "$@") || { cat "$body"; rm -f "$body"; return 1; }
|
||||||
|
if [ "${code:0:1}" != "2" ]; then
|
||||||
|
echo "API error $code: $(cat "$body")" >&2
|
||||||
|
rm -f "$body"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
cat "$body"
|
||||||
|
rm -f "$body"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Re-run safety: drop a previous release AND its tag for this version.
|
||||||
|
# (Gitea's DELETE /releases/:id does NOT remove the tag; a leftover tag
|
||||||
|
# makes the POST below fail with 409.)
|
||||||
|
OLD_ID=$(api -H "$AUTH" "$API/releases/tags/$TAG" | jq -r '.id // empty') || true
|
||||||
if [ -n "$OLD_ID" ]; then
|
if [ -n "$OLD_ID" ]; then
|
||||||
curl -sf -X DELETE -H "$AUTH" "$API/releases/$OLD_ID" > /dev/null
|
api -X DELETE -H "$AUTH" "$API/releases/$OLD_ID" > /dev/null
|
||||||
fi
|
fi
|
||||||
|
api -X DELETE -H "$AUTH" "$API/git/refs/tags/$TAG" > /dev/null || true
|
||||||
|
|
||||||
# Gitea creates the tag at the default branch HEAD automatically.
|
# Gitea creates the tag at the default branch HEAD automatically.
|
||||||
RELEASE_ID=$(curl -sf -X POST -H "$AUTH" -H "Content-Type: application/json" \
|
RELEASE_ID=$(api -X POST -H "$AUTH" -H "Content-Type: application/json" \
|
||||||
"$API/releases" \
|
"$API/releases" \
|
||||||
-d "$(jq -n --arg tag "$TAG" --arg title "Iris $VERSION" --arg body "$CHANGELOG" \
|
-d "$(jq -n --arg tag "$TAG" --arg title "Iris $VERSION" --arg body "$CHANGELOG" \
|
||||||
'{tag_name:$tag, title:$title, body:$body}')" \
|
'{tag_name:$tag, title:$title, body:$body}')" \
|
||||||
@@ -200,7 +219,7 @@ jobs:
|
|||||||
for f in "$GITHUB_WORKSPACE"/iris-android-v* "$GITHUB_WORKSPACE"/iris-desktop-*; do
|
for f in "$GITHUB_WORKSPACE"/iris-android-v* "$GITHUB_WORKSPACE"/iris-desktop-*; do
|
||||||
[ -f "$f" ] || continue
|
[ -f "$f" ] || continue
|
||||||
echo "Uploading $(basename "$f")"
|
echo "Uploading $(basename "$f")"
|
||||||
curl -sf -X POST -H "$AUTH" -F "attachment=@$f" \
|
api -X POST -H "$AUTH" -F "attachment=@$f" \
|
||||||
"$API/releases/$RELEASE_ID/attachments" > /dev/null
|
"$API/releases/$RELEASE_ID/attachments" > /dev/null
|
||||||
done
|
done
|
||||||
echo "Done: $SERVER/$REPO/releases/tag/$TAG"
|
echo "Done: $SERVER/$REPO/releases/tag/$TAG"
|
||||||
Reference in new issue
Block a user