twine 7 запрещает --skip-existing для не-PyPI репозиториев (UnsupportedConfiguration); workflow проверяет наличие версии в simple-индексе и пропускает повторную публикацию.
119 lines
5.3 KiB
YAML
119 lines
5.3 KiB
YAML
# Сборка и публикация 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/"
|