From ba8f38b991a5a90be8147415cf74d72f70e31bae Mon Sep 17 00:00:00 2001 From: Fanwang Meng Date: Wed, 30 Oct 2024 21:37:09 -0400 Subject: [PATCH] Use cibuildwheel for building PyPI releases --- .github/workflows/pypi_release.yaml | 167 ++++++++++++---------------- 1 file changed, 72 insertions(+), 95 deletions(-) diff --git a/.github/workflows/pypi_release.yaml b/.github/workflows/pypi_release.yaml index fc3d7e0..e1dba20 100644 --- a/.github/workflows/pypi_release.yaml +++ b/.github/workflows/pypi_release.yaml @@ -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. @@ -22,58 +20,46 @@ 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/cuda-toolkit@v0.2.18 - # 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 @@ -81,33 +67,51 @@ jobs: 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: @@ -115,57 +119,30 @@ jobs: 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/gh-action-sigstore-python@v3.0.0 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 }}"