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
106 changes: 106 additions & 0 deletions .github/workflows/build-pcodec.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
# SPDX-FileCopyrightText: 2026 The RISE Project
# SPDX-License-Identifier: MIT
---
# This workflow is based on the `linux` job of
# https://github.com/pcodec/pcodec/blob/Python_v1.0.3/.github/workflows/python_publish.yml
name: Build pcodec wheels (riscv64)

on:
workflow_dispatch:
inputs:
version:
description: 'pcodec version to build (git tag without leading Python_v, e.g. 1.0.3)'
required: true
default: '1.0.3'
pull_request:
paths:
- '.github/workflows/build-pcodec.yml'

concurrency:
group: ${{ github.workflow }}-${{ inputs.version || '1.0.3' }}-${{ 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.0.3 there.
PCODEC_VERSION: ${{ inputs.version || '1.0.3' }}
MANYLINUX_RISCV64_IMAGE: quay.io/pypa/manylinux_2_39_riscv64

jobs:
setup:
uses: $/.github/workflows/_setup.yml

build_wheels:
needs: [setup]
name: Build pcodec ${{ inputs.version || '1.0.3' }} ${{ matrix.python }}-manylinux_riscv64
runs-on: ubuntu-24.04-riscv
timeout-minutes: 60
strategy:
fail-fast: false
matrix:
# PyO3 extension built per-interpreter (upstream ships cp3x-cp3x wheels,
# no abi3).
python: ["cp312", "cp313", "cp314", "cp314t"]

steps:
# Checked out at the workspace root: pco_python is a member of pcodec's
# Cargo workspace and builds against its sibling pco/better_io crates.
- name: Checkout pcodec Python_v${{ env.PCODEC_VERSION }}
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
repository: pcodec/pcodec
ref: Python_v${{ env.PCODEC_VERSION }}
persist-credentials: false

- name: Stage the licence beside pco_python's pyproject.toml
# maturin globs LICEN[CS]E* relative to the pyproject directory, which
# in this monorepo is pco_python/ -- so upstream's published wheels
# carry no licence text at all, only the classifier.
run: cp LICENSE pco_python/LICENSE

- name: Build wheels
uses: pypa/cibuildwheel@1828c10ab37f080699c7b81cea34097c684a7074 # v4.2.0
with:
package-dir: pco_python
output-dir: wheelhouse/
# musllinux is dropped: rustup.rs ships no riscv64 musl toolchain.
only: ${{ matrix.python }}-manylinux_riscv64
env:
CIBW_MANYLINUX_RISCV64_IMAGE: ${{ env.MANYLINUX_RISCV64_IMAGE }}
# pco_python ships no [tool.cibuildwheel], so the Rust toolchain its
# maturin backend needs is installed in-container here.
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/
# numpy is a runtime dependency; public PyPI's newest release always
# outranks our registry's version and has no riscv64 wheel, so pin
# resolution to a binary to avoid a from-source numpy build.
CIBW_TEST_ENVIRONMENT_LINUX: PIP_ONLY_BINARY=numpy
CIBW_TEST_REQUIRES: pytest
# test-sources resolves against the checkout root, not package-dir.
# pco/assets holds the .pco fixture files test_standalone.py reads
# via a ../../pco/assets/*.pco relative path.
CIBW_TEST_SOURCES: pco_python/test pco_python/README.md pco/assets
CIBW_TEST_COMMAND: >-
python -c "import pcodec.pcodec as m; assert m.__file__.endswith('.so'), m.__file__"
&& cd pco_python && python -m pytest -v --doctest-glob=*.md test README.md

- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: pcodec-${{ env.PCODEC_VERSION }}-${{ matrix.python }}-manylinux_riscv64
path: wheelhouse/*.whl
if-no-files-found: error

publish:
name: Publish pcodec ${{ inputs.version || '1.0.3' }}
needs: [setup, build_wheels]
permissions:
contents: write
pull-requests: write
uses: $/.github/workflows/_publish-wheel.yml
with:
artifact-pattern: pcodec-${{ inputs.version || '1.0.3' }}-*-manylinux_riscv64