Repository navigation
136 lines (122 loc) · 5.1 KB
/
Copy pathbuild-geventhttpclient.yml
File metadata and controls
136 lines (122 loc) · 5.1 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
# SPDX-FileCopyrightText: 2026 The RISE Project
# SPDX-License-Identifier: MIT
---
# Based on the `build-wheels` job of
# https://github.com/geventhttpclient/geventhttpclient/blob/2.3.9/.github/workflows/publish.yml
# and the tox `testenv` upstream runs in .github/workflows/test.yml.
name: Build geventhttpclient wheels (riscv64)
on:
workflow_dispatch:
inputs:
version:
description: 'Version glob to (re)build; empty builds every version of docs/packages/geventhttpclient.yaml not released yet'
required: false
default: ''
pull_request:
branches: [main]
paths:
- '.github/workflows/build-geventhttpclient.yml'
- 'docs/packages/geventhttpclient.yaml'
push:
branches: [main]
paths:
- '.github/workflows/build-geventhttpclient.yml'
- 'docs/packages/geventhttpclient.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
jobs:
setup:
uses: $/.github/workflows/_setup.yml
with:
package: geventhttpclient
version: ${{ inputs.version }}
build_wheels:
needs: [setup]
if: needs.setup.outputs.versions != '[]'
name: Build geventhttpclient ${{ matrix.version }} ${{ matrix.python }}-manylinux_riscv64
runs-on: ubuntu-24.04-riscv
timeout-minutes: 60
strategy:
fail-fast: false
matrix:
version: ${{ fromJSON(needs.setup.outputs.versions) }}
python: ["cp312", "cp313", "cp314", "cp314t"]
include:
# gevent, a hard runtime dependency, publishes no free-threaded wheel on
# any platform, so the cp314t wheel cannot be installed to be tested.
- python: "cp314t"
test_skip: "*"
env:
GEVENTHTTPCLIENT_VERSION: ${{ matrix.version }}
steps:
# The llhttp parser is a submodule; setup.py compiles its sources directly.
- name: Checkout geventhttpclient ${{ env.GEVENTHTTPCLIENT_VERSION }}
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
repository: geventhttpclient/geventhttpclient
ref: ${{ env.GEVENTHTTPCLIENT_VERSION }}
submodules: recursive
persist-credentials: false
- name: Checkout python-wheels
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
path: python-wheels
persist-credentials: false
# llhttp is compiled into the extension under its own MIT notice, which
# upstream's wheels do not ship.
- name: Patch geventhttpclient source
run: |
git apply python-wheels/patches/geventhttpclient/${{ env.GEVENTHTTPCLIENT_VERSION }}/00*.patch
# musllinux is skipped: our registry carries gevent and brotli for
# manylinux riscv64 only, so a musl wheel could be neither installed nor tested.
- uses: pypa/cibuildwheel@1828c10ab37f080699c7b81cea34097c684a7074 # v4.2.0
env:
CIBW_ARCHS: riscv64
CIBW_BUILD: ${{ matrix.python }}-manylinux_riscv64
CIBW_MANYLINUX_RISCV64_IMAGE: ${{ env.MANYLINUX_RISCV64_IMAGE }}
# gevent and brotli have no riscv64 wheel on public PyPI.
CIBW_ENVIRONMENT: PIP_EXTRA_INDEX_URL=https://pypi.riseproject.dev/simple/
CIBW_TEST_SKIP: ${{ matrix.test_skip }}
# pyproject.toml registers the `network` marker.
CIBW_TEST_SOURCES: tests pyproject.toml
CIBW_TEST_EXTRAS: dev
CIBW_TEST_COMMAND: >-
python -c "import importlib.metadata as m;
l = {str(p).split('.dist-info/licenses/')[1] for p in m.files('geventhttpclient') if '.dist-info/licenses/' in str(p)};
assert l == {'LICENSE-MIT', 'llhttp/LICENSE-MIT'}, l" &&
python -m pytest tests
# The only proof the untested cp314t wheel really carries the extension.
- name: Check the wheel ships the parser extension
run: |
python3 - wheelhouse/*.whl <<'EOF'
import sys, zipfile
names = zipfile.ZipFile(sys.argv[1]).namelist()
sos = [n for n in names if n.endswith(".so")]
assert len(sos) == 1 and sos[0].startswith("geventhttpclient/_parser."), sos
EOF
- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: geventhttpclient-${{ env.GEVENTHTTPCLIENT_VERSION }}-${{ matrix.python }}-manylinux_riscv64
path: ./wheelhouse/*.whl
if-no-files-found: error
publish:
name: Publish geventhttpclient ${{ 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: geventhttpclient-${{ matrix.version }}-*-manylinux_riscv64