From 670b5c3d6f4771b3ceed574023340de06ec8cbd6 Mon Sep 17 00:00:00 2001 From: Richard Kiss Date: Sun, 25 Feb 2024 19:06:23 -0800 Subject: [PATCH] Use cibuildwheel --- .github/workflows/build_wheels.yml | 347 ++++------------------------- 1 file changed, 48 insertions(+), 299 deletions(-) diff --git a/.github/workflows/build_wheels.yml b/.github/workflows/build_wheels.yml index fd1703a..ab8ecf0 100644 --- a/.github/workflows/build_wheels.yml +++ b/.github/workflows/build_wheels.yml @@ -1,320 +1,69 @@ -name: Test & Release +# adapted from https://github.com/pypa/cibuildwheel/blob/main/examples/github-deploy.yml +name: Build and upload to PyPI on: [push, pull_request] -concurrency: - group: ${{ github.workflow }}-${{ github.ref }} - cancel-in-progress: true - -env: - PACKAGE_NAME: pycoin_rs - PYTHON_VERSION: "3.7" # to build abi3 wheels - jobs: - macos: - runs-on: macos-latest - steps: - - uses: actions/checkout@v3 - - uses: actions/setup-python@v4 - with: - python-version: ${{ env.PYTHON_VERSION }} - architecture: x64 - - name: Install Rust toolchain - uses: actions-rs/toolchain@v1 - with: - toolchain: stable - profile: minimal - default: true - - name: Build wheels - x86_64 - uses: messense/maturin-action@v1 - with: - target: x86_64 - args: --release --out dist --sdist - maturin-version: "v0.14.3" - - name: Install built wheel - x86_64 - run: | - pip install dist/${{ env.PACKAGE_NAME }}-*.whl --force-reinstall - pip install pytest - pytest -v - - name: Build wheels - universal2 - uses: messense/maturin-action@v1 - with: - args: --release --universal2 --out dist - maturin-version: "v0.14.3" - - name: Install built wheel - universal2 - run: | - pip install dist/${{ env.PACKAGE_NAME }}-*universal2.whl --force-reinstall - pip install pytest - pytest -v - - name: Upload wheels - uses: actions/upload-artifact@v2 - with: - name: wheels - path: dist - - windows: - runs-on: windows-latest + build_wheels: + name: Build wheels on ${{ matrix.os }} + runs-on: ${{ matrix.os }} strategy: + fail-fast: false # remove eventually. This is for debugging matrix: - target: [x64, x86] - steps: - - uses: actions/checkout@v3 - - uses: actions/setup-python@v4 - with: - python-version: ${{ env.PYTHON_VERSION }} - architecture: ${{ matrix.target }} - - name: Install Rust toolchain - uses: actions-rs/toolchain@v1 - with: - toolchain: stable - profile: minimal - default: true - - name: Build wheels - uses: messense/maturin-action@v1 - with: - target: ${{ matrix.target }} - args: --release --out dist - maturin-version: "v0.14.3" - - name: Install built wheel - shell: bash - run: | - python -m pip install dist/${{ env.PACKAGE_NAME }}-*.whl --force-reinstall - pip install pytest - python -m pytest -v - - name: Upload wheels - uses: actions/upload-artifact@v2 - with: - name: wheels - path: dist + # macos-13 is an intel runner, macos-14 is apple silicon + os: [ubuntu-22.04, windows-2022, macos-13, macos-14] - linux: - runs-on: ubuntu-latest - strategy: - matrix: - target: [x86_64, i686] steps: - - uses: actions/checkout@v3 - - uses: actions/setup-python@v4 - with: - python-version: ${{ env.PYTHON_VERSION }} - architecture: x64 - - name: Build wheels - uses: messense/maturin-action@v1 - with: - target: ${{ matrix.target }} - manylinux: auto - args: --release --out dist - maturin-version: "v0.14.3" - - name: Install built wheel - if: matrix.target == 'x86_64' - run: | - pip install dist/${{ env.PACKAGE_NAME }}-*.whl --force-reinstall - pip install pytest - pytest -v - - name: Upload wheels - uses: actions/upload-artifact@v2 - with: - name: wheels - path: dist + - uses: actions/checkout@v4 - linux-cross: - runs-on: ubuntu-latest - strategy: - matrix: - target: [aarch64, armv7, s390x, ppc64le, ppc64] - steps: - - uses: actions/checkout@v3 - - uses: actions/setup-python@v4 - with: - python-version: ${{ env.PYTHON_VERSION }} - - name: Build wheels - uses: messense/maturin-action@v1 - with: - target: ${{ matrix.target }} - manylinux: auto - args: --release --out dist - maturin-version: "v0.14.3" - - uses: uraimo/run-on-arch-action@v2.0.5 - if: matrix.target != 'ppc64' - name: Install built wheel - with: - arch: ${{ matrix.target }} - distro: ubuntu20.04 - githubToken: ${{ github.token }} - install: | - apt-get update - apt-get install -y --no-install-recommends python3 python3-pip - pip3 install -U pip - run: | - pip3 install ${{ env.PACKAGE_NAME }} --no-index --find-links dist/ --force-reinstall - pip install pytest - pytest -v - - name: Upload wheels - uses: actions/upload-artifact@v2 - with: - name: wheels - path: dist + - uses: actions-rust-lang/setup-rust-toolchain@v1 + if: ${{ !startsWith(matrix.os, 'ubuntu') }} - musllinux: - runs-on: ubuntu-latest - strategy: - matrix: - target: - - x86_64-unknown-linux-musl - - i686-unknown-linux-musl - steps: - - uses: actions/checkout@v3 - - uses: actions/setup-python@v4 - with: - python-version: ${{ env.PYTHON_VERSION }} - architecture: x64 - name: Build wheels - uses: messense/maturin-action@v1 - with: - target: ${{ matrix.target }} - manylinux: musllinux_1_2 - args: --release --out dist - maturin-version: "v0.14.3" - - name: Install built wheel - if: matrix.target == 'x86_64-unknown-linux-musl' - uses: addnab/docker-run-action@v3 - with: - image: alpine:latest - options: -v ${{ github.workspace }}:/io -w /io - run: | - apk add py3-pip - python3 -m venv venv - . venv/bin/activate - pip3 install -U pip pytest - pip3 install ${{ env.PACKAGE_NAME }} --no-index --find-links /io/dist/ --force-reinstall - python3 -m pytest - - name: Upload wheels - uses: actions/upload-artifact@v2 + uses: pypa/cibuildwheel@v2.16.5 + env: + CIBW_TEST_REQUIRES: pytest + CIBW_SKIP: "*-musllinux_i686 pp38-win_amd64" + CIBW_TEST_COMMAND: "pytest {project}/tests" + CIBW_BEFORE_BUILD_LINUX: "curl -o rustup.sh --proto '=https' --tlsv1.2 https://sh.rustup.rs && sh ./rustup.sh -y || apk add --no-cache rust cargo" + CIBW_ENVIRONMENT: PATH=$PATH:$HOME/.cargo/bin + + - uses: actions/upload-artifact@v4 with: - name: wheels - path: dist + name: cibw-wheels-${{ matrix.os }}-${{ strategy.job-index }} + path: ./wheelhouse/*.whl - musllinux-cross: + build_sdist: + name: Build source distribution runs-on: ubuntu-latest - strategy: - matrix: - platform: - - target: aarch64-unknown-linux-musl - arch: aarch64 - - target: armv7-unknown-linux-musleabihf - arch: armv7 steps: - - uses: actions/checkout@v3 - - uses: actions/setup-python@v4 - with: - python-version: ${{ env.PYTHON_VERSION }} - - name: Build wheels - uses: messense/maturin-action@v1 - with: - target: ${{ matrix.platform.target }} - manylinux: musllinux_1_2 - args: --release --out dist - maturin-version: "v0.14.3" - - uses: uraimo/run-on-arch-action@master - name: Install built wheel - with: - arch: ${{ matrix.platform.arch }} - distro: alpine_latest - githubToken: ${{ github.token }} - install: | - apk add py3-pip - python3 -m venv venv - . venv/bin/activate - pip3 install -U pip pytest - run: | - pip3 install ${{ env.PACKAGE_NAME }} --no-index --find-links dist/ --force-reinstall - python3 -m pytest - - name: Upload wheels - uses: actions/upload-artifact@v2 - with: - name: wheels - path: dist + - uses: actions/checkout@v4 - pypy: - runs-on: ${{ matrix.os }} - strategy: - matrix: - os: [ubuntu-latest, macos-latest] - target: [x86_64, aarch64] - python-version: - - '3.7' - - '3.8' - - '3.9' - exclude: - - os: macos-latest - target: aarch64 - steps: - - uses: actions/checkout@v3 - - uses: actions/setup-python@v4 - with: - python-version: pypy${{ matrix.python-version }} - - name: Build wheels - uses: messense/maturin-action@v1 - with: - maturin-version: "v0.14.3" - target: ${{ matrix.target }} - manylinux: auto - args: --release --out dist -i pypy${{ matrix.python-version }} - - name: Install built wheel - if: matrix.target == 'x86_64' - run: | - pip install dist/${{ env.PACKAGE_NAME }}-*.whl --force-reinstall - pip install pytest - pytest -v - - name: Upload wheels - uses: actions/upload-artifact@v2 - with: - name: wheels - path: dist + - name: Build sdist + run: pipx run build --sdist - lint: - runs-on: ubuntu-latest - strategy: - matrix: - # Lint on earliest and latest - python: ["3.7", "3.x"] - steps: - - uses: actions/checkout@v2 - - name: Set up Python - uses: actions/setup-python@v2 - with: - python-version: "3.x" - - name: Install Rust toolchain - uses: actions-rs/toolchain@v1 + - uses: actions/upload-artifact@v4 with: - toolchain: stable - profile: minimal - default: true - - name: Lint - run: | - cargo fmt && cargo clippy - release: - name: Release + name: cibw-sdist + path: dist/*.tar.gz + + upload_pypi: + needs: [build_wheels, build_sdist] runs-on: ubuntu-latest - needs: - - lint - - macos - - windows - - linux - - linux-cross - - musllinux - - musllinux-cross - - pypy - if: ${{ github.ref == 'refs/heads/main' }} + environment: pypi + permissions: + id-token: write + if: github.event_name == 'release' && github.event.action == 'published' + # or, alternatively, upload to PyPI on every tag starting with 'v' (remove on: release above to use this) + # if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v') steps: - - uses: actions/download-artifact@v2 + - uses: actions/download-artifact@v4 with: - name: wheels - - uses: actions/setup-python@v2 - - name: Publish to PyPi - env: - TWINE_USERNAME: __token__ - TWINE_PASSWORD: ${{ secrets.PYPI_TOKEN }} - run: | - pip install --upgrade twine - twine upload --skip-existing * + # unpacks all CIBW artifacts into dist/ + pattern: cibw-* + path: dist + merge-multiple: true + + - uses: pypa/gh-action-pypi-publish@release/v1 + #with: + # To test: repository-url: https://test.pypi.org/legacy/