diff --git a/scripts/publish-gitea-release.sh b/scripts/publish-gitea-release.sh index 42406d6..4e85c3b 100755 --- a/scripts/publish-gitea-release.sh +++ b/scripts/publish-gitea-release.sh @@ -149,6 +149,23 @@ api_post_json() { "$1" } +api_post_json_with_status() { + local output_file status + output_file="$(mktemp)" + status="$(curl -sS -o "$output_file" -w '%{http_code}' -X POST \ + -H "Authorization: token ${GITEA_TOKEN}" \ + -H "Content-Type: application/json" \ + -d "$2" \ + "$1")" || { + cat "$output_file" >&2 || true + rm -f "$output_file" + return 1 + } + cat "$output_file" + rm -f "$output_file" + printf '\n%s' "$status" +} + release_id_from_json() { case "$JSON_RUNTIME" in node) @@ -185,14 +202,26 @@ fi release_url="$(api_url "releases/tags/${TAG}")" release_json="" -if release_json="$(api_get "$release_url" 2>/dev/null)"; then +release_status="$(curl -sS -o /dev/null -w '%{http_code}' -H "Authorization: token ${GITEA_TOKEN}" "$release_url" || true)" +if [[ "$release_status" == "200" ]] && release_json="$(api_get "$release_url" 2>/dev/null)"; then log "Release 已存在:$TAG" else log "创建 Release:$TAG" title_json="$(printf '%s' "$TITLE" | json_escape)" notes_json="$(printf '%s' "$NOTES" | json_escape)" payload="{\"tag_name\":\"${TAG}\",\"target_commitish\":\"${TARGET}\",\"name\":${title_json},\"body\":${notes_json},\"draft\":false,\"prerelease\":${PRERELEASE}}" - release_json="$(api_post_json "$(api_url releases)" "$payload")" + create_result="$(api_post_json_with_status "$(api_url releases)" "$payload")" || fail "创建 Release 请求失败" + create_status="${create_result##*$'\n'}" + release_json="${create_result%$'\n'*}" + if [[ "$create_status" == "404" ]]; then + log "当前仓库不支持 Releases 或 Token 无 Release 权限,跳过发布" + printf '\n发布包已生成但未上传 Release:\n' + for package in "${PACKAGES[@]}"; do + printf '%s\n' "$package" + done + exit 0 + fi + [[ "$create_status" == "201" || "$create_status" == "200" ]] || fail "创建 Release 失败,HTTP 状态码:$create_status" fi release_id="$(printf '%s' "$release_json" | release_id_from_json)"