diff --git a/.gitea/workflows/release.yml b/.gitea/workflows/release.yml index a14069a..4b528c9 100644 --- a/.gitea/workflows/release.yml +++ b/.gitea/workflows/release.yml @@ -83,17 +83,25 @@ jobs: } > release-notes.md cat release-notes.md + # 重跑幂等:release 已存在时更新说明、清旧附件后重传 - name: 创建 Release 并上传产物 run: | set -euo pipefail API="$SITE/api/v1/repos/$REPO" AUTH="Authorization: token ${TOKEN}" REQ=$(node -e 'const fs=require("fs");process.stdout.write(JSON.stringify({tag_name:process.env.TAG,name:"pn "+process.env.TAG,body:fs.readFileSync("release-notes.md","utf8")}))') - # 同 tag release 已存在(如重跑)时回退为查询 + # 同 tag release 已存在(如失败重跑)时回退为查询 REL=$(curl -fsS -X POST "$API/releases" -H "$AUTH" -H 'Content-Type: application/json' -d "$REQ") \ || REL=$(curl -fsS "$API/releases/tags/${TAG}" -H "$AUTH") RID=$(REL="$REL" node -e 'process.stdout.write(String(JSON.parse(process.env.REL).id))') echo "==> release id=$RID" + # 发布说明以本次构建为准(回退路径下 POST 已冲突,须补写) + curl -fsS -X PATCH "$API/releases/$RID" -H "$AUTH" -H 'Content-Type: application/json' -d "$REQ" >/dev/null + # 清除旧附件,避免重跑产生同名副本 + ASSETS=$(curl -fsS "$API/releases/$RID/assets" -H "$AUTH") + ASSETS="$ASSETS" node -e 'JSON.parse(process.env.ASSETS).forEach(a=>console.log(a.id))' | while read -r aid; do + curl -fsS -X DELETE "$API/releases/$RID/assets/$aid" -H "$AUTH" >/dev/null + done for f in dist/*; do echo "==> 上传 $(basename "$f")" curl -fsS -X POST "$API/releases/$RID/assets?name=$(basename "$f")" -H "$AUTH" -F "attachment=@$f" >/dev/null