diff --git a/.gitea/workflows/publish-pyfglair.yaml b/.gitea/workflows/publish-pyfglair.yaml index a827446..a652fe1 100644 --- a/.gitea/workflows/publish-pyfglair.yaml +++ b/.gitea/workflows/publish-pyfglair.yaml @@ -1,15 +1,19 @@ # Сборка и публикация pyfglair в PyPI-реестр пакетов Gitea. # Запуск: Actions → Publish pyfglair → Run workflow (ручной, workflow_dispatch). # -# Секреты репозитория (Settings → Actions → Secrets): -# GITEA_PYPI_TOKEN — personal access token со scope write:package -# GITEA_PYPI_USER — (опционально) имя пользователя Gitea для upload; -# по умолчанию — актор запуска. +# Авторизация (любой из вариантов): +# 1) встроенный job-токен: permissions: packages: write (Gitea ≥ 1.27 со +# scope packages у features) — секреты не нужны; +# 2) personal access token (scope write:package) в секрете PYPI_TOKEN — +# для старых Gitea, где публикация пакетов job-токеном не реализована +# (см. https://docs.gitea.com/usage/actions/comparison — "Package +# repository authorization"). +# Секрет PYPI_USER (опционально) — имя пользователя к PAT; по умолчанию актор. +# ВНИМАНИЕ: имена секретов не могут начинаться с GITEA_ (зарезервировано). # -# Примечания Gitea Actions: -# * встроенный GITEA_TOKEN не может публиковать пакеты — нужен PAT; +# Примечания: # * actions/checkout и actions/setup-python тянутся с github.com -# (если инстанс изолирован — замените на абсолютные URL своих зеркал); +# (если инстанс изолирован — замените на абсолютные URL зеркал); # * сборка wheel с bundled mbedtls требует доступ к github.com # (FetchContent); при BUNDLED=0 ставится системный libmbedtls-dev. name: Publish pyfglair @@ -22,6 +26,10 @@ on: required: false default: "1" +permissions: + contents: read + packages: write + jobs: publish: runs-on: ubuntu-latest @@ -61,20 +69,26 @@ jobs: python -m build ls -l dist + # Запускать из каталога без исходников: иначе python подхватывает + # ./pyfglair (без собранного .so) вместо установленного wheel. - name: Smoke test wheel run: | python -m venv /tmp/wheeltest - /tmp/wheeltest/bin/pip install --quiet dist/*.whl - /tmp/wheeltest/bin/python -c "import pyfglair.session as s; print('pyfglair:', s.__file__)" - /tmp/wheeltest/bin/python -c "from pyfglair import Template, Prop, convert_to_display; assert convert_to_display(Template.A, Prop.DISPLAY_TEMPERATURE, 7000) == 200" + WHEEL="$(pwd)/dist" + /tmp/wheeltest/bin/pip install --quiet "$WHEEL"/*.whl + cd /tmp + /tmp/wheeltest/bin/python -P -c "import pyfglair.session as s; print('pyfglair:', s.__file__)" + /tmp/wheeltest/bin/python -P -c "from pyfglair import Template, Prop, convert_to_display; assert convert_to_display(Template.A, Prop.DISPLAY_TEMPERATURE, 7000) == 200" - name: Publish to Gitea package registry (PyPI) env: - TOKEN: ${{ secrets.GITEA_PYPI_TOKEN }} - SECRET_USER: ${{ secrets.GITEA_PYPI_USER }} + PYPI_TOKEN: ${{ secrets.PYPI_TOKEN }} + PYPI_USER: ${{ secrets.PYPI_USER }} + JOB_TOKEN: ${{ secrets.GITEA_TOKEN }} run: | + TOKEN="${PYPI_TOKEN:-$JOB_TOKEN}" if [ -z "$TOKEN" ]; then - echo "::error::Задайте секрет GITEA_PYPI_TOKEN (PAT со scope write:package)" + echo "::error::Нет токена: разрешите 'packages: write' (Gitea ≥ 1.27) или задайте секрет PYPI_TOKEN (PAT write:package)" exit 1 fi SERVER="${GITHUB_SERVER_URL:-}" @@ -83,7 +97,7 @@ jobs: fi REPO="${GITHUB_REPOSITORY:-$(git remote get-url origin | sed -E 's#.*[:/]([^/]+/[^/]+?)(\.git)?$#\1#')}" OWNER="${REPO%%/*}" - GITEA_USER="${SECRET_USER:-${GITHUB_ACTOR:-git}}" + GITEA_USER="${PYPI_USER:-${GITHUB_ACTOR:-git}}" pip install --upgrade twine python -m twine upload \ --repository-url "$SERVER/api/packages/$OWNER/pypi" \ diff --git a/docs/RELEASE_HA.md b/docs/RELEASE_HA.md index a9d53c0..452502b 100644 --- a/docs/RELEASE_HA.md +++ b/docs/RELEASE_HA.md @@ -12,23 +12,32 @@ ### 1.1. Сборка и публикация wheel (Gitea Actions, ручной запуск) -Workflow: `.gitea/workflows/publish-pyfglair.yaml`. +Workflow: `.gitea/workflows/publish-pyfglair.yaml` (workflow объявляет +`permissions: contents: read, packages: write`). -1. Создайте personal access token Gitea со scope `write:package` - (Settings → Applications → Generate token). -2. Settings репозитория → Actions → Secrets: - * `GITEA_PYPI_TOKEN` — этот токен (обязательно); - * `GITEA_PYPI_USER` — имя пользователя Gitea (опционально; иначе актор - запуска). -3. Actions → **Publish pyfglair** → Run workflow (вход `bundled_mbedtls`: - `1` — встроить mbedtls, `0` — системный `libmbedtls-dev`). -4. Артефакт появится в: `https://git.ratigorsk-12.ru/api/packages//pypi/simple/pyfglair/` - (`` — владелец репозитория, напр. `esphome`). +Авторизация — любой из вариантов: -Workflow собирает `wheel` + `sdist`, прогоняет smoke-тест установки и -публикует через `twine upload --skip-existing`. Повторная публикация той же -версии пропускается; для новой версии поднимите `version` в -`pyproject.toml`. +* **Встроенный job-токен** (Gitea ≥ 1.27, где `packages` поддержан у + features): ничего настраивать не нужно, workflow возьмёт + `${{ secrets.GITEA_TOKEN }}`; +* **Personal access token** со scope `write:package` (для версий, где + публикация пакетов job-токеном ещё не реализована — см. HACS-док Gitea + «Package repository authorization»): положите его в секрет + `PYPI_TOKEN`, при необходимости задайте `PYPI_USER` (имя пользователя к + PAT; иначе — актор запуска). **Имена секретов не могут начинаться с + `GITEA_`** — префикс зарезервирован Gitea. + +Запуск: Actions → **Publish pyfglair** → Run workflow (вход +`bundled_mbedtls`: `1` — встроить mbedtls, `0` — системный +`libmbedtls-dev`). Артефакт появится в +`https://git.ratigorsk-12.ru/api/packages//pypi/simple/pyfglair/` +(`` — владелец репозитория, напр. `esphome`). + +Workflow собирает `wheel` + `sdist`, прогоняет smoke-тест установки +(запускается из `/tmp` с `python -P`, чтобы не подхватить исходники +`pyfglair/` вместо wheel) и публикует через `twine upload --skip-existing`. +Повторная публикация той же версии пропускается; для новой версии поднимите +`version` в `pyproject.toml`. ### 1.2. Установка pyfglair в Home Assistant