-
Notifications
You must be signed in to change notification settings - Fork 2
200 lines (191 loc) · 6.57 KB
/
Copy pathpublish-python.yml
File metadata and controls
200 lines (191 loc) · 6.57 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
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
# Build and publish the offbit-reflow Python SDK wheels.
#
# Triggers
# --------
# - Tag push matching `python-v*` (e.g. `python-v0.2.0`) → build every
# wheel triple, run tests, then upload to PyPI.
# - Manual `workflow_dispatch` → build + test only (no publish).
#
# Publishing auth
# ---------------
# Uses an API token stored as the `PYPI_API_TOKEN` secret. After the
# first publish lands, flip this to PyPI trusted publishing (OIDC) by
# setting the `pypi` environment + `id-token: write` permission below
# and removing the MATURIN_PYPI_TOKEN env.
name: publish-python
on:
push:
tags:
- 'python-v*'
workflow_dispatch:
permissions:
contents: read
jobs:
linux:
name: linux / ${{ matrix.platform.target }}
runs-on: ${{ matrix.platform.runner }}
strategy:
fail-fast: false
matrix:
platform:
- { runner: ubuntu-latest, target: x86_64 }
- { runner: ubuntu-latest, target: aarch64 }
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: '3.x'
- name: Build wheels
uses: PyO3/maturin-action@v1
with:
target: ${{ matrix.platform.target }}
# abi3-py39 yields one wheel per platform valid for Python >= 3.9.
args: --release --out dist
working-directory: sdk/python
sccache: 'true'
# Force manylinux_2_28 (gcc 12, glibc 2.28). The `auto` default
# picks manylinux2014 whose aarch64 cross-toolchain predates
# reliable <stdatomic.h> shipped from the cross-sysroot, which
# quickjs requires. 2_28 is supported by every pip on Python
# 3.9+ with a recent pip — good enough for our audience.
manylinux: '2_28'
env:
PYO3_USE_ABI3_FORWARD_COMPATIBILITY: '1'
# ring's pregenerated ARMv8 assembly requires __ARM_ARCH to
# be defined. The cross-gcc doesn't pre-define it when invoked
# through sccache, so we set it explicitly on the aarch64 leg.
# `-march=armv8-a` would do it alone but `-D` is belt-and-braces.
CFLAGS_aarch64_unknown_linux_gnu: '-march=armv8-a -D__ARM_ARCH=8'
- uses: actions/upload-artifact@v4
with:
name: wheels-linux-${{ matrix.platform.target }}
path: sdk/python/dist
macos:
name: macos / ${{ matrix.target }}
runs-on: macos-14
strategy:
fail-fast: false
matrix:
target: [x86_64, aarch64]
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: '3.x'
- name: Build wheels
uses: PyO3/maturin-action@v1
with:
target: ${{ matrix.target }}
# abi3-py39 yields one wheel per platform valid for Python >= 3.9.
args: --release --out dist
working-directory: sdk/python
sccache: 'true'
env:
PYO3_USE_ABI3_FORWARD_COMPATIBILITY: '1'
- uses: actions/upload-artifact@v4
with:
name: wheels-macos-${{ matrix.target }}
path: sdk/python/dist
windows:
name: windows / ${{ matrix.target }}
runs-on: windows-latest
strategy:
fail-fast: false
matrix:
target: [x64]
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: '3.x'
architecture: ${{ matrix.target }}
- name: Build wheels
uses: PyO3/maturin-action@v1
with:
target: ${{ matrix.target }}
# abi3-py39 yields one wheel per platform valid for Python >= 3.9.
args: --release --out dist
working-directory: sdk/python
sccache: 'true'
env:
PYO3_USE_ABI3_FORWARD_COMPATIBILITY: '1'
- uses: actions/upload-artifact@v4
with:
name: wheels-windows-${{ matrix.target }}
path: sdk/python/dist
sdist:
name: sdist
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Build sdist
uses: PyO3/maturin-action@v1
with:
command: sdist
args: --out dist
working-directory: sdk/python
- uses: actions/upload-artifact@v4
with:
name: wheels-sdist
path: sdk/python/dist
# Smoke-test the built wheel in a clean venv on the current runner so a
# broken wheel never reaches PyPI. Only tests the native wheel for each
# host's architecture — cross-built aarch64 wheels are validated only
# via `twine check`.
test:
name: test / ${{ matrix.os }}
needs: [linux, macos, windows]
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, macos-14, windows-latest]
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: '3.x'
- name: Download wheels
uses: actions/download-artifact@v4
with:
path: dist
merge-multiple: true
- name: Install wheel + run tests
shell: bash
run: |
python -m pip install --upgrade pip pytest
python -m pip install --find-links dist 'offbit-reflow'
# Run from a tmpdir so pytest resolves `offbit_reflow` from
# site-packages, not from the source directory (which only
# carries the Python shim, not `_native.so`).
cd "$RUNNER_TEMP"
python -m pytest -q "$GITHUB_WORKSPACE/sdk/python/tests"
publish:
name: publish to PyPI
runs-on: ubuntu-latest
needs: [linux, macos, windows, sdist, test]
if: startsWith(github.ref, 'refs/tags/python-v')
# Once PyPI trusted publishing is configured for this repo, remove
# the PYPI_API_TOKEN path and add:
# permissions: { id-token: write }
# environment: { name: pypi, url: https://pypi.org/p/offbit-reflow }
steps:
- uses: actions/download-artifact@v4
with:
path: dist
merge-multiple: true
- name: Verify metadata
run: |
# twine >= 6.1 understands PEP 639's SPDX `license-expression`
# field, which maturin emits from our `license = "MIT OR
# Apache-2.0"` pyproject entry. Older twine flags it as
# "unrecognized or malformed" and blocks the release.
python -m pip install --upgrade pip 'twine>=6.1'
python -m twine check dist/*
- name: Publish to PyPI
uses: PyO3/maturin-action@v1
env:
MATURIN_PYPI_TOKEN: ${{ secrets.PYPI_API_TOKEN }}
with:
command: upload
args: --non-interactive --skip-existing dist/*