Skip to content

Commit

Permalink
Use cibuildwheel for building PyPI releases
Browse files Browse the repository at this point in the history
  • Loading branch information
FanwangM committed Dec 12, 2024
1 parent f79ef9d commit d6d082e
Showing 1 changed file with 72 additions and 95 deletions.
167 changes: 72 additions & 95 deletions .github/workflows/pypi_release.yaml
Original file line number Diff line number Diff line change
@@ -1,16 +1,14 @@
# 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:
# Trigger on version tags (e.g., v1.0.0)
- "v[0-9].[0-9].[0-9]*"
- "[0-9].[0-9].[0-9]*"
- "v[0-9]+.[0-9]+.[0-9]+"
- "[0-9]+.[0-9]+.[0-9]+"
# Trigger on pre-release tags (e.g., v1.0.0-alpha.1)
- "v[0-9].[0-9].[0-9]*-*"
- "[0-9].[0-9].[0-9]*-*"
- "v[0-9]+.[0-9]+.[0-9]+-*"
- "[0-9]+.[0-9]+.[0-9]+-*"

env:
# The name of the package to be published to PyPI and TestPyPI.
Expand All @@ -22,150 +20,129 @@ 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"]

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)
# 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++ python3-dev
run: sudo apt-get update && sudo apt-get install -y make gcc g++

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

- name: Install development and distributions version
run: |
pip install --upgrade pip
pip install -v .
pip install pytest build
- name: Install build dependencies (Windows)
if: runner.os == 'Windows'
run: choco install make mingw

- name: Build Source Distribution
run: |
make
make test
python -m build --sdist
# Compile C++ code
- name: Compile C++ code
run: make

# Install cibuildwheel
- name: Install cibuildwheel
run: python -m pip install cibuildwheel

- name: Store the distribution packages
# Build wheels using cibuildwheel
- name: Build wheels
run: cibuildwheel --output-dir dist

# 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 }}"

0 comments on commit d6d082e

Please sign in to comment.