Skip to content

fix: prevent queueing or killing external jobs (#100) #414

fix: prevent queueing or killing external jobs (#100)

fix: prevent queueing or killing external jobs (#100) #414

# This workflow will install Python dependencies, run tests and lint with a variety of Python versions
# For more information see: https://help.github.com/actions/language-and-framework-guides/using-python-with-github-actions
name: Python package
on:
push:
branches:
- main
- develop
- release-*
pull_request:
branches:
- develop
- release-*
release:
types:
- published
concurrency:
group: ${{ github.head_ref || github.run_id }}
cancel-in-progress: true
jobs:
meta:
runs-on: ubuntu-latest
outputs:
commit-message: ${{ steps.get-commit-message.outputs.commit-message }}
steps:
- uses: actions/checkout@v4
with:
ref: ${{ github.event.pull_request.head.sha || github.sha }} # gets correct commit message
- name: Show commit
run: git show -s
- name: Output commit message
id: get-commit-message
run: |
{
echo 'commit-message<<CI_EOF'
git show -s --format="%B"
echo CI_EOF
} >> "$GITHUB_OUTPUT"
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
submodules: true
ref: ${{ github.event.pull_request.head.sha }} # gets correct commit message
- uses: actions/setup-python@v5
with:
python-version: "3.10"
cache: "pip"
cache-dependency-path: "pyproject.toml"
- name: Install dependencies
run: |
python -m pip install --upgrade pip wheel
python -m pip install --editable .[dev]
- name: Lint with ruff
run: |
ruff check --select I .
ruff format --check .
- name: Type check with Pyright
run: pyright
- name: Build sdist
run: python -m build --sdist --no-isolation --skip-dependency-check --outdir dist
- uses: actions/upload-artifact@v4
with:
name: wheels
path: dist
test:
needs: [lint]
runs-on: ${{ matrix.os }}
strategy:
fail-fast: true
matrix:
os: ["ubuntu-latest", "macos-latest", "windows-latest"]
python-version: ["3.7", "3.13"]
exclude:
# Latest macos runner does not support older Python versions
# https://github.com/actions/setup-python/issues/852
- os: macos-latest
python-version: "3.7"
steps:
- uses: actions/checkout@v4
with:
submodules: true
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}
cache: "pip"
cache-dependency-path: "pyproject.toml"
- name: Install dependencies
run: |
python -m pip install --upgrade pip wheel
python -m pip install --editable .[dev]
- name: Downgrade numpy
if: ${{ matrix.python-version == '3.7' }}
run: |
# test with older numpy version to ensure compatibility
python -m pip install numpy==1.15
- name: Test with pytest
run: |
pytest -v --benchmark-disable -n auto
# NOTE: build step only runs on tag builds or when the commit message contains
# "[ci test build]" for testing
build:
needs: [meta, test]
if: "${{ startsWith(github.ref, 'refs/tags/') || contains(needs.meta.outputs.commit-message, '[ci test build]') }}"
runs-on: ${{ matrix.os }}
strategy:
fail-fast: true
matrix:
os: ["ubuntu-20.04", "macos-12", "windows-2019"]
steps:
- uses: actions/checkout@v4
with:
submodules: true
- name: Set up QEMU
if: runner.os == 'Linux'
uses: docker/setup-qemu-action@v3
with:
platforms: arm64
- uses: pypa/cibuildwheel@v2.21.3
env:
CIBW_SKIP: cp36-* pp*-win* pp*-macosx* *_i686
CIBW_TEST_SKIP: "*-win_arm64"
CIBW_ARCHS_LINUX: "x86_64 aarch64"
CIBW_ARCHS_MACOS: "x86_64 arm64 universal2"
CIBW_ARCHS_WINDOWS: "AMD64 ARM64"
with:
output-dir: dist
- uses: actions/upload-artifact@v4
with:
name: wheels-${{ runner.os }}
path: dist
# NOTE: release step only runs on tag builds
release:
name: Release
runs-on: ubuntu-latest
if: ${{ startsWith(github.ref, 'refs/tags/') }}
needs: [build]
steps:
- uses: actions/download-artifact@v4
with:
name: wheels
- uses: actions/download-artifact@v4
with:
name: wheels-Linux
- uses: actions/download-artifact@v4
with:
name: wheels-macOS
- uses: actions/download-artifact@v4
with:
name: wheels-Windows
- uses: actions/setup-python@v5
with:
python-version: "3.10"
- name: Publish to PyPI
env:
TWINE_USERNAME: __token__
TWINE_PASSWORD: ${{ secrets.PYPI_PASSWORD }}
run: |
python -m pip install --upgrade twine
twine upload --skip-existing *