From 78f67396d743f9d062aa17402f65f296a2902443 Mon Sep 17 00:00:00 2001 From: Ludovic Henry Date: Mon, 7 Sep 2026 18:04:13 +0200 Subject: [PATCH 1/2] typeid-python: add build-typeid-python.yml for riscv64 wheels Adds a maturin/PyO3 build for typeid-python (K-sortable, type-safe TypeIDs). The rust-base32 extension is per-interpreter (no abi3), so the matrix builds cp312/cp313/cp314/cp314t; musllinux is skipped (rustup ships no riscv64 musl toolchain). uuid-utils, pydantic-core and pyyaml already have riscv64 wheels on our registry. --- .github/workflows/build-typeid-python.yml | 143 ++++++++++++++++++++++ 1 file changed, 143 insertions(+) create mode 100644 .github/workflows/build-typeid-python.yml diff --git a/.github/workflows/build-typeid-python.yml b/.github/workflows/build-typeid-python.yml new file mode 100644 index 000000000..b925f14c3 --- /dev/null +++ b/.github/workflows/build-typeid-python.yml @@ -0,0 +1,143 @@ +# SPDX-FileCopyrightText: 2026 The RISE Project +# SPDX-License-Identifier: MIT + +# This workflow is based on: https://github.com/akhundMurad/typeid-python/blob/v0.3.10/.github/workflows/publish.yml +name: Build typeid-python wheels (riscv64) + +on: + workflow_dispatch: + inputs: + version: + description: 'typeid-python version to build (git tag without leading v, e.g. 0.3.10)' + required: true + default: '0.3.10' + pull_request: + paths: + - '.github/workflows/build-typeid-python.yml' + +concurrency: + group: ${{ github.workflow }}-${{ inputs.version || '0.3.10' }}-${{ 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 0.3.10 there. + TYPEID_PYTHON_VERSION: ${{ inputs.version || '0.3.10' }} + 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 typeid-python ${{ env.TYPEID_PYTHON_VERSION }} + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + with: + repository: akhundMurad/typeid-python + ref: v${{ env.TYPEID_PYTHON_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.5,<2.0' 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/typeid_python-(.+)\.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 typeid-python ${{ inputs.version || '0.3.10' }} ${{ matrix.python }}-manylinux_riscv64 + runs-on: ubuntu-24.04-riscv + timeout-minutes: 60 + strategy: + fail-fast: false + matrix: + # rust-base32 (typeid-python's pyo3 extension) declares no abi3 feature, + # so every interpreter needs its own build. Repo-standard riscv64 set. + 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 (gotcha 10). + CIBW_BUILD: ${{ matrix.python }}-manylinux_riscv64 + CIBW_MANYLINUX_RISCV64_IMAGE: ${{ env.MANYLINUX_RISCV64_IMAGE }} + # typeid-python ships no [tool.cibuildwheel], so install the Rust + # toolchain its maturin backend needs in-container and put it 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" + PIP_EXTRA_INDEX_URL=https://pypi.riseproject.dev/simple/ + # Mirror upstream's pytest suite (tests/); doc tests (make test-docs) + # and lint (make lint) are dev-only, not wheel tests. click/pydantic/ + # pyyaml/requests cover the cli/integrations/spec test modules. + CIBW_TEST_REQUIRES: pytest requests pyyaml click pydantic + CIBW_TEST_COMMAND: pytest -q {package}/tests + run: | + set -euo pipefail + mkdir typeid-python + tar zxf "${{ steps.fetch_sdist.outputs.download-path }}/${{ needs.python_sdist.outputs.sdist_artifact_name }}" \ + --strip-components=1 -C typeid-python + uv pip install --upgrade cibuildwheel + python -m cibuildwheel --output-dir wheelhouse ./typeid-python + + - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 + with: + name: typeid-python-${{ env.TYPEID_PYTHON_VERSION }}-${{ matrix.python }}-manylinux_riscv64 + path: ./wheelhouse/*.whl + if-no-files-found: error + + publish: + name: Publish typeid-python ${{ inputs.version || '0.3.10' }} + needs: [setup, build_wheels] + permissions: + contents: write + pull-requests: write + uses: $/.github/workflows/_publish-wheel.yml + with: + artifact-pattern: typeid-python-${{ inputs.version || '0.3.10' }}-*-manylinux_riscv64 From 6d18c412f43b0fd0473e881a8ebc5129b2e47fc5 Mon Sep 17 00:00:00 2001 From: Ludovic Henry Date: Mon, 7 Sep 2026 18:21:37 +0200 Subject: [PATCH 2/2] typeid-python: switch to build-from-checkout, fix missing tests/ [tool.maturin] include only lists LICENSE/README/typeid/rust-base32, so the maturin sdist genuinely ships no tests/ directory - CI failed with 'file or directory not found: /project/typeid-python/tests' on every interpreter. Build directly from the upstream git checkout instead (matches build-fastnanoid.yml's shape) so tests/ is present at cwd, and stage it into the wheel test via CIBW_TEST_SOURCES. --- .github/workflows/build-typeid-python.yml | 88 +++++------------------ 1 file changed, 18 insertions(+), 70 deletions(-) diff --git a/.github/workflows/build-typeid-python.yml b/.github/workflows/build-typeid-python.yml index b925f14c3..a7bfb14e0 100644 --- a/.github/workflows/build-typeid-python.yml +++ b/.github/workflows/build-typeid-python.yml @@ -31,50 +31,8 @@ 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 typeid-python ${{ env.TYPEID_PYTHON_VERSION }} - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - with: - repository: akhundMurad/typeid-python - ref: v${{ env.TYPEID_PYTHON_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.5,<2.0' 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/typeid_python-(.+)\.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] + needs: [setup] name: Build typeid-python ${{ inputs.version || '0.3.10' }} ${{ matrix.python }}-manylinux_riscv64 runs-on: ubuntu-24.04-riscv timeout-minutes: 60 @@ -86,25 +44,20 @@ jobs: python: ["cp312", "cp313", "cp314", "cp314t"] steps: - - name: Fetch sdist artifact - id: fetch_sdist - uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 + - name: Checkout typeid-python v${{ env.TYPEID_PYTHON_VERSION }} + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: - name: ${{ needs.python_sdist.outputs.sdist_artifact_name }} + repository: akhundMurad/typeid-python + ref: v${{ env.TYPEID_PYTHON_VERSION }} + persist-credentials: false - - name: Install uv - uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1 + - name: Build wheels + uses: pypa/cibuildwheel@1828c10ab37f080699c7b81cea34097c684a7074 # v4.2.0 with: - python-version: '3.12' - activate-environment: true - enable-cache: false - - - name: Build and test wheel + output-dir: wheelhouse/ + # musllinux is dropped: rustup.rs ships no riscv64 musl toolchain. + only: ${{ matrix.python }}-manylinux_riscv64 env: - CIBW_ARCHS: riscv64 - # Only manylinux: rustup.rs ships no riscv64 musl host toolchain, so - # musllinux can't build (gotcha 10). - CIBW_BUILD: ${{ matrix.python }}-manylinux_riscv64 CIBW_MANYLINUX_RISCV64_IMAGE: ${{ env.MANYLINUX_RISCV64_IMAGE }} # typeid-python ships no [tool.cibuildwheel], so install the Rust # toolchain its maturin backend needs in-container and put it on PATH. @@ -113,23 +66,18 @@ jobs: CIBW_ENVIRONMENT_LINUX: >- PATH="$PATH:$HOME/.cargo/bin" PIP_EXTRA_INDEX_URL=https://pypi.riseproject.dev/simple/ - # Mirror upstream's pytest suite (tests/); doc tests (make test-docs) - # and lint (make lint) are dev-only, not wheel tests. click/pydantic/ - # pyyaml/requests cover the cli/integrations/spec test modules. + # [tool.maturin] include (LICENSE/README/typeid/rust-base32) leaves + # tests/ out of the sdist, so stage it from the checkout (gotcha 104). + # Mirrors upstream's pytest suite; doc tests (make test-docs) and lint + # (make lint) are dev-only, not wheel tests. CIBW_TEST_REQUIRES: pytest requests pyyaml click pydantic - CIBW_TEST_COMMAND: pytest -q {package}/tests - run: | - set -euo pipefail - mkdir typeid-python - tar zxf "${{ steps.fetch_sdist.outputs.download-path }}/${{ needs.python_sdist.outputs.sdist_artifact_name }}" \ - --strip-components=1 -C typeid-python - uv pip install --upgrade cibuildwheel - python -m cibuildwheel --output-dir wheelhouse ./typeid-python + CIBW_TEST_SOURCES: tests + CIBW_TEST_COMMAND: python -m pytest -q tests - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: name: typeid-python-${{ env.TYPEID_PYTHON_VERSION }}-${{ matrix.python }}-manylinux_riscv64 - path: ./wheelhouse/*.whl + path: wheelhouse/*.whl if-no-files-found: error publish: