-name: pypi_upload
+name: Build and publish
on:
release:
types: [published]
+ pull_request:
+ push:
+ branches:
+ - main
permissions:
contents: read
jobs:
- build:
- name: PyPI Upload
+ main:
+ name: sdist + pure wheel
runs-on: ubuntu-latest
+ if: github.event_name == 'release'
steps:
- - uses: actions/checkout@v3
+ - uses: actions/checkout@v4
- - name: Set up Python
+ - name: Set up latest Python
uses: actions/setup-python@v4
with:
python-version: "*"
python -m pip install --upgrade build twine
- name: Build wheel and source distributions
+ run: python -m build
+
+ - if: github.event_name == 'release'
+ name: Upload to PyPI via Twine
+ env:
+ TWINE_PASSWORD: ${{ secrets.PYPI_TOKEN }}
+ run: twine upload --verbose -u '__token__' dist/*
+
+ generate_wheels_matrix:
+ name: generate wheels matrix
+ runs-on: ubuntu-latest
+ outputs:
+ include: ${{ steps.set-matrix.outputs.include }}
+ steps:
+ - uses: actions/checkout@v4
+ - name: Install cibuildwheel and pypyp
run: |
- python -m build
+ pipx install cibuildwheel==2.15.0
+ pipx install pypyp==1
+ - name: generate matrix
+ if: github.event_name != 'pull_request'
+ run: |
+ {
+ cibuildwheel --print-build-identifiers --platform linux \
+ | pyp 'json.dumps({"only": x, "os": "ubuntu-latest"})' \
+ && cibuildwheel --print-build-identifiers --platform macos \
+ | pyp 'json.dumps({"only": x, "os": "macos-latest"})' \
+ && cibuildwheel --print-build-identifiers --platform windows \
+ | pyp 'json.dumps({"only": x, "os": "windows-latest"})'
+ } | pyp 'json.dumps(list(map(json.loads, lines)))' > /tmp/matrix
+ env:
+ CIBW_ARCHS_LINUX: x86_64
+ CIBW_ARCHS_MACOS: x86_64 arm64
+ CIBW_ARCHS_WINDOWS: AMD64
+ - name: generate matrix (PR)
+ if: github.event_name == 'pull_request'
+ run: |
+ cibuildwheel --print-build-identifiers --platform linux \
+ | pyp 'json.dumps({"only": x, "os": "ubuntu-latest"})' \
+ | pyp 'json.dumps(list(map(json.loads, lines)))' > /tmp/matrix
+ env:
+ CIBW_BUILD: "cp38-* cp311-*"
+ CIBW_ARCHS_LINUX: x86_64
+ - id: set-matrix
+ run: echo "include=$(cat /tmp/matrix)" | tee -a $GITHUB_OUTPUT
+
+ mypyc:
+ name: mypyc wheels ${{ matrix.only }}
+ needs: generate_wheels_matrix
+ runs-on: ${{ matrix.os }}
+ strategy:
+ fail-fast: false
+ matrix:
+ include: ${{ fromJson(needs.generate_wheels_matrix.outputs.include) }}
- - name: Upload to PyPI via Twine
+ steps:
+ - uses: actions/checkout@v4
+ - uses: pypa/cibuildwheel@v2.16.2
+ with:
+ only: ${{ matrix.only }}
+
+ - name: Upload wheels as workflow artifacts
+ uses: actions/upload-artifact@v3
+ with:
+ name: ${{ matrix.name }}-mypyc-wheels
+ path: ./wheelhouse/*.whl
+
+ - if: github.event_name == 'release'
+ name: Upload wheels to PyPI via Twine
env:
TWINE_PASSWORD: ${{ secrets.PYPI_TOKEN }}
+ run: pipx run twine upload --verbose -u '__token__' wheelhouse/*.whl
+
+ update-stable-branch:
+ name: Update stable branch
+ needs: [main, mypyc]
+ runs-on: ubuntu-latest
+ if: github.event_name == 'release'
+ permissions:
+ contents: write
+
+ steps:
+ - name: Checkout stable branch
+ uses: actions/checkout@v4
+ with:
+ ref: stable
+ fetch-depth: 0
+
+ - if: github.event_name == 'release'
+ name: Update stable branch to release tag & push
run: |
- twine upload --verbose -u '__token__' dist/*
+ git reset --hard ${{ github.event.release.tag_name }}
+ git push