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

on:
workflow_dispatch:
inputs:
version:
description: 'aioquic version to build (git tag, e.g. 1.3.0)'
required: true
default: '1.3.0'
pull_request:
paths:
- '.github/workflows/build-aioquic.yml'
- 'patches/aioquic/**'

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

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

env:
AIOQUIC_VERSION: ${{ inputs.version || '1.3.0' }}
MANYLINUX_RISCV64_IMAGE: quay.io/pypa/manylinux_2_39_riscv64

jobs:
setup:
uses: $/.github/workflows/_setup.yml

build_wheels:
needs: [setup]
name: Build aioquic ${{ inputs.version || '1.3.0' }} cp310-abi3-manylinux_riscv64
runs-on: ubuntu-24.04-riscv
timeout-minutes: 90

steps:
- name: Checkout aioquic ${{ env.AIOQUIC_VERSION }}
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
repository: aiortc/aioquic
ref: ${{ env.AIOQUIC_VERSION }}
persist-credentials: false

- name: Build wheels
uses: pypa/cibuildwheel@1828c10ab37f080699c7b81cea34097c684a7074 # v4.2.0
with:
output-dir: wheelhouse/
env:
CIBW_ARCHS: riscv64
# cp310 first: setup.py forces the cp310-abi3 tag regardless of the
# build interpreter (gotcha 96); the later entries build nothing,
# they only re-test the one wheel.
CIBW_BUILD: >-
cp310-manylinux_riscv64 cp311-manylinux_riscv64 cp312-manylinux_riscv64
cp313-manylinux_riscv64 cp314-manylinux_riscv64
CIBW_MANYLINUX_RISCV64_IMAGE: ${{ env.MANYLINUX_RISCV64_IMAGE }}
# _crypto links libcrypto; the riscv64 image ships only the runtime
# .so, not the headers. auditwheel then vendors libcrypto (Apache-2.0)
# into the wheel without a licence, so stage one.
CIBW_BEFORE_ALL_LINUX: >-
dnf -y install openssl-devel &&
cp /usr/share/licenses/openssl-libs/LICENSE.txt {project}/LICENSE.openssl
# cryptography has no riscv64 wheel on public PyPI; PIP_ONLY_BINARY
# stops pip from picking a newer PyPI-only sdist release (which
# fails: its Rust backend has no riscv64 rustup target) over the
# older riscv64 wheel our registry carries. pylsqpack (also no
# public riscv64 wheel) builds from sdist in seconds either way.
CIBW_TEST_ENVIRONMENT: >-
AIOQUIC_SKIP_TESTS=ipv6,loss
PIP_EXTRA_INDEX_URL=https://pypi.riseproject.dev/simple/
PIP_ONLY_BINARY=cryptography
# cryptography 50.0.0 dropped SHA1-for-RSA-signing support, which
# breaks test_tls.py's legacy-algorithm test regardless of arch;
# cap it at the last release the suite was written against
# (gotcha 97's shape).
CIBW_TEST_REQUIRES: cryptography<50
CIBW_TEST_COMMAND: python -m unittest discover -t {project} -s {project}/tests

- name: Check the wheel ships both extensions and both licences
run: |
python3 - wheelhouse/*.whl <<'EOF'
import sys, zipfile
for whl in sys.argv[1:]:
names = zipfile.ZipFile(whl).namelist()
for mod in ("_buffer", "_crypto"):
assert any(n.startswith(f"aioquic/{mod}.") and n.endswith(".so")
for n in names), (whl, mod)
licences = {n.rsplit("/", 1)[1]
for n in names if ".dist-info/licenses/" in n} - {""}
assert licences == {"LICENSE", "LICENSE.openssl"}, (whl, licences)
print(whl, "ok")
EOF

- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: aioquic-${{ env.AIOQUIC_VERSION }}-cp310-abi3-manylinux_riscv64
path: wheelhouse/*.whl
if-no-files-found: error

publish:
name: Publish aioquic ${{ inputs.version || '1.3.0' }}
needs: [setup, build_wheels]
permissions:
contents: write
pull-requests: write
uses: $/.github/workflows/_publish-wheel.yml
with:
artifact-pattern: aioquic-${{ inputs.version || '1.3.0' }}-*-manylinux_riscv64