Files
fgl-aircon/.gitea/workflows/publish-pyfglair.yaml
T
petr.polezhaev 8a073d96a6 ha(ci): pre-check simple-индекса Gitea вместо --skip-existing (twine 7)
twine 7 запрещает --skip-existing для не-PyPI репозиториев
(UnsupportedConfiguration); workflow проверяет наличие версии в
simple-индексе и пропускает повторную публикацию.
2026-09-29 16:00:13 +03:00

119 lines
5.3 KiB
YAML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Сборка и публикация pyfglair в PyPI-реестр пакетов Gitea.
# Запуск: Actions → Publish pyfglair → Run workflow (ручной, workflow_dispatch).
#
# Авторизация (любой из вариантов):
# 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_ (зарезервировано).
#
# Примечания:
# * actions/checkout и actions/setup-python тянутся с github.com
# (если инстанс изолирован — замените на абсолютные URL зеркал);
# * сборка wheel с bundled mbedtls требует доступ к github.com
# (FetchContent); при BUNDLED=0 ставится системный libmbedtls-dev.
name: Publish pyfglair
on:
workflow_dispatch:
inputs:
bundled_mbedtls:
description: "1 — встроить mbedtls, 0 — использовать системный"
required: false
default: "1"
permissions:
contents: read
packages: write
jobs:
publish:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Python
uses: actions/setup-python@v5
with:
python-version: "3.12"
- name: Toolchain
run: |
if ! command -v cmake >/dev/null || ! command -v ninja >/dev/null \
|| ! command -v g++ >/dev/null; then
sudo apt-get update
sudo apt-get install -y --no-install-recommends cmake ninja-build g++
fi
if [ "${{ inputs.bundled_mbedtls }}" = "0" ]; then
sudo apt-get update
sudo apt-get install -y --no-install-recommends libmbedtls-dev
fi
cmake --version | head -1
g++ --version | head -1
- name: Build wheel + sdist
env:
BUNDLED: ${{ inputs.bundled_mbedtls }}
run: |
if [ "$BUNDLED" = "0" ]; then
export FGL_BUNDLED_MBEDTLS=0
else
export FGL_BUNDLED_MBEDTLS=1
fi
pip install --upgrade build
python -m build
ls -l dist
# Запускать из каталога без исходников: иначе python подхватывает
# ./pyfglair (без собранного .so) вместо установленного wheel.
- name: Smoke test wheel
run: |
python -m venv /tmp/wheeltest
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:
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::Нет токена: разрешите 'packages: write' (Gitea ≥ 1.27) или задайте секрет PYPI_TOKEN (PAT write:package)"
exit 1
fi
SERVER="${GITHUB_SERVER_URL:-}"
if [ -z "$SERVER" ]; then
SERVER="$(git remote get-url origin | sed -E 's#^git@([^:]+):.*#https://\1#; s#^(https?://[^/]+)/.*#\1#')"
fi
REPO="${GITHUB_REPOSITORY:-$(git remote get-url origin | sed -E 's#.*[:/]([^/]+/[^/]+?)(\.git)?$#\1#')}"
OWNER="${REPO%%/*}"
GITEA_USER="${PYPI_USER:-${GITHUB_ACTOR:-git}}"
pip install --upgrade twine
# twine 7 не поддерживает --skip-existing для не-PyPI репозиториев,
# поэтому проверяем simple-индекс Gitea сами.
VERSION="$(basename "$(ls dist/pyfglair-*.tar.gz | head -1)" | sed -E 's/^pyfglair-(.+)\.tar\.gz$/\1/')"
INDEX="$SERVER/api/packages/$OWNER/pypi/simple/pyfglair/"
if curl -fsS -u "$GITEA_USER:$TOKEN" "$INDEX" | grep -q "pyfglair-${VERSION}-"; then
echo "Версия $VERSION уже опубликована — пропуск загрузки."
exit 0
fi
python -m twine upload \
--repository-url "$SERVER/api/packages/$OWNER/pypi" \
--username "$GITEA_USER" \
--password "$TOKEN" \
--non-interactive \
dist/*
echo "Опубликовано: $SERVER/api/packages/$OWNER/pypi/simple/pyfglair/"