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