CI.yml 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510
  1. name: CI
  2. env:
  3. DEBUG: napi:*
  4. APP_NAME: package-template
  5. MACOSX_DEPLOYMENT_TARGET: '10.13'
  6. 'on':
  7. push:
  8. branches:
  9. - main
  10. tags-ignore:
  11. - '**'
  12. paths-ignore:
  13. - '**/*.md'
  14. - LICENSE
  15. - '**/*.gitignore'
  16. - .editorconfig
  17. - docs/**
  18. pull_request: null
  19. jobs:
  20. build:
  21. if: "!contains(github.event.head_commit.message, 'skip ci')"
  22. strategy:
  23. fail-fast: false
  24. matrix:
  25. settings:
  26. - host: macos-latest
  27. target: x86_64-apple-darwin
  28. build: |
  29. yarn build
  30. strip -x *.node
  31. - host: windows-latest
  32. build: yarn build
  33. target: x86_64-pc-windows-msvc
  34. - host: windows-latest
  35. build: |
  36. yarn build --target i686-pc-windows-msvc
  37. yarn test
  38. target: i686-pc-windows-msvc
  39. - host: ubuntu-latest
  40. target: x86_64-unknown-linux-gnu
  41. docker: ghcr.io/napi-rs/napi-rs/nodejs-rust:lts-debian
  42. build: |-
  43. set -e &&
  44. yarn build --target x86_64-unknown-linux-gnu &&
  45. strip *.node
  46. - host: ubuntu-latest
  47. target: x86_64-unknown-linux-musl
  48. docker: ghcr.io/napi-rs/napi-rs/nodejs-rust:lts-alpine
  49. build: set -e && yarn build && strip *.node
  50. - host: macos-latest
  51. target: aarch64-apple-darwin
  52. build: |
  53. sudo rm -Rf /Library/Developer/CommandLineTools/SDKs/*;
  54. export CC=$(xcrun -f clang);
  55. export CXX=$(xcrun -f clang++);
  56. SYSROOT=$(xcrun --sdk macosx --show-sdk-path);
  57. export CFLAGS="-isysroot $SYSROOT -isystem $SYSROOT";
  58. yarn build --target aarch64-apple-darwin
  59. strip -x *.node
  60. - host: ubuntu-latest
  61. target: aarch64-unknown-linux-gnu
  62. docker: ghcr.io/napi-rs/napi-rs/nodejs-rust:lts-debian-aarch64
  63. build: |-
  64. set -e &&
  65. yarn build --target aarch64-unknown-linux-gnu &&
  66. aarch64-unknown-linux-gnu-strip *.node
  67. - host: ubuntu-latest
  68. target: armv7-unknown-linux-gnueabihf
  69. setup: |
  70. sudo apt-get update
  71. sudo apt-get install gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf -y
  72. build: |
  73. yarn build --target=armv7-unknown-linux-gnueabihf
  74. arm-linux-gnueabihf-strip *.node
  75. - host: ubuntu-latest
  76. target: aarch64-linux-android
  77. build: |
  78. export CARGO_TARGET_AARCH64_LINUX_ANDROID_LINKER="${ANDROID_NDK_HOME}/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android24-clang"
  79. export CC="${ANDROID_NDK_HOME}/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android24-clang"
  80. export CXX="${ANDROID_NDK_HOME}/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android24-clang++"
  81. export PATH="${ANDROID_NDK_HOME}/toolchains/llvm/prebuilt/linux-x86_64/bin:${PATH}"
  82. yarn build --target aarch64-linux-android
  83. ${ANDROID_NDK_HOME}/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-strip *.node
  84. - host: ubuntu-latest
  85. target: armv7-linux-androideabi
  86. build: |
  87. export CARGO_TARGET_ARMV7_LINUX_ANDROIDEABI_LINKER="${ANDROID_NDK_HOME}/toolchains/llvm/prebuilt/linux-x86_64/bin/armv7a-linux-androideabi24-clang"
  88. export CC="${ANDROID_NDK_HOME}/toolchains/llvm/prebuilt/linux-x86_64/bin/armv7a-linux-androideabi24-clang"
  89. export CXX="${ANDROID_NDK_HOME}/toolchains/llvm/prebuilt/linux-x86_64/bin/armv7a-linux-androideabi24-clang++"
  90. export PATH="${ANDROID_NDK_HOME}/toolchains/llvm/prebuilt/linux-x86_64/bin:${PATH}"
  91. yarn build --target armv7-linux-androideabi
  92. ${ANDROID_NDK_HOME}/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-strip *.node
  93. - host: ubuntu-latest
  94. target: aarch64-unknown-linux-musl
  95. docker: ghcr.io/napi-rs/napi-rs/nodejs-rust:lts-alpine
  96. build: |-
  97. set -e &&
  98. rustup target add aarch64-unknown-linux-musl &&
  99. yarn build --target aarch64-unknown-linux-musl &&
  100. /aarch64-linux-musl-cross/bin/aarch64-linux-musl-strip *.node
  101. - host: windows-latest
  102. target: aarch64-pc-windows-msvc
  103. build: yarn build --target aarch64-pc-windows-msvc
  104. name: stable - ${{ matrix.settings.target }} - node@16
  105. runs-on: ${{ matrix.settings.host }}
  106. steps:
  107. - uses: actions/checkout@v3
  108. - name: Setup node
  109. uses: actions/setup-node@v3
  110. if: ${{ !matrix.settings.docker }}
  111. with:
  112. node-version: 16
  113. check-latest: true
  114. cache: yarn
  115. - name: Install
  116. uses: actions-rs/toolchain@v1
  117. if: ${{ !matrix.settings.docker }}
  118. with:
  119. profile: minimal
  120. override: true
  121. toolchain: stable
  122. target: ${{ matrix.settings.target }}
  123. - name: Cache cargo
  124. uses: actions/cache@v3
  125. with:
  126. path: |
  127. ~/.cargo/registry/index/
  128. ~/.cargo/registry/cache/
  129. ~/.cargo/git/db/
  130. .cargo-cache/registry/index/
  131. .cargo-cache/registry/cache/
  132. .cargo-cache/git/db/
  133. target/
  134. key: ${{ matrix.settings.target }}-cargo-registry
  135. - name: Cache NPM dependencies
  136. uses: actions/cache@v3
  137. with:
  138. path: .yarn/cache
  139. key: npm-cache-build-${{ matrix.settings.target }}-node@16
  140. - name: Setup toolchain
  141. run: ${{ matrix.settings.setup }}
  142. if: ${{ matrix.settings.setup }}
  143. shell: bash
  144. - name: Setup node x86
  145. if: matrix.settings.target == 'i686-pc-windows-msvc'
  146. run: yarn config set supportedArchitectures.cpu "ia32"
  147. shell: bash
  148. - name: Install dependencies
  149. run: yarn install
  150. - name: Setup node x86
  151. uses: actions/setup-node@v3
  152. if: matrix.settings.target == 'i686-pc-windows-msvc'
  153. with:
  154. node-version: 16
  155. check-latest: true
  156. cache: yarn
  157. architecture: x86
  158. - name: Build in docker
  159. uses: addnab/docker-run-action@v3
  160. if: ${{ matrix.settings.docker }}
  161. with:
  162. image: ${{ matrix.settings.docker }}
  163. options: --user 0:0 -v ${{ github.workspace }}/.cargo-cache/git/db:/root/.cargo/git/db -v ${{ github.workspace }}/.cargo/registry/cache:/root/.cargo/registry/cache -v ${{ github.workspace }}/.cargo/registry/index:/root/.cargo/registry/index -v ${{ github.workspace }}:/build -w /build
  164. run: ${{ matrix.settings.build }}
  165. - name: Build
  166. run: ${{ matrix.settings.build }}
  167. if: ${{ !matrix.settings.docker }}
  168. shell: bash
  169. - name: Upload artifact
  170. uses: actions/upload-artifact@v3
  171. with:
  172. name: bindings-${{ matrix.settings.target }}
  173. path: ${{ env.APP_NAME }}.*.node
  174. if-no-files-found: error
  175. build-freebsd:
  176. runs-on: macos-10.15
  177. name: Build FreeBSD
  178. steps:
  179. - uses: actions/checkout@v3
  180. - name: Build
  181. id: build
  182. uses: vmactions/freebsd-vm@v0.1.6
  183. env:
  184. DEBUG: napi:*
  185. RUSTUP_HOME: /usr/local/rustup
  186. CARGO_HOME: /usr/local/cargo
  187. RUSTUP_IO_THREADS: 1
  188. with:
  189. envs: DEBUG RUSTUP_HOME CARGO_HOME RUSTUP_IO_THREADS
  190. usesh: true
  191. mem: 3000
  192. prepare: |
  193. pkg install -y curl node14 python2
  194. curl -qL https://www.npmjs.com/install.sh | sh
  195. npm install -g yarn
  196. curl https://sh.rustup.rs -sSf --output rustup.sh
  197. sh rustup.sh -y --profile minimal --default-toolchain stable
  198. export PATH="/usr/local/cargo/bin:$PATH"
  199. echo "~~~~ rustc --version ~~~~"
  200. rustc --version
  201. echo "~~~~ node -v ~~~~"
  202. node -v
  203. echo "~~~~ yarn --version ~~~~"
  204. yarn --version
  205. run: |
  206. export PATH="/usr/local/cargo/bin:$PATH"
  207. pwd
  208. ls -lah
  209. whoami
  210. env
  211. freebsd-version
  212. yarn install
  213. yarn build
  214. strip -x *.node
  215. yarn test
  216. rm -rf node_modules
  217. rm -rf target
  218. - name: Upload artifact
  219. uses: actions/upload-artifact@v3
  220. with:
  221. name: bindings-freebsd
  222. path: ${{ env.APP_NAME }}.*.node
  223. if-no-files-found: error
  224. test-macOS-windows-binding:
  225. name: Test bindings on ${{ matrix.settings.target }} - node@${{ matrix.node }}
  226. needs:
  227. - build
  228. strategy:
  229. fail-fast: false
  230. matrix:
  231. settings:
  232. - host: windows-latest
  233. target: x86_64-pc-windows-msvc
  234. node:
  235. - '14'
  236. - '16'
  237. - '18'
  238. runs-on: ${{ matrix.settings.host }}
  239. steps:
  240. - uses: actions/checkout@v3
  241. - name: Setup node
  242. uses: actions/setup-node@v3
  243. with:
  244. node-version: ${{ matrix.node }}
  245. check-latest: true
  246. cache: yarn
  247. - name: Cache NPM dependencies
  248. uses: actions/cache@v3
  249. with:
  250. path: .yarn/cache
  251. key: npm-cache-test-${{ matrix.settings.target }}-${{ matrix.node }}
  252. - name: Install dependencies
  253. run: yarn install
  254. - name: Download artifacts
  255. uses: actions/download-artifact@v3
  256. with:
  257. name: bindings-${{ matrix.settings.target }}
  258. path: .
  259. - name: List packages
  260. run: ls -R .
  261. shell: bash
  262. - name: Test bindings
  263. run: yarn test
  264. test-linux-x64-gnu-binding:
  265. name: Test bindings on Linux-x64-gnu - node@${{ matrix.node }}
  266. needs:
  267. - build
  268. strategy:
  269. fail-fast: false
  270. matrix:
  271. node:
  272. - '14'
  273. - '16'
  274. - '18'
  275. runs-on: ubuntu-latest
  276. steps:
  277. - uses: actions/checkout@v3
  278. - name: Setup node
  279. uses: actions/setup-node@v3
  280. with:
  281. node-version: ${{ matrix.node }}
  282. check-latest: true
  283. cache: yarn
  284. - name: Cache NPM dependencies
  285. uses: actions/cache@v3
  286. with:
  287. path: .yarn/cache
  288. key: npm-cache-test-linux-x64-gnu-${{ matrix.node }}
  289. - name: Install dependencies
  290. run: yarn install
  291. - name: Download artifacts
  292. uses: actions/download-artifact@v3
  293. with:
  294. name: bindings-x86_64-unknown-linux-gnu
  295. path: .
  296. - name: List packages
  297. run: ls -R .
  298. shell: bash
  299. - name: Test bindings
  300. run: docker run --rm -v $(pwd):/build -w /build node:${{ matrix.node }}-slim yarn test
  301. test-linux-x64-musl-binding:
  302. name: Test bindings on x86_64-unknown-linux-musl - node@${{ matrix.node }}
  303. needs:
  304. - build
  305. strategy:
  306. fail-fast: false
  307. matrix:
  308. node:
  309. - '14'
  310. - '16'
  311. - '18'
  312. runs-on: ubuntu-latest
  313. steps:
  314. - uses: actions/checkout@v3
  315. - name: Setup node
  316. uses: actions/setup-node@v3
  317. with:
  318. node-version: ${{ matrix.node }}
  319. check-latest: true
  320. cache: yarn
  321. - name: Cache NPM dependencies
  322. uses: actions/cache@v3
  323. with:
  324. path: .yarn/cache
  325. key: npm-cache-test-x86_64-unknown-linux-musl-${{ matrix.node }}
  326. - name: Install dependencies
  327. run: |
  328. yarn config set supportedArchitectures.libc "musl"
  329. yarn install
  330. - name: Download artifacts
  331. uses: actions/download-artifact@v3
  332. with:
  333. name: bindings-x86_64-unknown-linux-musl
  334. path: .
  335. - name: List packages
  336. run: ls -R .
  337. shell: bash
  338. - name: Test bindings
  339. run: docker run --rm -v $(pwd):/build -w /build node:${{ matrix.node }}-alpine yarn test
  340. test-linux-aarch64-gnu-binding:
  341. name: Test bindings on aarch64-unknown-linux-gnu - node@${{ matrix.node }}
  342. needs:
  343. - build
  344. strategy:
  345. fail-fast: false
  346. matrix:
  347. node:
  348. - '14'
  349. - '16'
  350. - '18'
  351. runs-on: ubuntu-latest
  352. steps:
  353. - run: docker run --rm --privileged multiarch/qemu-user-static:register --reset
  354. - uses: actions/checkout@v3
  355. - name: Download artifacts
  356. uses: actions/download-artifact@v3
  357. with:
  358. name: bindings-aarch64-unknown-linux-gnu
  359. path: .
  360. - name: List packages
  361. run: ls -R .
  362. shell: bash
  363. - name: Cache NPM dependencies
  364. uses: actions/cache@v3
  365. with:
  366. path: .yarn/cache
  367. key: npm-cache-test-linux-aarch64-gnu-${{ matrix.node }}
  368. - name: Install dependencies
  369. run: |
  370. yarn config set supportedArchitectures.cpu "arm64"
  371. yarn config set supportedArchitectures.libc "glibc"
  372. yarn install
  373. - name: Setup and run tests
  374. uses: addnab/docker-run-action@v3
  375. with:
  376. image: ghcr.io/napi-rs/napi-rs/nodejs:aarch64-${{ matrix.node }}
  377. options: '-v ${{ github.workspace }}:/build -w /build'
  378. run: |
  379. set -e
  380. yarn test
  381. ls -la
  382. test-linux-aarch64-musl-binding:
  383. name: Test bindings on aarch64-unknown-linux-musl - node@${{ matrix.node }}
  384. needs:
  385. - build
  386. runs-on: ubuntu-latest
  387. steps:
  388. - run: docker run --rm --privileged multiarch/qemu-user-static:register --reset
  389. - uses: actions/checkout@v3
  390. - name: Download artifacts
  391. uses: actions/download-artifact@v3
  392. with:
  393. name: bindings-aarch64-unknown-linux-musl
  394. path: .
  395. - name: List packages
  396. run: ls -R .
  397. shell: bash
  398. - name: Cache NPM dependencies
  399. uses: actions/cache@v3
  400. with:
  401. path: .yarn/cache
  402. key: npm-cache-test-linux-aarch64-musl-${{ matrix.node }}
  403. - name: Install dependencies
  404. run: |
  405. yarn config set supportedArchitectures.cpu "arm64"
  406. yarn config set supportedArchitectures.libc "musl"
  407. yarn install
  408. - name: Setup and run tests
  409. uses: addnab/docker-run-action@v3
  410. with:
  411. image: multiarch/alpine:aarch64-latest-stable
  412. options: '-v ${{ github.workspace }}:/build -w /build'
  413. run: |
  414. set -e
  415. apk add nodejs npm yarn
  416. yarn test
  417. test-linux-arm-gnueabihf-binding:
  418. name: Test bindings on armv7-unknown-linux-gnueabihf - node@${{ matrix.node }}
  419. needs:
  420. - build
  421. strategy:
  422. fail-fast: false
  423. matrix:
  424. node:
  425. - '14'
  426. - '16'
  427. - '18'
  428. runs-on: ubuntu-latest
  429. steps:
  430. - run: docker run --rm --privileged multiarch/qemu-user-static:register --reset
  431. - uses: actions/checkout@v3
  432. - name: Download artifacts
  433. uses: actions/download-artifact@v3
  434. with:
  435. name: bindings-armv7-unknown-linux-gnueabihf
  436. path: .
  437. - name: List packages
  438. run: ls -R .
  439. shell: bash
  440. - name: Cache NPM dependencies
  441. uses: actions/cache@v3
  442. with:
  443. path: .yarn/cache
  444. key: npm-cache-test-linux-arm-gnueabihf-${{ matrix.node }}
  445. - name: Install dependencies
  446. run: |
  447. yarn config set supportedArchitectures.cpu "arm"
  448. yarn install
  449. - name: Setup and run tests
  450. uses: addnab/docker-run-action@v3
  451. with:
  452. image: ghcr.io/napi-rs/napi-rs/nodejs:armhf-${{ matrix.node }}
  453. options: '-v ${{ github.workspace }}:/build -w /build'
  454. run: |
  455. set -e
  456. yarn test
  457. ls -la
  458. publish:
  459. name: Publish
  460. runs-on: ubuntu-latest
  461. needs:
  462. - build-freebsd
  463. - test-macOS-windows-binding
  464. - test-linux-x64-gnu-binding
  465. - test-linux-x64-musl-binding
  466. - test-linux-aarch64-gnu-binding
  467. - test-linux-aarch64-musl-binding
  468. - test-linux-arm-gnueabihf-binding
  469. steps:
  470. - uses: actions/checkout@v3
  471. - name: Setup node
  472. uses: actions/setup-node@v3
  473. with:
  474. node-version: 16
  475. check-latest: true
  476. cache: yarn
  477. - name: Cache NPM dependencies
  478. uses: actions/cache@v3
  479. with:
  480. path: .yarn/cache
  481. key: npm-cache-ubuntu-latest-publish
  482. restore-keys: |
  483. npm-cache-
  484. - name: Install dependencies
  485. run: yarn install
  486. - name: Download all artifacts
  487. uses: actions/download-artifact@v3
  488. with:
  489. path: artifacts
  490. - name: Move artifacts
  491. run: yarn artifacts
  492. - name: List packages
  493. run: ls -R ./npm
  494. shell: bash
  495. - name: Publish
  496. run: |
  497. if git log -1 --pretty=%B | grep "^[0-9]\+\.[0-9]\+\.[0-9]\+$";
  498. then
  499. echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" >> ~/.npmrc
  500. npm publish --access public
  501. elif git log -1 --pretty=%B | grep "^[0-9]\+\.[0-9]\+\.[0-9]\+";
  502. then
  503. echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" >> ~/.npmrc
  504. npm publish --tag next --access public
  505. else
  506. echo "Not a release, skipping publish"
  507. fi
  508. env:
  509. GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
  510. NPM_TOKEN: ${{ secrets.NPM_TOKEN }}