Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Use cibuildwheel for building PyPI releases #79

Open
wants to merge 4 commits into
base: master
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
167 changes: 74 additions & 93 deletions .github/workflows/pypi_release.yaml
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
# This workflow is adapted from:
# https://packaging.python.org/en/latest/guides/publishing-package-distribution-releases-using-github-actions-ci-cd-workflows/

name: PyPI Release

on:
push:
tags:
Expand All @@ -22,150 +20,133 @@ jobs:
runs-on: ${{ matrix.os }}
strategy:
matrix:
# os: [ubuntu-latest, macos-latest]
# python-version: ["3.9", "3.10", "3.11", "3.12"]
os: [ubuntu-latest]
python-version: ["3.12"]
os: [ubuntu-latest, windows-latest, macos-13, macos-14]
python-version: ["3.9", "3.10", "3.11", "3.12", "3.13"]

steps:
# # TODO: Add C++ compliers
# # Fetch CUDA toolkit using Jimver/cuda-toolkit
# - name: Fetch CUDA toolkit
# uses: Jimver/[email protected]
# id: cuda-toolkit
# with:
# cuda: "12.1.0"

# - name: Check nvcc version
# run: nvcc -V

# Checkout the repository
- uses: actions/checkout@v4
with:
fetch-depth: 0

# Set up Python
- name: Set up Python
uses: actions/setup-python@v5
# with:
# python-version: "3.12"
with:
python-version: ${{ matrix.python-version }}

- name: Install system dependencies (Ubuntu)
if: runner.os == 'Linux'
run: |
sudo apt-get update
sudo apt-get install -y make gcc g++ python3-dev
# # Install build dependencies
# - name: Install build dependencies (Linux)
# if: runner.os == 'Linux'
# run: sudo apt-get update && sudo apt-get install -y make gcc g++

- name: Install system dependencies (macOS)
if: runner.os == 'macOS'
run: |
brew install gcc make
# - name: Install build dependencies (macOS)
# if: runner.os == 'macOS'
# run: brew install make gcc

- name: Install development and distributions version
run: |
pip install --upgrade pip
pip install -v .
pip install pytest build

- name: Build Source Distribution
# - name: Install build dependencies (Windows)
# if: runner.os == 'Windows'
# run: choco install make mingw
- uses: actions/checkout@v4
- name: Install build dependencies (All)
run: |
make
make test
python -m build --sdist
# TODO: use requirements.txt later
python -m pip install numpy>=1.13 scipy>=1.0.0
python -m pip install --upgrade pip setuptools wheel

- name: Build wheels
uses: pypa/[email protected]
# env:
# CIBW_SOME_OPTION: value
# ...
with:
package-dir: .
output-dir: dist
config-file: "{package}/pyproject.toml"

- name: Store the distribution packages
# Upload built artifacts
- name: Upload wheels as artifact
uses: actions/upload-artifact@v4
with:
name: python-package-distributions
path: dist/

publish-to-pypi:
name: Publish Python distribution to PyPI
# only publish to PyPI on tag pushes
if: startsWith(github.ref, 'refs/tags/')
needs:
- build
needs: build
runs-on: ubuntu-latest
environment:
name: PyPI-Release
url: https://pypi.org/project/${{ env.PYPI_NAME }}
permissions:
id-token: write

if: startsWith(github.ref, 'refs/tags/')
steps:
- name: Download all the dists
# Download all artifacts
- name: Download all artifacts
uses: actions/download-artifact@v4
with:
name: python-package-distributions
path: dist/

# Publish distribution to PyPI
- name: Publish distribution to PyPI
uses: pypa/gh-action-pypi-publish@release/v1
with:
packages_dir: dist
env:
TWINE_USERNAME: "__token__"
TWINE_PASSWORD: ${{ secrets.PYPI_TOKEN }}

publish-to-testpypi:
name: Publish Python distribution to TestPyPI
needs: build
runs-on: ubuntu-latest
steps:
# Download all artifacts
- name: Download all artifacts
uses: actions/download-artifact@v4
with:
name: python-package-distributions
path: dist/

# Publish distribution to TestPyPI
- name: Publish distribution to TestPyPI
uses: pypa/gh-action-pypi-publish@release/v1
with:
repository-url: https://test.pypi.org/legacy/
packages_dir: dist
env:
TWINE_USERNAME: "__token__"
TWINE_PASSWORD: ${{ secrets.TEST_PYPI_TOKEN }}

github-release:
name: Sign the Python distribution with Sigstore and upload them to GitHub Release
needs:
- publish-to-pypi
needs: publish-to-pypi
runs-on: ubuntu-latest

permissions:
contents: write
id-token: write

steps:
- name: Download all the dists
# Download all artifacts
- name: Download all artifacts
uses: actions/download-artifact@v4
with:
name: python-package-distributions
path: dist/

# Sign the dists with Sigstore
- name: Sign the dists with Sigstore
uses: sigstore/[email protected]
with:
inputs: >-
./dist/*.tar.gz

# Create GitHub Release
- name: Create GitHub Release
env:
GITHUB_TOKEN: ${{ github.token }}
run: >-
gh release create
"${{ github.ref_name }}"
--repo "${{ github.repository }}"
--notes ""
run: |
gh release create "${{ github.ref_name }}" --repo "${{ github.repository }}" --notes ""

# Upload artifact signatures to GitHub Release
- name: Upload artifact signatures to GitHub Release
env:
GITHUB_TOKEN: ${{ github.token }}
run: >-
gh release upload
"${{ github.ref_name }}" dist/**
--repo "${{ github.repository }}"

publish-to-testpypi:
name: Publish Python distribution to TestPyPI
# if: ${{ github.ref == "refs/heads/master" && github.repository_owner == "theochem" }}
needs:
- build
runs-on: ubuntu-latest

environment:
name: TestPyPI
url: https://test.pypi.org/project/${{ env.PYPI_NAME }}

permissions:
id-token: write

steps:
- name: Download all the dists
uses: actions/download-artifact@v4
with:
name: python-package-distributions
path: dist/
- name: Publish distribution to TestPyPI
uses: pypa/gh-action-pypi-publish@release/v1
with:
repository-url: https://test.pypi.org/legacy/
env:
TWINE_USERNAME: "__token__"
TWINE_PASSWORD: ${{ secrets.TEST_PYPI_TOKEN }}
run: |
gh release upload "${{ github.ref_name }}" dist/** --repo "${{ github.repository }}"
Loading