fix(release): всегда PATCH title+note и concurrency для дедупликации
Релиз: архив исходников / Упаковка и публикация релиза (push) Successful in 2s

Корневая причина пустых релизов: при workflow_dispatch + push тега
запускались 2 параллельных run'а, один перезатирал body другого.

- Всегда делаем PATCH после создания/нахождения релиза
- concurrency group: release-{tag} с cancel-in-progress: true
- Гарантирует что body будет записан независимо от race condition
This commit is contained in:
Dmitriy Fofanov
2026-02-25 16:42:59 +03:00
parent 0276aff656
commit 6b900ccd9e
+23 -17
View File
@@ -13,6 +13,10 @@ on:
permissions:
contents: write
concurrency:
group: release-${{ github.event.inputs.tag || github.ref_name }}
cancel-in-progress: true
env:
DIST_DIR: dist
@@ -340,7 +344,7 @@ jobs:
rm -f /tmp/release_id.txt
# If release already exists (e.g. Gitea auto-created it from tag push),
# find it and PATCH to update title + note
# find it by tag
if [ -z "${RELEASE_ID}" ] && [ "${HOST}" != "github.com" ]; then
echo ">>> Релиз не создан (возможно уже существует), ищем по тегу ${TAG}..."
RELEASE_JSON=$(curl -sS \
@@ -351,22 +355,6 @@ jobs:
RELEASE_ID=$(cat /tmp/release_id.txt)
fi
rm -f /tmp/release_id.txt
# Update existing release with our generated title and note
if [ -n "${RELEASE_ID}" ]; then
echo ">>> Обновление существующего релиза (ID: ${RELEASE_ID}) — title + note..."
if [ "${HOST}" = "github.com" ]; then
PATCH_PAYLOAD="{\"name\":\"${RELEASE_TITLE}\",\"body\":${BODY_JSON}}"
else
PATCH_PAYLOAD="{\"title\":\"${RELEASE_TITLE}\",\"note\":${BODY_JSON}}"
fi
PATCH_RESP=$(curl -sS -X PATCH \
-H "${AUTH_HEADER}" \
-H "Content-Type: application/json" \
"${SERVER}/api/v1/repos/${REPO}/releases/${RELEASE_ID}" \
-d "${PATCH_PAYLOAD}")
echo ">>> Релиз обновлён"
fi
fi
if [ -z "${RELEASE_ID}" ]; then
@@ -375,6 +363,24 @@ jobs:
exit 1
fi
# Always PATCH the release to guarantee title + note are set
# (handles race condition when parallel run creates empty release)
echo ">>> Обновление релиза (ID: ${RELEASE_ID}) — title + note..."
if [ "${HOST}" = "github.com" ]; then
PATCH_PAYLOAD="{\"name\":\"${RELEASE_TITLE}\",\"body\":${BODY_JSON}}"
PATCH_URL="https://api.github.com/repos/${REPO}/releases/${RELEASE_ID}"
else
PATCH_PAYLOAD="{\"title\":\"${RELEASE_TITLE}\",\"note\":${BODY_JSON}}"
PATCH_URL="${SERVER}/api/v1/repos/${REPO}/releases/${RELEASE_ID}"
fi
PATCH_RESP=$(curl -sS -X PATCH \
-H "${AUTH_HEADER}" \
-H "Content-Type: application/json" \
"${EXTRA_HEADERS[@]}" \
"${PATCH_URL}" \
-d "${PATCH_PAYLOAD}")
echo ">>> Релиз обновлён"
if [ "${HOST}" = "github.com" ]; then
UPLOAD_BASE=$(printf '%s' "${RELEASE_JSON}" | python3 -c "import sys,json; print(json.load(sys.stdin).get('upload_url','').split('{')[0])")
RELEASE_URL="https://github.com/${REPO}/releases/tag/${TAG}"