From 24ada01cebb244a3231995c9ee7b938aa6bf2b25 Mon Sep 17 00:00:00 2001 From: Petr Polezhaev Date: Tue, 29 Sep 2026 15:54:55 +0300 Subject: [PATCH] =?UTF-8?q?ha(ci):=20fix=20smoke-=D1=82=D0=B5=D1=81=D1=82?= =?UTF-8?q?=D0=B0=20wheel=20=D0=B8=20=D1=82=D0=BE=D0=BA=D0=B5=D0=BD=D1=8B?= =?UTF-8?q?=20Gitea?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - smoke-тест запускается из /tmp с python -P: раньше из корня репозитория python подхватывал исходники pyfglair/ (без .so) вместо wheel - permissions: contents: read, packages: write — встроенный GITEA_TOKEN; PAT (scope write:package) в секрете PYPI_TOKEN остаётся fallback для старых Gitea; имена секретов без зарезервированного префикса GITEA_ - RELEASE_HA: оба варианта авторизации и пояснение про smoke-тест --- .gitea/workflows/publish-pyfglair.yaml | 42 +++++++++++++++++--------- docs/RELEASE_HA.md | 39 +++++++++++++++--------- 2 files changed, 52 insertions(+), 29 deletions(-) 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