Repository navigation
183 lines (167 loc) · 7.47 KB
/
Copy pathbuild-daft.yml
File metadata and controls
183 lines (167 loc) · 7.47 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
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
# SPDX-FileCopyrightText: 2026 The RISE Project
# SPDX-License-Identifier: MIT
---
# This workflow is based on the `build` job of
# https://github.com/Eventual-Inc/Daft/blob/v0.7.24/.github/workflows/build-wheel.yml
name: Build daft wheels (riscv64)
on:
workflow_dispatch:
inputs:
version:
description: 'Version glob to (re)build; empty builds every version of docs/packages/daft.yaml not released yet'
required: false
default: ''
pull_request:
branches: [main]
paths:
- '.github/workflows/build-daft.yml'
- 'docs/packages/daft.yaml'
push:
branches: [main]
paths:
- '.github/workflows/build-daft.yml'
- 'docs/packages/daft.yaml'
concurrency:
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
cancel-in-progress: true
permissions:
contents: read # to fetch code (actions/checkout)
env:
CARGO_INCREMENTAL: 0
CARGO_NET_RETRY: 10
RUSTUP_MAX_RETRIES: 10
# Limit parallel rustc invocations to avoid resource exhaustion on the
# riscv64 runner (build-lancedb.yml/build-polars-runtime.yml need the same).
CARGO_BUILD_JOBS: 2
jobs:
setup:
uses: $/.github/workflows/_setup.yml
with:
package: daft
version: ${{ inputs.version }}
build_wheels:
needs: [setup]
if: needs.setup.outputs.versions != '[]'
strategy:
fail-fast: false
matrix:
version: ${{ fromJSON(needs.setup.outputs.versions) }}
name: Build daft ${{ matrix.version }} cp310-abi3-manylinux_riscv64
runs-on: ubuntu-24.04-riscv
timeout-minutes: 1440
env:
DAFT_VERSION: ${{ matrix.version }}
steps:
- name: Checkout Daft v${{ env.DAFT_VERSION }}
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
repository: Eventual-Inc/Daft
ref: v${{ env.DAFT_VERSION }}
persist-credentials: false
# Upstream derives this from `setuptools_scm` and writes it into
# Cargo.toml before building (build-wheel.yml's "Patch package version"
# step) because their CI also builds untagged/nightly commits. We only
# ever build an exact release tag, so the version is already known; the
# workspace-wide placeholder is the only place it needs to land.
- name: Patch package version
run: |
awk -v ver="${DAFT_VERSION}" '
/^\[workspace\.package\]/ { in_block=1 }
/^\[/ && !/^\[workspace\.package\]/ { in_block=0 }
in_block && /^version = / { print "version = \"" ver "\""; next }
{ print }
' Cargo.toml > Cargo.toml.new
mv Cargo.toml.new Cargo.toml
grep -qx "version = \"${DAFT_VERSION}\"" Cargo.toml
- name: Free disk space
uses: jlumbroso/free-disk-space@54081f138730dfa15788a46383842cd2f914a1be # v1.3.1
# Same OOM guard build-lancedb.yml/build-deltalake.yml need on these
# runners for a comparably sized Rust workspace.
- name: Set swap space
uses: pierotofy/set-swap-space@fc79b3f67fa8a838184ce84a674ca12238d2c761 # master
with:
swap-size-gb: 16
- name: Build wheel
uses: PyO3/maturin-action@e83996d129638aa358a18fbd1dfb82f0b0fb5d3b # v1.51.0
with:
command: build
target: riscv64gc-unknown-linux-gnu
# pyo3 carries `abi3-py310` unconditionally in Cargo.toml, so
# upstream ships one cp310-abi3 wheel and no free-threaded variant;
# build on the floor interpreter the tag claims (gotcha 181).
# `rust-toolchain.toml` pins a nightly channel (daft-core and
# friends use unstable `#![feature(...)]`); maturin-action picks it
# up on its own, same as upstream's job does.
args: -i python3.10 --profile release --strip --out dist
manylinux: '2_39'
before-script-linux: |
git config --global --add safe.directory "*"
# The dashboard's `build.rs` requires Node/npm for release builds
# unless this is set, in which case it embeds an empty asset
# bundle instead; avoids needing a riscv64 Node toolchain for a
# bundled web dashboard nothing in the test suite exercises.
export CI=true
export DAFT_DASHBOARD_SKIP_BUILD=1
env:
DAFT_ANALYTICS_ENABLED: '0'
- name: Install Python
uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
with:
# cp312 is the floor our registry currently publishes riscv64
# numpy/pandas/pyarrow builds compatible with daft's own extras
# bounds for (the abi3 wheel under test installs fine on any
# interpreter >= the cp310 floor it claims).
python-version: '3.12'
activate-environment: true
enable-cache: false
# The system `pip` on this runner predates riscv64 manylinux tag
# support and rejects the wheel as "not a supported wheel on this
# platform"; uv's resolver knows the tag (same reason
# build-polars-runtime.yml's "Test wheel" step uses uv too).
# Upstream's test-wheels job also runs this suite under `DAFT_RUNNER=ray`;
# that pass is dropped here because the only riscv64 ray build published
# anywhere is 2.58.0 (cp312/cp313/cp314 only), which exceeds the
# `ray[data, client]<2.58.0,>=2.11.0` upper bound daft's own `ray`
# extra declares, so there is no ray build daft supports to test with.
- name: Test wheel
run: |
uv pip install pytest pandas==2.3.3 pytz numpy==2.3.4 pyarrow==25.0.1 dist/*.whl --force-reinstall
# `daft/` at the checkout root would otherwise shadow the installed
# wheel (same reason upstream's own test-wheels job removes it).
rm -rf daft
DAFT_ANALYTICS_ENABLED=0 DAFT_RUNNER=native python -m pytest tests/dataframe --durations=50
env:
# `uv pip install` (unlike cibuildwheel's pip-based test step) only
# honors its own UV_* env vars, not PIP_*; the PIP_-prefixed forms
# silently no-op, so uv skipped our registry, resolved pyarrow only
# against PyPI (no riscv64 wheel there) and source-built it, which
# needs the real Arrow C++ CMake package the manylinux image
# doesn't have (gotcha 244). `unsafe-best-match` is needed on top
# of the extra index because uv's default "first-index" strategy
# stops at the first index that lists the package name at all,
# never reaching our registry's riscv64 build (build-matplotlib.yml
# uses the same pair for the same reason).
UV_EXTRA_INDEX_URL: https://pypi.riseproject.dev/simple/
UV_INDEX_STRATEGY: unsafe-best-match
UV_ONLY_BINARY: numpy,pandas,pyarrow
- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: daft-${{ env.DAFT_VERSION }}-cp310-abi3-manylinux_riscv64
path: dist/*.whl
if-no-files-found: error
publish:
name: Publish daft ${{ 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: daft-${{ matrix.version }}-*-manylinux_riscv64