diff --git a/.gitea/workflows/release.yml b/.gitea/workflows/release.yml new file mode 100644 index 0000000..f111b90 --- /dev/null +++ b/.gitea/workflows/release.yml @@ -0,0 +1,47 @@ +name: Publish elexam-core + +# Публикация пакета в приватный PyPI-реестр Gitea по git-тегу vX.Y.Z. +# Runner: self-hosted host-режим (label elexam-host), образ с python+uv, без docker.sock. +on: + push: + tags: + - 'v*' + +jobs: + publish: + runs-on: elexam-host + steps: + # Node в раннере нет, поэтому checkout делаем вручную через git clone. + # github.token — автоматический токен job'а с доступом на чтение репозитория. + - name: Clone repository at tag + run: | + rm -rf src-checkout + git clone --depth 1 --branch "${{ github.ref_name }}" \ + "https://x-access-token:${{ github.token }}@git.dregomor.ru/${{ github.repository }}.git" \ + src-checkout + + # Защита источника истины: тег обязан совпадать с version в pyproject.toml. + - name: Verify tag matches package version + working-directory: src-checkout + run: | + VER=$(grep -m1 '^version' pyproject.toml | sed -E 's/.*"([^"]+)".*/\1/') + TAG="${{ github.ref_name }}" + echo "pyproject version: $VER | git tag: $TAG" + if [ "v$VER" != "$TAG" ]; then + echo "::error::Тег $TAG не совпадает с версией пакета v$VER — публикация отменена" + exit 1 + fi + + - name: Build (sdist + wheel) + working-directory: src-checkout + run: uv build + + # Токен PKG_PUBLISH_TOKEN (scope write:package) хранится в Actions secrets, + # в логах маскируется. Реестр отклонит повторную заливку уже существующей версии. + - name: Publish to Gitea PyPI + working-directory: src-checkout + run: | + uv publish \ + --publish-url https://git.dregomor.ru/api/packages/Returner_org/pypi \ + -u Returner_org -p "${{ secrets.PKG_PUBLISH_TOKEN }}" \ + dist/* diff --git a/pyproject.toml b/pyproject.toml index 4ceb57e..4d40b26 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "elexam-core" -version = "0.2.0" +version = "0.2.1" description = "Общая библиотека платформы Elexam: envelope ответа, trace_id, structlog, каталог ошибок, ULID, http-клиент" readme = "README.md" requires-python = ">=3.14"