CI.yml 17 KB

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