-
-
Notifications
You must be signed in to change notification settings - Fork 2.3k
299 lines (290 loc) Β· 10.7 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
289
290
291
292
293
294
295
296
297
298
299
name: release
on:
workflow_call:
inputs:
release-command:
description: 'The command that will release packages as part of the final step'
required: true
type: string
type:
description: 'The type of release, usually corresponds to the dist-tag'
required: true
type: string
profile:
description: 'The profile to use when building the native binaries'
required: false
default: 'release'
type: string
secrets:
GHCR_TOKEN:
required: true
NPM_TOKEN:
required: true
permissions:
contents: read # for actions/checkout
jobs:
build-macos-windows:
strategy:
fail-fast: false
matrix:
include:
- name: aarch64-apple-darwin
os: macos-latest
target: aarch64-apple-darwin
- name: x86_64-apple-darwin
os: macos-latest
target: x86_64-apple-darwin
- name: windows-latest
os: windows-latest
name: ${{ matrix.name }}
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v4
- name: Install Rust
uses: dtolnay/rust-toolchain@master
with:
toolchain: stable
target: ${{ matrix.target }}
- uses: bahmutov/[email protected]
- uses: Swatinem/rust-cache@v2
if: ${{ inputs.type != 'latest' }}
with:
shared-key: ${{ matrix.name }}
- name: Remove CommandLineTools SDKs
if: ${{ matrix.target == 'aarch64-apple-darwin' }}
run: sudo rm -Rf /Library/Developer/CommandLineTools/SDKs/*;
- name: Build native packages
run: yarn build-native-${{ inputs.profile }}
env:
RUST_TARGET: ${{ matrix.target }}
- name: Extract debug symbols
if: ${{ runner.os == 'macOS' && inputs.profile == 'canary' }}
run: dsymutil packages/*/*/*.node
- name: Upload debug symbols
uses: actions/upload-artifact@v3
if: ${{ inputs.profile == 'canary' }}
with:
name: debug-symbols-${{ matrix.name }}
path: packages/*/*/*.node.dSYM/Contents/Resources/DWARF/*.node
- name: Strip debug symbols # https://github.com/rust-lang/rust/issues/46034
if: ${{ runner.os == 'macOS' }}
run: strip -x packages/*/*/*.node # Must use -x on macOS. This produces larger results on linux.
- name: Upload artifacts
uses: actions/upload-artifact@v3
with:
name: bindings-${{ matrix.name }}
path: packages/*/*/*.node
- name: Debug
if: ${{ runner.os == 'macOS' }}
run: ls -l packages/*/*/*.node
- name: Smoke test
if: ${{ !matrix.target }}
run: node -e "require('@parcel/rust')"
build-linux-gnu-x64:
name: linux-gnu-x64
runs-on: ubuntu-20.04
container:
image: node:22.4-bullseye
steps:
- uses: actions/checkout@v3
- name: Install Rust
uses: actions-rs/toolchain@v1
with:
toolchain: stable
profile: minimal
override: true
- uses: bahmutov/[email protected]
- name: Build native packages
run: yarn build-native-${{ inputs.profile }}
- name: Extract debug symbols
if: ${{ inputs.profile == 'canary' }}
run: |
find packages -name "*.node" -type f -exec objcopy --only-keep-debug --compress-debug-sections=zlib {} {}.debug \;
find packages -name "*.node" -type f -exec objcopy --strip-debug --strip-unneeded {} \;
find packages -name "*.node" -type f -exec objcopy --add-gnu-debuglink={}.debug {} \;
- name: Upload debug symbols
uses: actions/upload-artifact@v3
if: ${{ inputs.profile == 'canary' }}
with:
name: debug-symbols-linux-gnu-x64
path: packages/*/*/*.node.debug
- name: Strip debug symbols # https://github.com/rust-lang/rust/issues/46034
run: strip packages/*/*/*.node
- name: Upload artifacts
uses: actions/upload-artifact@v3
with:
name: bindings-linux-gnu-x64
path: packages/*/*/*.node
- name: debug
run: ls -l packages/*/*/*.node
- name: Smoke test
run: node -e 'require("@parcel/rust")'
build-linux-gnu-arm:
strategy:
fail-fast: false
matrix:
include:
- target: arm-unknown-linux-gnueabihf
arch: armhf
strip: arm-linux-gnueabihf-strip
objcopy: arm-linux-gnueabihf-objcopy
cflags: -mfpu=neon
- target: aarch64-unknown-linux-gnu
arch: arm64
strip: aarch64-linux-gnu-strip
objcopy: aarch64-linux-gnu-objcopy
cflags: ''
name: ${{ matrix.target }}
runs-on: ubuntu-20.04
steps:
- uses: actions/checkout@v4
- name: Install Rust
uses: dtolnay/rust-toolchain@master
with:
toolchain: stable
target: ${{ matrix.target }}
- name: Install cross compile toolchains
run: |
sudo apt-get update
sudo apt-get install gcc-arm-linux-gnueabihf gcc-aarch64-linux-gnu g++-aarch64-linux-gnu -y
- uses: bahmutov/[email protected]
- uses: Swatinem/rust-cache@v2
if: ${{ inputs.type != 'latest' }}
with:
shared-key: ${{ matrix.target }}
- name: Build native packages
run: yarn build-native-${{ inputs.profile }}
env:
RUST_TARGET: ${{ matrix.target }}
CFLAGS: ${{ matrix.cflags }}
- name: Extract debug symbols
if: ${{ inputs.profile == 'canary' }}
run: |
find packages -name "*.node" -type f -exec ${{ matrix.objcopy }} --only-keep-debug --compress-debug-sections=zlib {} {}.debug \;
find packages -name "*.node" -type f -exec ${{ matrix.objcopy }} --strip-debug --strip-unneeded {} \;
find packages -name "*.node" -type f -exec ${{ matrix.objcopy }} --add-gnu-debuglink={}.debug {} \;
- name: Upload debug symbols
uses: actions/upload-artifact@v3
if: ${{ inputs.profile == 'canary' }}
with:
name: debug-symbols-${{ matrix.target }}
path: packages/*/*/*.node.debug
- name: Strip debug symbols # https://github.com/rust-lang/rust/issues/46034
run: ${{ matrix.strip }} packages/*/*/*.node
- name: Upload artifacts
uses: actions/upload-artifact@v3
with:
name: bindings-${{ matrix.target }}
path: packages/*/*/*.node
- name: debug
run: ls -l packages/*/*/*.node
- name: Configure binfmt-support
run: docker run --rm --privileged multiarch/qemu-user-static:register --reset
- name: Smoke test
uses: addnab/docker-run-action@v1
with:
image: ghcr.io/devongovett/multiarch-node:node14-${{ matrix.arch }}-focal
options: -v ${{github.workspace}}:/work
run: cd /work && node -e "require('@parcel/rust')"
build-linux-musl:
strategy:
fail-fast: false
matrix:
include:
- target: x86_64-unknown-linux-musl
strip: strip
objcopy: objcopy
cflags: -msse4.2
arch: x86_64
- target: aarch64-unknown-linux-musl
strip: aarch64-linux-musl-strip
objcopy: aarch64-linux-musl-objcopy
cflags: ''
arch: aarch64
name: ${{ matrix.target }}
runs-on: ubuntu-20.04
container:
image: ghcr.io/napi-rs/napi-rs/nodejs-rust@sha256:5a99e45446355d25c20e95d35231d84e9ce472280d8c0b1be53281bade905f09
credentials:
username: ${{ github.actor }}
password: ${{ secrets.GHCR_TOKEN }}
steps:
- uses: actions/checkout@v4
- name: Install build tools
run: apk add --no-cache python3 make gcc g++ musl-dev curl openssl
- name: Install Rust
uses: dtolnay/rust-toolchain@master
with:
toolchain: stable
target: ${{ matrix.target }}
- uses: bahmutov/[email protected]
- name: Build native packages
run: yarn build-native-${{ inputs.profile }}
env:
RUST_TARGET: ${{ matrix.target }}
CFLAGS: ${{ matrix.cflags }}
- name: Extract debug symbols
if: ${{ inputs.profile == 'canary' }}
run: |
find packages -name "*.node" -type f -exec ${{ matrix.objcopy }} --only-keep-debug --compress-debug-sections=zlib {} {}.debug \;
find packages -name "*.node" -type f -exec ${{ matrix.objcopy }} --strip-debug --strip-unneeded {} \;
find packages -name "*.node" -type f -exec ${{ matrix.objcopy }} --add-gnu-debuglink={}.debug {} \;
- name: Upload debug symbols
uses: actions/upload-artifact@v3
if: ${{ inputs.profile == 'canary' }}
with:
name: debug-symbols-linux-musl-${{ matrix.arch }}
path: packages/*/*/*.node.debug
- name: Strip debug symbols # https://github.com/rust-lang/rust/issues/46034
run: ${{ matrix.strip }} packages/*/*/*.node
- name: Upload artifacts
uses: actions/upload-artifact@v3
with:
name: bindings-linux-musl-${{ matrix.arch }}
path: packages/*/*/*.node
- name: debug
run: ls -l packages/*/*/*.node
- name: Smoke test
if: ${{ matrix.target == 'x86_64-unknown-linux-musl' }}
run: node -e 'require("@parcel/rust")'
build-and-release:
runs-on: ubuntu-20.04
name: Build and release
needs:
- build-linux-gnu-arm
- build-linux-gnu-x64
- build-linux-musl
- build-macos-windows
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- uses: bahmutov/[email protected]
- name: Build native packages
run: yarn build-native-${{ inputs.profile }}
- name: Download artifacts
uses: actions/download-artifact@v3
with:
path: artifacts
- name: Move bindings
run: for d in artifacts/bindings-*/*/*; do cp $d/*.node packages/$(basename $(dirname $d))/$(basename $d); done
- name: Move debug symbols
if: ${{ inputs.profile == 'canary' }}
run: |
mkdir debug-symbols
find artifacts -name "*.debug" -exec cp {} debug-symbols/ \;
find artifacts -name "*.node" -path "**/DWARF/**" -exec cp {} debug-symbols/ \;
ls -l debug-symbols
- name: Upload combined debug symbols artifact
uses: actions/upload-artifact@v3
if: ${{ inputs.profile == 'canary' }}
with:
name: debug-symbols
path: debug-symbols/**
- name: Debug
run: |
ls -l packages/*/*/*.node
- run: echo //registry.npmjs.org/:_authToken=${NPM_TOKEN} > .npmrc
env:
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
- run: ${{ inputs.release-command }}