.github/workflows/build.yml
name: Build wheels, optionally deploy to PyPI
on:
workflow_dispatch:
inputs:
confirm_ref:
description: "Confirm chosen branch name to deploy to PyPI (optional):"
default: ""
override_version:
description: "Override version number (optional):"
default: ""
jobs:
# The deploy_test job is part of the test of whether we should deploy to PyPI.
# The job will succeed if either the confirmation reference is empty or if the
# confirmation is the selected branch or tag name. It will fail if it is
# nonempty and does not match. All later jobs depend on this job, so that
# they will be immediately cancelled if the confirmation is bad. The
# dependency is currently necessary (2021-03) because GitHub Actions does not
# have a simpler method of cancelling an entire workflow---the normal use-case
# expects to try and run as much as possible despite one or two failures.
deploy_test:
name: Verify PyPI deployment confirmation
runs-on: ubuntu-latest
env:
GITHUB_REF: ${{ github.ref }}
CONFIRM_REF: ${{ github.event.inputs.confirm_ref }}
steps:
- name: Compare confirmation to current reference
shell: bash
run: |
[[ -z $CONFIRM_REF || $GITHUB_REF =~ ^refs/(heads|tags)/$CONFIRM_REF$ ]]
if [[ -z $CONFIRM_REF ]]; then
echo "Build only. Nothing will be uploaded to PyPI."
else
echo "Full build and deploy. Wheels and source will be uploaded to PyPI."
fi
build_sdist:
name: Build sdist on Ubuntu
needs: deploy_test
runs-on: ubuntu-latest
env:
OVERRIDE_VERSION: ${{ github.event.inputs.override_version }}
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
name: Install Python
with:
# For the sdist we should be as conservative as possible with our
# Python version. This should be the lowest supported version. This
# means that no unsupported syntax can sneak through.
python-version: '3.11'
- name: Install pip build
run: |
python -m pip install 'build'
- name: Build sdist tarball
shell: bash
run: |
if [[ ! -z "$OVERRIDE_VERSION" ]]; then echo "$OVERRIDE_VERSION" > VERSION; fi
# The build package is the reference PEP 517 package builder. All
# dependencies are specified by our setup code.
python -m build --sdist .
- uses: actions/upload-artifact@v4
with:
name: sdist
path: dist/*.tar.gz
if-no-files-found: error
build_wheels:
name: Build wheels
needs: deploy_test
runs-on: ubuntu-latest
env:
OVERRIDE_VERSION: ${{ github.event.inputs.override_version }}
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
name: Install Python
with:
# This is about the build environment, not the released wheel version.
python-version: '3.11'
- name: Install pip build
run: |
python -m pip install 'build'
- name: Build wheels
shell: bash
run: |
# If the version override was specified, then write it the VERSION
# file with it.
if [[ ! -z "$OVERRIDE_VERSION" ]]; then echo "$OVERRIDE_VERSION" > VERSION; fi
# The build package is the reference PEP 517 package builder. All
# dependencies are specified by our setup code.
python -m build --wheel --outdir wheelhouse .
- uses: actions/upload-artifact@v4
with:
name: wheels
path: ./wheelhouse/*.whl
if-no-files-found: error
deploy:
name: "Deploy to PyPI if desired"
# The confirmation is tested explicitly in `deploy_test`, so we know it is
# either a missing confirmation (so we shouldn't run this job) or a valid
# confirmation. We don't need to retest the value of the confirmation,
# beyond checking that one existed.
if: ${{ github.event.inputs.confirm_ref != '' }}
needs: [deploy_test, build_sdist, build_wheels]
runs-on: ubuntu-latest
steps:
- name: Download build artifacts to local runner
uses: actions/download-artifact@v4
- uses: actions/setup-python@v5
name: Install Python
with:
python-version: '3.11'
- name: Verify this is not a dev version
shell: bash
run: |
python -m pip install wheels/*.whl
python -c 'import qutip_qip; print(qutip_qip.__version__); assert "dev" not in qutip_qip.__version__; assert "+" not in qutip_qip.__version__'
- name: Upload sdist and wheels to PyPI
env:
TWINE_USERNAME: __token__
TWINE_PASSWORD: ${{ secrets.PYPI_API_TOKEN }}
TWINE_NON_INTERACTIVE: 1
TWINE_REPOSITORY: pypi
run: |
python -m pip install "twine"
python -m twine upload --verbose wheels/*.whl sdist/*.tar.gz