From a01e8452ca50541ed4774fea6de902dadb8e349a Mon Sep 17 00:00:00 2001 From: Dmitriy Fofanov Date: Wed, 25 Feb 2026 00:11:56 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=BE=20=D1=83=D1=81=D0=BB=D0=BE=D0=B2=D0=B8=D0=B5=20?= =?UTF-8?q?=D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D1=80=D0=BA=D0=B8=20=D1=81=D1=83?= =?UTF-8?q?=D1=89=D0=B5=D1=81=D1=82=D0=B2=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8?= =?UTF-8?q?=D1=8F=20=D1=82=D0=B5=D0=B3=D0=B0=20=D0=BF=D0=B5=D1=80=D0=B5?= =?UTF-8?q?=D0=B4=20=D0=BA=D0=BB=D0=BE=D0=BD=D0=B8=D1=80=D0=BE=D0=B2=D0=B0?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=D0=BC=20=D0=B8=20=D1=81=D0=BE=D0=B7=D0=B4?= =?UTF-8?q?=D0=B0=D0=BD=D0=B8=D0=B5=20=D1=82=D0=B5=D0=B3=D0=B0=20=D1=87?= =?UTF-8?q?=D0=B5=D1=80=D0=B5=D0=B7=20API,=20=D0=B5=D1=81=D0=BB=D0=B8=20?= =?UTF-8?q?=D0=BE=D0=BD=20=D0=BE=D1=82=D1=81=D1=83=D1=82=D1=81=D1=82=D0=B2?= =?UTF-8?q?=D1=83=D0=B5=D1=82=20=D0=BD=D0=B0=20=D1=83=D0=B4=D0=B0=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=BD=D0=BE=D0=BC=20=D1=81=D0=B5=D1=80=D0=B2=D0=B5?= =?UTF-8?q?=D1=80=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/release.yml | 76 ++++++++++++++++++++++++++--------- 1 file changed, 58 insertions(+), 18 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 18cedb2..c5af338 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -59,11 +59,32 @@ jobs: CLONE_URL="${SERVER}/${REPO}.git" fi - git clone --branch "${TAG}" --depth 1 "${CLONE_URL}" . 2>&1 | grep -F -v "${TOKEN:-}" || true + # Check if tag exists on the remote + TAG_EXISTS=false + if git ls-remote --exit-code --tags "${CLONE_URL}" "refs/tags/${TAG}" >/dev/null 2>&1; then + TAG_EXISTS=true + fi + + if [ "${TAG_EXISTS}" = "true" ]; then + echo ">>> Тег ${TAG} найден, клонирование..." + git clone --branch "${TAG}" --depth 50 "${CLONE_URL}" . 2>&1 | grep -F -v "${TOKEN:-}" || true + else + echo ">>> Тег ${TAG} не найден, клонирование ветки master..." + git clone --branch master --depth 50 "${CLONE_URL}" . 2>&1 | grep -F -v "${TOKEN:-}" || true + fi + git fetch --tags --force 2>/dev/null || true + # If tag doesn't exist locally, create and push it + if [ "${TAG_EXISTS}" = "false" ] && git rev-parse --is-inside-work-tree >/dev/null 2>&1; then + echo ">>> Создание тега ${TAG} на текущем коммите ($(git rev-parse --short HEAD))..." + git tag "${TAG}" + git push origin "${TAG}" 2>&1 | grep -F -v "${TOKEN:-}" || true + echo ">>> Тег ${TAG} создан и отправлен" + fi + echo "RELEASE_TAG=${TAG}" >> "$GITHUB_ENV" - echo ">>> Исходный код получен: $(git log --oneline -1)" + echo ">>> Исходный код получен: $(git log --oneline -1 2>/dev/null || echo 'N/A')" - name: "Подготовка метаданных релиза" id: meta @@ -236,22 +257,7 @@ jobs: HOST="${HOST#http://}" TAG="${{ steps.meta.outputs.tag }}" - TARGET_COMMITISH="${RELEASE_REF:-master}" - if [ -n "${GITHUB_SHA:-}" ]; then - TARGET_COMMITISH="${GITHUB_SHA}" - fi - if git rev-parse --is-inside-work-tree >/dev/null 2>&1; then - TARGET_COMMITISH="$(git rev-list -n 1 "${TAG}" 2>/dev/null || echo "${TARGET_COMMITISH}")" - fi - - BODY_JSON=$(python3 - <<'PY' - import json - - with open('/tmp/release_body.md', 'r', encoding='utf-8') as f: - print(json.dumps(f.read(), ensure_ascii=False)) - PY - ) - + # Set up API URLs and auth header early (needed for tag check below) if [ "${HOST}" = "github.com" ]; then CREATE_URL="https://api.github.com/repos/${REPO}/releases" AUTH_HEADER="Authorization: Bearer ${TOKEN}" @@ -262,6 +268,40 @@ jobs: EXTRA_HEADERS=() fi + TARGET_COMMITISH="${RELEASE_REF:-master}" + if [ -n "${GITHUB_SHA:-}" ]; then + TARGET_COMMITISH="${GITHUB_SHA}" + fi + if git rev-parse --is-inside-work-tree >/dev/null 2>&1; then + TARGET_COMMITISH="$(git rev-list -n 1 "${TAG}" 2>/dev/null || echo "${TARGET_COMMITISH}")" + fi + + # Ensure the tag exists on the remote (Gitea requires it before creating a release) + if [ "${HOST}" != "github.com" ]; then + TAG_HTTP_CODE=$(curl -sS -o /dev/null -w '%{http_code}' \ + -H "${AUTH_HEADER}" \ + "${SERVER}/api/v1/repos/${REPO}/tags/${TAG}") + if [ "${TAG_HTTP_CODE}" != "200" ]; then + echo ">>> Тег ${TAG} не найден на сервере (HTTP ${TAG_HTTP_CODE}), создание через API..." + TAG_CREATE_RESP=$(curl -sS -X POST \ + -H "${AUTH_HEADER}" \ + -H "Content-Type: application/json" \ + "${SERVER}/api/v1/repos/${REPO}/tags" \ + -d "{\"tag_name\":\"${TAG}\",\"target\":\"${TARGET_COMMITISH}\"}") + echo ">>> Ответ создания тега: ${TAG_CREATE_RESP}" + else + echo ">>> Тег ${TAG} существует на сервере" + fi + fi + + BODY_JSON=$(python3 - <<'PY' + import json + + with open('/tmp/release_body.md', 'r', encoding='utf-8') as f: + print(json.dumps(f.read(), ensure_ascii=False)) + PY + ) + RELEASE_PAYLOAD="{\"tag_name\":\"${TAG}\",\"target_commitish\":\"${TARGET_COMMITISH}\",\"name\":\"${TAG}\",\"body\":${BODY_JSON},\"draft\":false,\"prerelease\":false}" RELEASE_JSON=$(curl -sS -X POST \ -H "${AUTH_HEADER}" \