Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
144 changes: 144 additions & 0 deletions .github/workflows/build-serpyco-rs.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,144 @@
# 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