Skip to content
Draft
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
149 changes: 149 additions & 0 deletions .github/workflows/build-dataframely.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,149 @@
# SPDX-FileCopyrightText: 2026 The RISE Project
# SPDX-License-Identifier: MIT
---
# This workflow is based on: https://github.com/quantco/dataframely/blob/main/.github/workflows/build.yml
name: Build dataframely wheels (riscv64)

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

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

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

env:
PYTHON_VERSION: '3.10'
CARGO_INCREMENTAL: 0
CARGO_NET_RETRY: 10
RUSTUP_MAX_RETRIES: 10
# dataframely's Cargo.toml puts `lto = true` + `codegen-units = 1` directly
# on the `release` profile, and pulls in a full pola-rs fork as its crate
# graph (see build-polars-runtime.yml). Overridden down the same way for
# the same reason: the riscv64 runner cannot afford fat LTO on that graph.
CARGO_PROFILE_RELEASE_LTO: 'off'
CARGO_PROFILE_RELEASE_CODEGEN_UNITS: '16'
CARGO_PROFILE_RELEASE_OPT_LEVEL: '1'
CARGO_BUILD_JOBS: '2'

defaults:
run:
shell: bash

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

build_wheels:
needs: [setup]
if: needs.setup.outputs.versions != '[]'
name: Build dataframely ${{ matrix.version }} cp310-abi3-manylinux_riscv64
runs-on: ubuntu-24.04-riscv
timeout-minutes: 1440
strategy:
fail-fast: false
matrix:
version: ${{ fromJSON(needs.setup.outputs.versions) }}

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

steps:
- name: Checkout dataframely v${{ env.DATAFRAMELY_VERSION }}
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
repository: quantco/dataframely
ref: v${{ env.DATAFRAMELY_VERSION }}
persist-credentials: false

# Upstream's own build.yml runs `pixi run -e build set-version`, which
# is this same sed against a setuptools_scm-derived string; the target
# version is already known here, so it is substituted directly.
- name: Set version
run: sed -i "s/version = \"0.0.0\"/version = \"${DATAFRAMELY_VERSION}\"/" pyproject.toml

# Same OOM guard build-polars-runtime.yml needs on these runners for a
# comparably sized Rust build (a pinned pola-rs fork).
- name: Set swap space
uses: pierotofy/set-swap-space@fc79b3f67fa8a838184ce84a674ca12238d2c761 # master
with:
swap-size-gb: 10

- name: Build wheel
uses: PyO3/maturin-action@e83996d129638aa358a18fbd1dfb82f0b0fb5d3b # v1.51.0
with:
command: build
target: riscv64gc-unknown-linux-gnu
args: --out dist --release -i python3.10 --strip
manylinux: '2_39'
before-script-linux: git config --global --add safe.directory "*"

- name: Install Python
uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
with:
python-version: ${{ env.PYTHON_VERSION }}
activate-environment: true
enable-cache: false

- name: Test wheel
run: |
uv pip install --force-reinstall dist/*.whl
uv pip install --extra-index-url https://pypi.riseproject.dev/simple/ \
pytest pytest-benchmark pytest-mock numpy pandas

# cd out of the checkout first (gotcha 25/218): dataframely's pure-Python
# wrapper package lives directly at the checkout root ($GITHUB_WORKSPACE),
# and both `python -c` and `python -m pytest` prepend cwd to sys.path[0]
# unconditionally, so run from here they'd import that source tree --
# which has no compiled _native extension -- instead of the wheel just
# installed above.
cd /tmp
python -c 'import dataframely; print(dataframely.__version__)'
# pyarrow has no cp310 riscv64 wheel yet (registry starts at cp312); this abi3
# wheel is cp310+, so skip only the one test module that hard-imports pyarrow.
python -m pytest "${GITHUB_WORKSPACE}/tests" -c "${GITHUB_WORKSPACE}/pyproject.toml" \
-m "not with_optionals" --ignore="${GITHUB_WORKSPACE}/tests/columns/test_arrow_pycapsule.py"

- name: Upload wheel
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: dataframely-${{ env.DATAFRAMELY_VERSION }}-cp310-abi3-manylinux_riscv64
path: dist/*.whl
if-no-files-found: error

publish:
name: Publish dataframely ${{ 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: dataframely-${{ matrix.version }}-*-manylinux_riscv64
5 changes: 5 additions & 0 deletions docs/packages/dataframely.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package-name: dataframely
source-code: https://github.com/quantco/dataframely
license: BSD-3-Clause
versions:
- version: 3.0.0
Loading