-
Notifications
You must be signed in to change notification settings - Fork 3
288 lines (274 loc) · 10.1 KB
/
release.yml
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
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
name: Release
on:
push:
tags:
- 'v[0-9]+*'
workflow_dispatch:
env:
GH_TOKEN: ${{ github.token }}
jobs:
# create a release on github
create-release:
runs-on: ubuntu-latest
if: "startsWith(github.ref, 'refs/tags/')"
steps:
- uses: actions/checkout@v4
- name: Create new release
run: |
# remove leading 'v' in tag name
gh release create -d v${GITHUB_REF_NAME#v}
capi-macos:
runs-on: macos-latest
strategy:
matrix:
target: [x86_64-apple-darwin, aarch64-apple-darwin]
steps:
- uses: actions/checkout@v4
- name: Compile library
run: |
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --target=${{ matrix.target }}
cargo install cargo-c
cd pineappl_capi
cargo cinstall --verbose --destdir=prefix --library-type=cdylib --prefix=/ --target=${{ matrix.target }}
cd prefix
tar czf ../../pineappl_capi-${{ matrix.target }}.tar.gz .
- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: pineappl_capi-${{ matrix.target }}
path: pineappl_capi-${{ matrix.target }}.tar.gz
capi-linux:
runs-on: ubuntu-latest
container: ghcr.io/nnpdf/pineappl-ci:latest
strategy:
matrix:
target: [x86_64-unknown-linux-gnu]
steps:
# checkout@v4 uses a newer version of Node that's incompatible with our container's GLIBC
- uses: actions/checkout@v3
- name: Compile library
run: |
cd pineappl_capi
cargo cinstall --verbose --destdir=prefix --library-type=cdylib --prefix=/ --target=${{ matrix.target }}
cd prefix
tar czf ../../pineappl_capi-${{ matrix.target }}.tar.gz .
# print the glibc version requirement
objdump -T lib/libpineappl_capi.so | grep GLIBC | sed 's/.*GLIBC_\([.0-9]*\).*/\1/g' | sort -Vu | tail -1
- name: Upload artifact
# upload-artifact@v4 uses a newer version of Node that's incompatible with our container's GLIBC
uses: actions/upload-artifact@v3
with:
name: pineappl_capi-${{ matrix.target }}
path: pineappl_capi-${{ matrix.target }}.tar.gz
# publish a release on github and upload pre-built CAPI
publish-release:
needs: [capi-macos, capi-linux]
runs-on: ubuntu-latest
if: "startsWith(github.ref, 'refs/tags/')"
steps:
- uses: actions/checkout@v4
- uses: actions/download-artifact@v4
with:
path: artifacts
- name: Create new release
run: |
# remove leading 'v' in tag name
version=${GITHUB_REF_NAME#v}
prerelease=$(echo ${version} | perl -pe 's/^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$/\4/')
if [[ ${prerelease} == "" ]]; then
# extract the previous version number
old_version=$(sed -n 's/^## \[\(.*\)\] - .*/\1/p' CHANGELOG.md | tail +2 | head -n 1)
# extract news for the current version from the changelog file, dismissing
# empty lines at the start and the end
news=$(sed -n "/\\[${version}\\]/, /\\[${old_version}\\]/{ /\\[${old_version}\\]/! p }" \
CHANGELOG.md | sed -e :a -e '/./,$!d;/^\n*$/{$d;N;};/\n$/ba')
gh release edit v${version} -n "${news}"
else
gh release edit v${version} -n "" --prerelease
fi
find artifacts -name 'pineappl_capi*' -type f -exec gh release upload v${version} {} +
gh release edit v${version} --draft=false
publish-crates:
runs-on: ubuntu-latest
if: "startsWith(github.ref, 'refs/tags/')"
container: ghcr.io/nnpdf/pineappl-ci:latest
steps:
# checkout@v4 uses a newer version of Node that's incompatible with our container's GLIBC
- uses: actions/checkout@v3
- name: Publish all crates
env:
CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }}
run: |
# this must be at least Rust 1.66 to support waiting for dependencies to on crates.io:
# https://github.com/rust-lang/cargo/blob/master/CHANGELOG.md#cargo-166-2022-12-15
rustup default stable
cd pineappl
cargo publish
cd ../pineappl_applgrid
cargo publish
cd ../pineappl_fastnlo
cargo publish
cd ../pineappl_capi
cargo publish
cd ../pineappl_cli
cargo publish
wheels-linux:
runs-on: ubuntu-latest
strategy:
matrix:
target: [x86_64]
steps:
- uses: actions/checkout@v4
# for Linux the wheels are built in a container, so we don't need the `setup-python` action
- name: Build wheels
uses: PyO3/maturin-action@v1
with:
target: ${{ matrix.target }}
# `--find-interpreter` is needed to generate wheels for *all* Python versions
args: --release --out dist --find-interpreter --manifest-path pineappl_py/Cargo.toml
sccache: 'true'
manylinux: auto
- name: Upload wheels
uses: actions/upload-artifact@v4
with:
name: ${{ github.job }}-${{ matrix.target }}
path: dist
wheels-eol-linux:
runs-on: ubuntu-latest
strategy:
matrix:
target: [x86_64]
steps:
- uses: actions/checkout@v4
- name: Patch Cargo.toml
run: |
# - older maturin versions don't support metadata inheritance - overwrite it explicitly
# - use '@' separator since 'repository' contains slashes
# - downgrade both `numpy` and `pyo3` to the last version that support Python 3.6
sed -i \
-e "s@categories.workspace = true@$(grep '^categories' Cargo.toml)@" \
-e "s@edition.workspace = true@$(grep '^edition' Cargo.toml)@" \
-e "s@keywords.workspace = true@$(grep '^keywords' Cargo.toml)@" \
-e "s@license.workspace = true@$(grep '^license' Cargo.toml)@" \
-e "s@repository.workspace = true@$(grep '^repository' Cargo.toml)@" \
-e "s@rust-version.workspace = true@$(grep '^rust-version' Cargo.toml)@" \
-e "s@version.workspace = true@$(grep '^version' Cargo.toml)@" \
-e "s@^numpy = .*@numpy = \"0.14.1\"@" \
-e "s@^pyo3 = .*@pyo3 = { features = [\"extension-module\"], version = \"0.14.5\" }@" \
pineappl_py/Cargo.toml
# the previous command is very fragile, so print the file contents to check it
cat pineappl_py/Cargo.toml
- name: Build wheels
uses: PyO3/maturin-action@v1
with:
target: ${{ matrix.target }}
args: --release -i python3.6 --out dist --no-sdist --manifest-path pineappl_py/Cargo.toml
sccache: 'true'
manylinux: auto
# this is the latest version to support Python 3.6
maturin-version: 0.12.20
- name: Upload wheels
uses: actions/upload-artifact@v4
with:
name: ${{ github.job }}-${{ matrix.target }}
path: dist
wheels-macos:
runs-on: macos-latest
strategy:
matrix:
target: [aarch64, x86_64]
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
# WARNING: be careful with the ordering - the last version is the default one. Apparently
# maturin doesn't find all Python versions when one chooses a PyPy version instead of
# CPython as default
python-version: |
pypy3.7
pypy3.8
pypy3.9
pypy3.10
3.7
3.8
3.9
3.11
3.12
3.10
- name: Build wheels
uses: PyO3/maturin-action@v1
with:
target: ${{ matrix.target }}
args: --release --out dist --find-interpreter --manifest-path pineappl_py/Cargo.toml
sccache: 'true'
- name: Upload wheels
uses: actions/upload-artifact@v4
with:
name: ${{ github.job }}-${{ matrix.target }}
path: dist
wheels-sdist:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Build sdist
uses: PyO3/maturin-action@v1
with:
command: sdist
args: --out dist --manifest-path pineappl_py/Cargo.toml
- name: Upload sdist
uses: actions/upload-artifact@v4
with:
name: ${{ github.job }}
path: dist
wheels-windows:
runs-on: windows-latest
strategy:
matrix:
target: [x64]
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
# WARNING: be careful with the ordering - the last version is the default one. Apparently
# maturin doesn't find all Python versions when one chooses a PyPy version instead of
# CPython as default
python-version: |
pypy3.7
pypy3.8
pypy3.9
pypy3.10
3.7
3.8
3.9
3.11
3.12
3.10
architecture: ${{ matrix.target }}
- name: Build wheels
uses: PyO3/maturin-action@v1
with:
target: ${{ matrix.target }}
args: --release --out dist --find-interpreter --manifest-path pineappl_py/Cargo.toml
sccache: 'true'
- name: Upload wheels
uses: actions/upload-artifact@v4
with:
name: ${{ github.job }}-${{ matrix.target }}
path: dist
release-wheels:
name: Release
runs-on: ubuntu-latest
if: "startsWith(github.ref, 'refs/tags/')"
needs: [wheels-eol-linux, wheels-linux, wheels-macos, wheels-sdist, wheels-windows]
steps:
- uses: actions/download-artifact@v4
with:
pattern: wheels-*
merge-multiple: true
- name: Publish to PyPI
uses: PyO3/maturin-action@v1
env:
MATURIN_PYPI_TOKEN: ${{ secrets.PYPI_TOKEN }}
with:
command: upload
args: --skip-existing *