Skip to content

tensor-grep: add build-tensor-grep.yml for riscv64 wheels #1

tensor-grep: add build-tensor-grep.yml for riscv64 wheels

tensor-grep: add build-tensor-grep.yml for riscv64 wheels #1

# SPDX-FileCopyrightText: 2026 The RISE Project
# SPDX-License-Identifier: MIT
---
# This workflow is based on the `build-wheels-pypi` job of
# https://github.com/oimiragieo/tensor-grep/blob/v1.118.0/.github/workflows/ci.yml
name: Build tensor-grep wheels (riscv64)
on:
workflow_dispatch:
inputs:
version:
description: 'tensor-grep version to build (git tag without the v prefix, e.g. 1.118.0)'
required: true
default: '1.118.0'
pull_request:
paths:
- '.github/workflows/build-tensor-grep.yml'
concurrency:
group: ${{ github.workflow }}-${{ inputs.version || '1.118.0' }}-${{ 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.118.0 there.
TENSOR_GREP_VERSION: ${{ inputs.version || '1.118.0' }}
jobs:
setup:
uses: $/.github/workflows/_setup.yml
build_wheel:
needs: [setup]
name: Build tensor-grep ${{ inputs.version || '1.118.0' }} cp311-abi3-manylinux_riscv64
runs-on: ubuntu-24.04-riscv
timeout-minutes: 240
steps:
- name: Checkout tensor-grep v${{ env.TENSOR_GREP_VERSION }}
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
repository: oimiragieo/tensor-grep
ref: v${{ env.TENSOR_GREP_VERSION }}
persist-credentials: false
# `[dependencies] pyo3` carries `abi3-py311` unconditionally in
# rust_core/Cargo.toml (gotcha 181), so this one build serves every
# GIL-ful interpreter >= 3.11; upstream itself ships no free-threaded
# wheel either (PyPI 1.118.0 has exactly one Linux wheel).
- name: Build wheel
uses: PyO3/maturin-action@e83996d129638aa358a18fbd1dfb82f0b0fb5d3b # v1.51.0
with:
command: build
target: riscv64gc-unknown-linux-gnu
args: --release --locked --out dist
manylinux: '2_39'
before-script-linux: git config --global --add safe.directory "*"
- name: Verify the wheel ships the compiled extension
run: |
set -euo pipefail
python3 - dist/*.whl <<'EOF'
import sys, zipfile
names = zipfile.ZipFile(sys.argv[1]).namelist()
sos = [n for n in names if n.endswith(".so")]
assert any(n.startswith("tensor_grep/rust_core") for n in sos), sos
print(sys.argv[1], "->", sos)
EOF
- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: tensor-grep-${{ env.TENSOR_GREP_VERSION }}-cp311-abi3-manylinux_riscv64
path: dist/*.whl
if-no-files-found: error
test_wheel:
name: Test tensor-grep ${{ inputs.version || '1.118.0' }} on Python ${{ matrix.python-version }}
needs: [setup, build_wheel]
runs-on: ubuntu-24.04-riscv
timeout-minutes: 30
env:
# Without this uv would reuse the runner image's system CPython for 3.12
# and download a standalone build for the others.
UV_PYTHON_PREFERENCE: only-managed
# cryptography is a required (non-optional) runtime dependency and has
# no wheel on public PyPI for riscv64.
UV_EXTRA_INDEX_URL: https://pypi.riseproject.dev/simple/
strategy:
fail-fast: false
matrix:
# No 3.14t: the wheel is cp311-abi3, and pyo3 disables abi3 under
# Py_GIL_DISABLED, so a free-threaded interpreter can't install it
# (upstream ships no free-threaded wheel either).
python-version: ['3.12', '3.13', '3.14']
steps:
- name: Download wheel
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
name: tensor-grep-${{ env.TENSOR_GREP_VERSION }}-cp311-abi3-manylinux_riscv64
- name: Install Python
uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
with:
python-version: ${{ matrix.python-version }}
activate-environment: true
enable-cache: false
- name: Install wheel
run: uv pip install --reinstall ./*.whl
# No wheel-level test suite ships in the sdist/checkout (tests/ import
# the checkout, not the installed wheel); mirror the README's own
# rg-compatible search example instead.
- name: Test wheel
run: |
set -euo pipefail
tg --version
tg --help >/dev/null
work=$(mktemp -d)
printf 'hello world\nsomething else\nhello again\n' > "$work/a.txt"
out=$(tg search hello "$work/a.txt")
grep -q 'hello world' <<<"$out"
grep -q 'hello again' <<<"$out"
tg search -i HELLO "$work/a.txt" | grep -q 'hello world'
! grep -q 'something else' <<<"$out"
publish:
name: Publish tensor-grep ${{ inputs.version || '1.118.0' }}
needs: [setup, build_wheel, test_wheel]
permissions:
contents: write
pull-requests: write
uses: $/.github/workflows/_publish-wheel.yml
with:
artifact-pattern: tensor-grep-${{ inputs.version || '1.118.0' }}-cp311-abi3-manylinux_riscv64