Build wheels, optionally deploy to PyPI #20
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |