Skip to content
Merged
Show file tree
Hide file tree
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
121 changes: 121 additions & 0 deletions .github/workflows/build-aplr.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,121 @@
# SPDX-FileCopyrightText: 2026 The RISE Project
# SPDX-License-Identifier: MIT
---
# This workflow is based on: https://github.com/ottenbreit-data-science/aplr/blob/10.26.0/.github/workflows/build_wheels.yml
name: Build aplr wheels (riscv64)

on:
workflow_dispatch:
inputs:
version:
description: 'Version glob to (re)build; empty builds every version of docs/packages/aplr.yaml not released yet'
required: false
default: ''
pull_request:
branches: [main]
paths:
- '.github/workflows/build-aplr.yml'
- 'docs/packages/aplr.yaml'
push:
branches: [main]
paths:
- '.github/workflows/build-aplr.yml'
- 'docs/packages/aplr.yaml'

concurrency:
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
cancel-in-progress: true

permissions:
contents: read # to fetch code (actions/checkout)

env:
MANYLINUX_RISCV64_IMAGE: quay.io/pypa/manylinux_2_39_riscv64

jobs:
setup:
uses: $/.github/workflows/_setup.yml
with:
package: aplr
version: ${{ inputs.version }}

build_wheels:
needs: [setup]
if: needs.setup.outputs.versions != '[]'
name: Build aplr ${{ matrix.version }} ${{ matrix.python }}-manylinux_riscv64
runs-on: ubuntu-24.04-riscv
strategy:
fail-fast: false
matrix:
version: ${{ fromJSON(needs.setup.outputs.versions) }}
python: ["cp312", "cp313", "cp314", "cp314t"]
include:
# aplr imports pandas at module level; pypi.riseproject.dev has no cp314t pandas yet.
- python: "cp314t"
test_skip: "*"

env:
APLR_VERSION: ${{ matrix.version }}

steps:
- name: Checkout aplr ${{ env.APLR_VERSION }}
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
repository: ottenbreit-data-science/aplr
ref: ${{ env.APLR_VERSION }}
persist-credentials: false

# The vendored header-only Eigen is compiled into aplr_cpp, but upstream's wheel ships only its own LICENSE.
- name: Stage Eigen's licence
run: cp dependencies/eigen-3.4.0/COPYING.MPL2 COPYING.eigen

- uses: pypa/cibuildwheel@1828c10ab37f080699c7b81cea34097c684a7074 # v4.2.0
with:
output-dir: wheelhouse/
only: ${{ matrix.python }}-manylinux_riscv64
env:
CIBW_MANYLINUX_RISCV64_IMAGE: ${{ env.MANYLINUX_RISCV64_IMAGE }}
CIBW_ENVIRONMENT: >-
PIP_EXTRA_INDEX_URL=https://pypi.riseproject.dev/simple/
PIP_ONLY_BINARY=numpy,pandas,scipy,scikit-learn
CIBW_TEST_SKIP: ${{ matrix.test_skip }}
# Upstream's `pip install scikit-learn || true` would silently skip the sklearn tests.
CIBW_TEST_REQUIRES: pytest scikit-learn
CIBW_TEST_SOURCES: "tests"
CIBW_TEST_COMMAND: c++ -std=c++17 -O2 -pthread {project}/cpp/tests.cpp -o /tmp/aplr_cpp_tests && /tmp/aplr_cpp_tests && pytest {project}/tests/tests.py {project}/tests/test_sklearn_compatibility.py -q

- name: Check wheel contents
run: |
python3 - wheelhouse/*.whl <<'EOF'
import sys, zipfile
for path in sys.argv[1:]:
names = zipfile.ZipFile(path).namelist()
assert any(n.startswith("aplr_cpp.") and n.endswith(".so") for n in names), (path, names)
licences = {n.rsplit("/", 1)[-1] for n in names
if ".dist-info/licenses/" in n} - {""}
assert licences == {"LICENSE", "COPYING.eigen"}, (path, licences)
print(path, "ok")
EOF

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

publish:
name: Publish aplr ${{ matrix.version }}
needs: [setup, build_wheels]
if: needs.setup.outputs.versions != '[]'
strategy:
fail-fast: false
matrix:
version: ${{ fromJSON(needs.setup.outputs.versions) }}
permissions:
contents: write
pull-requests: write
uses: $/.github/workflows/_publish-wheel.yml
secrets:
app-private-key: ${{ secrets.RISEPROJECT_APP_PRIVATE_KEY }}
with:
artifact-pattern: aplr-${{ matrix.version }}-*-manylinux_riscv64
5 changes: 5 additions & 0 deletions docs/packages/aplr.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package-name: aplr
source-code: https://github.com/ottenbreit-data-science/aplr
license: MIT
versions:
- version: 10.26.0
Loading