Skip to content
Open
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
136 changes: 136 additions & 0 deletions .github/workflows/build-wreq.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,136 @@
# SPDX-FileCopyrightText: 2026 The RISE Project
# SPDX-License-Identifier: MIT
---
# This workflow is based on the `manylinux` and `tests` jobs of
# https://github.com/0x676e67/wreq-python/blob/v0.12.1/.github/workflows/ci.yml
name: Build wreq wheels (riscv64)

on:
workflow_dispatch:
inputs:
version:
description: 'Version glob to (re)build; empty builds every version of docs/packages/wreq.yaml not released yet'
required: false
default: ''
pull_request:
branches: [main]
paths:
- '.github/workflows/build-wreq.yml'
- 'docs/packages/wreq.yaml'
push:
branches: [main]
paths:
- '.github/workflows/build-wreq.yml'
- 'docs/packages/wreq.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
# wreq-python gitignores Cargo.lock and requires `wreq = "6.0.0-rc"`, so a fresh
# resolve floats to the newest rc; pin the one the 0.12.1 release sdist locks.
WREQ_CRATE_VERSION: '6.0.0-rc.29'

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

build_wheels:
needs: [setup]
if: needs.setup.outputs.versions != '[]'
name: Build wreq ${{ matrix.version }} ${{ matrix.tag }}-manylinux_riscv64
runs-on: ubuntu-24.04-riscv
timeout-minutes: 360
strategy:
fail-fast: false
matrix:
version: ${{ fromJSON(needs.setup.outputs.versions) }}
# `tag` has to be a real axis: two `include` entries that only add new
# keys would both extend the one `version` combination, and the second
# would overwrite the first instead of creating a second leg.
tag: [cp311-abi3, cp314t]
include:
- tag: cp311-abi3
build: >-
cp312-manylinux_riscv64 cp313-manylinux_riscv64
cp314-manylinux_riscv64
- tag: cp314t
build: cp314t-manylinux_riscv64

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

steps:
- name: Checkout wreq-python v${{ env.WREQ_VERSION }}
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
repository: 0x676e67/wreq-python
ref: v${{ env.WREQ_VERSION }}
persist-credentials: false

- name: Build wheels
uses: pypa/cibuildwheel@1828c10ab37f080699c7b81cea34097c684a7074 # v4.2.0
with:
output-dir: wheelhouse/
env:
# musllinux is dropped: rustup.rs ships no riscv64 musl toolchain.
CIBW_BUILD: ${{ matrix.build }}
CIBW_MANYLINUX_RISCV64_IMAGE: ${{ env.MANYLINUX_RISCV64_IMAGE }}
# btls-sys runs bindgen (libclang) and `git apply`s its BoringSSL patches.
CIBW_BEFORE_ALL_LINUX: >-
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y &&
dnf install -y clang-devel git
CIBW_BEFORE_BUILD_LINUX: >-
cargo generate-lockfile &&
cargo update -p wreq --precise ${{ env.WREQ_CRATE_VERSION }}
CIBW_ENVIRONMENT_LINUX: >-
PATH="$PATH:$HOME/.cargo/bin"
PIP_EXTRA_INDEX_URL=https://pypi.riseproject.dev/simple/
MATURIN_PEP517_ARGS="--features jemalloc"
CARGO_BUILD_JOBS=2
# Upstream's tests job serves httpbin on localhost:8080 from the kennethreitz/httpbin
# container, i.e. under gunicorn: httpbin answers every chunked (streamed-body)
# request with a 501 unless SERVER_SOFTWARE is gunicorn, so the Werkzeug dev
# server behind `python -m httpbin.core` fails the body-stream tests.
CIBW_TEST_REQUIRES: pytest pytest-asyncio pytest-rerunfailures httpbin gunicorn
# The body-stream and multipart tests open these by a repo-root-relative path.
CIBW_TEST_SOURCES: tests README.md Cargo.toml LICENSE
CIBW_TEST_COMMAND: >-
python -m gunicorn -b 127.0.0.1:8080 -k gthread --threads 8 httpbin:app > httpbin.log 2>&1 & HTTPBIN_PID=$!;
python -c "import wreq.wreq as m; assert m.__file__.endswith('.so'), m.__file__" &&
for i in $(seq 60); do
python -c "import urllib.request; urllib.request.urlopen('http://127.0.0.1:8080/get', timeout=2)" 2>/dev/null && break;
sleep 1; done &&
python -m pytest -v tests; rc=$?;
kill $HTTPBIN_PID; [ $rc = 0 ] || tail -n 50 httpbin.log; exit $rc

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

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