Build serpyco-rs wheels (riscv64) #2
This file contains hidden or 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
| # SPDX-FileCopyrightText: 2026 The RISE Project | |
| # SPDX-License-Identifier: MIT | |
| --- | |
| # This workflow is based on: https://github.com/ermakov-oleg/serpyco-rs/blob/v1.22.0/.github/workflows/CI.yml | |
| name: Build serpyco-rs wheels (riscv64) | |
| on: | |
| workflow_dispatch: | |
| inputs: | |
| version: | |
| description: 'serpyco-rs version to build (git tag without leading v, e.g. 1.22.0)' | |
| required: true | |
| default: '1.22.0' | |
| pull_request: | |
| paths: | |
| - '.github/workflows/build-serpyco-rs.yml' | |
| concurrency: | |
| group: ${{ github.workflow }}-${{ inputs.version || '1.22.0' }}-${{ github.head_ref || github.run_id }} | |
| cancel-in-progress: true | |
| permissions: | |
| contents: read # to fetch code (actions/checkout) | |
| env: | |
| # `inputs.version` is empty on pull_request events; default to 1.22.0 there. | |
| SERPYCO_RS_VERSION: ${{ inputs.version || '1.22.0' }} | |
| MANYLINUX_RISCV64_IMAGE: quay.io/pypa/manylinux_2_39_riscv64 | |
| jobs: | |
| setup: | |
| uses: $/.github/workflows/_setup.yml | |
| python_sdist: | |
| needs: [setup] | |
| runs-on: ubuntu-latest | |
| outputs: | |
| sdist_artifact_name: ${{ steps.build_sdist.outputs.sdist_artifact_name }} | |
| package_version: ${{ steps.build_sdist.outputs.package_version }} | |
| steps: | |
| - name: Checkout serpyco-rs v${{ env.SERPYCO_RS_VERSION }} | |
| uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 | |
| with: | |
| repository: ermakov-oleg/serpyco-rs | |
| ref: v${{ env.SERPYCO_RS_VERSION }} | |
| persist-credentials: false | |
| - name: Install Python | |
| uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1 | |
| with: | |
| python-version: '3.12' | |
| activate-environment: true | |
| enable-cache: false | |
| - name: Build sdist | |
| id: build_sdist | |
| run: | | |
| set -euo pipefail | |
| rm -rf dist | |
| uv pip install 'maturin>=1,<2' build | |
| python -m build --sdist --outdir dist | |
| sdist_name="$(ls dist)" | |
| { | |
| echo "sdist_artifact_name=${sdist_name}" | |
| echo "package_version=$(echo "${sdist_name}" | sed -En 's/serpyco_rs-(.+)\.tar\.gz/\1/p')" | |
| } >> "$GITHUB_OUTPUT" | |
| - name: Upload sdist artifact | |
| uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 | |
| with: | |
| name: ${{ steps.build_sdist.outputs.sdist_artifact_name }} | |
| path: dist/${{ steps.build_sdist.outputs.sdist_artifact_name }} | |
| if-no-files-found: error | |
| build_wheels: | |
| needs: [setup, python_sdist] | |
| name: Build serpyco-rs ${{ needs.python_sdist.outputs.package_version }} ${{ matrix.python }}-manylinux_riscv64 | |
| runs-on: ubuntu-24.04-riscv | |
| timeout-minutes: 60 | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| # serpyco-rs's pyo3 dependency carries no abi3 feature, so upstream ships | |
| # cp3x-cp3x wheels per interpreter (not abi3) - every version needs its | |
| # own build. Repo-standard riscv64 target set; upstream builds and tests | |
| # cp314t too, so it's kept here (unlike build-rtoml.yml's cp314t drop). | |
| python: ["cp312", "cp313", "cp314", "cp314t"] | |
| steps: | |
| - name: Fetch sdist artifact | |
| id: fetch_sdist | |
| uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 | |
| with: | |
| name: ${{ needs.python_sdist.outputs.sdist_artifact_name }} | |
| - name: Install uv | |
| uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1 | |
| with: | |
| python-version: '3.12' | |
| activate-environment: true | |
| enable-cache: false | |
| - name: Build and test wheel | |
| env: | |
| CIBW_ARCHS: riscv64 | |
| # Only manylinux: rustup.rs ships no riscv64 musl host toolchain, so | |
| # musllinux can't build (same reason build-sqloxide.yml skips it). | |
| CIBW_BUILD: ${{ matrix.python }}-manylinux_riscv64 | |
| CIBW_MANYLINUX_RISCV64_IMAGE: ${{ env.MANYLINUX_RISCV64_IMAGE }} | |
| # serpyco-rs ships no [tool.cibuildwheel], so the Rust toolchain its | |
| # maturin backend needs is installed in-container here and put on PATH. | |
| CIBW_BEFORE_ALL_LINUX: >- | |
| curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y | |
| CIBW_ENVIRONMENT_LINUX: 'PATH="$PATH:$HOME/.cargo/bin"' | |
| # Mirrors upstream's own `test` job (just ci-test -> pytest tests/). | |
| # Tests live inside the sdist dir we pass to cibuildwheel, so reference | |
| # them via {package} (= /project/serpyco-rs), NOT {project} - see gotcha 5. | |
| CIBW_TEST_REQUIRES: pytest attrs python-dateutil multidict | |
| CIBW_TEST_COMMAND: pytest -q {package}/tests -v | |
| run: | | |
| set -euo pipefail | |
| mkdir serpyco-rs | |
| tar zxf "${{ steps.fetch_sdist.outputs.download-path }}/${{ needs.python_sdist.outputs.sdist_artifact_name }}" \ | |
| --strip-components=1 -C serpyco-rs | |
| uv pip install --upgrade cibuildwheel | |
| python -m cibuildwheel --output-dir wheelhouse ./serpyco-rs | |
| - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 | |
| with: | |
| name: serpyco-rs-${{ needs.python_sdist.outputs.package_version }}-${{ matrix.python }}-manylinux_riscv64 | |
| path: ./wheelhouse/*.whl | |
| if-no-files-found: error | |
| publish: | |
| name: Publish serpyco-rs ${{ needs.python_sdist.outputs.package_version }} | |
| needs: [setup, python_sdist, build_wheels] | |
| permissions: | |
| contents: write | |
| pull-requests: write | |
| uses: $/.github/workflows/_publish-wheel.yml | |
| with: | |
| artifact-pattern: serpyco-rs-${{ needs.python_sdist.outputs.package_version }}-*-manylinux_riscv64 |