diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 00000000..ddfa9964 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,113 @@ +name: PyPI Release + +on: + release: + types: [published] + +jobs: + check_tag: + name: Check tag + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v5 + + - uses: actions/setup-python@v6 + with: + python-version: '3.11' + + - shell: bash + run: | + TAG="${{ github.event.release.tag_name }}" + GH_TAG_NAME="${TAG#v}" + PY_VERSION=$(python - <<'PY' + import pathlib, tomllib + data = tomllib.loads(pathlib.Path("pyproject.toml").read_text(encoding="utf-8")) + print(data.get("project").get("version")) + PY + ) + if [ "${GH_TAG_NAME}" != "${PY_VERSION}" ]; then + echo "::error::Tag (${GH_TAG_NAME}) does not match pyproject.toml version (${PY_VERSION})." + exit 2 + fi + + build_wheels: + name: Build wheels + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v5 + + - uses: actions/setup-python@v6 + with: + python-version: '3.11' + + - name: Build wheel + run: | + python -m pip install build + python -m build --wheel --sdist --outdir wheelhouse + + - name: Store wheels + uses: actions/upload-artifact@v4 + with: + name: wheels + path: wheelhouse/* + + pytest-nosoftdeps: + name: no-softdeps + runs-on: ${{ matrix.os }} + needs: [build_wheels] + strategy: + fail-fast: false + matrix: + os: [ubuntu-latest, macos-latest, windows-latest] + python-version: ["3.10", "3.11", "3.12", "3.13", "3.14"] + + steps: + - uses: actions/checkout@v5 + + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v6 + with: + python-version: ${{ matrix.python-version }} + + - name: Setup macOS + if: runner.os == 'macOS' + run: | + brew install libomp # https://github.com/pytorch/pytorch/issues/20030 + + - name: Get full Python version + id: full-python-version + shell: bash + run: echo version=$(python -c "import sys; print('-'.join(str(v) for v in sys.version_info))") >> $GITHUB_OUTPUT + + - name: Install dependencies + shell: bash + run: | + pip install ".[dev]" + + - name: Show dependencies + run: python -m pip list + + - name: Run pytest + shell: bash + run: python -m pytest tests + + upload_wheels: + name: Upload wheels to PyPI + runs-on: ubuntu-latest + needs: [pytest-nosoftdeps] + + permissions: + id-token: write + + steps: + - uses: actions/download-artifact@v5 + with: + name: wheels + path: wheelhouse + + - name: Publish package to PyPI + uses: pypa/gh-action-pypi-publish@release/v1 + with: + packages-dir: wheelhouse/