-
Notifications
You must be signed in to change notification settings - Fork 0
159 lines (142 loc) · 6.04 KB
/
Copy pathbuild-dataframely.yml
File metadata and controls
159 lines (142 loc) · 6.04 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
# 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
env:
# Registry for the riscv64 numpy/polars-runtime-32 wheels (otherwise
# uv source-builds them from PyPI's sdists for ~4h). unsafe-best-match
# because the registry hosts tomli for cp312+ only: under first-index
# uv never sees PyPI's pure tomli and backtracks to pytest 6.2.5,
# whose importlib mode breaks 9 upstream tests.
UV_EXTRA_INDEX_URL: https://pypi.riseproject.dev/simple/
UV_INDEX_STRATEGY: unsafe-best-match
UV_ONLY_BINARY: numpy
run: |
uv pip install --force-reinstall dist/*.whl pytest pytest-benchmark pytest-mock
# 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.
# scikit-learn likewise starts at cp312 on the registry; tests/benches hard-imports
# it in its own conftest.py, so skip that whole directory too.
python -m pytest "${GITHUB_WORKSPACE}/tests" -c "${GITHUB_WORKSPACE}/pyproject.toml" \
-m "not with_optionals" --ignore="${GITHUB_WORKSPACE}/tests/columns/test_arrow_pycapsule.py" \
--ignore="${GITHUB_WORKSPACE}/tests/benches"
- 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