build-pack-publish.yml
1 name: Prebuildify, package, publish 2 3 on: 4 push: 5 branches: [ master ] 6 pull_request: 7 branches: [ master ] 8 release: 9 types: [ prereleased, released ] 10 11 jobs: 12 build-linux: 13 runs-on: ubuntu-latest 14 steps: 15 - uses: actions/checkout@v4 16 # This is unsafe, but we really don't use any other native dependencies 17 - run: npm ci 18 - run: docker run -u $(id -u):$(id -g) -v `pwd`:/input -w /input ghcr.io/prebuild/almalinux-devtoolset11 npx prebuildify --napi --tag-libc --strip --target=node@18.0.0 19 - run: docker run -u $(id -u):$(id -g) -v `pwd`:/input -w /input ghcr.io/prebuild/alpine npx prebuildify --napi --tag-libc --strip --target=node@18.0.0 20 - run: docker run -u $(id -u):$(id -g) -v `pwd`:/input -w /input ghcr.io/prebuild/linux-armv7 npx prebuildify --napi --tag-libc --strip --target=node@18.0.0 21 - run: docker run -u $(id -u):$(id -g) -v `pwd`:/input -w /input ghcr.io/prebuild/linux-armv7l-musl npx prebuildify --napi --tag-libc --strip --target=node@18.0.0 22 - run: docker run -u $(id -u):$(id -g) -v `pwd`:/input -w /input ghcr.io/prebuild/linux-arm64 npx prebuildify --napi --tag-libc --strip --target=node@18.0.0 23 - run: docker run -u $(id -u):$(id -g) -v `pwd`:/input -w /input ghcr.io/prebuild/linux-arm64-musl npx prebuildify --napi --tag-libc --strip --target=node@18.0.0 24 - run: find prebuilds 25 - uses: actions/upload-artifact@v4 26 with: 27 name: prebuild-linux 28 path: ./prebuilds/ 29 30 build-windows: 31 runs-on: windows-latest 32 steps: 33 - uses: actions/checkout@v4 34 - uses: actions/setup-node@v4 35 with: 36 node-version: 20 37 registry-url: 'https://registry.npmjs.org' 38 - run: npm ci 39 - run: npx prebuildify --napi --strip --arch=x64 --target=node@18.0.0 40 - run: npx prebuildify --napi --strip --arch=arm64 --target=node@20.0.0 41 - run: dir prebuilds 42 - uses: actions/upload-artifact@v4 43 with: 44 name: prebuild-windows 45 path: ./prebuilds/ 46 47 build-macos: 48 runs-on: macos-latest 49 steps: 50 - uses: actions/checkout@v4 51 - uses: actions/setup-node@v4 52 with: 53 node-version: 18 54 registry-url: 'https://registry.npmjs.org' 55 - run: npm ci 56 - run: npx prebuildify --napi --strip --arch=arm64 --target=node@18.0.0 57 - run: npx prebuildify --napi --strip --arch=x64 --target=node@18.0.0 58 - run: find prebuilds 59 - uses: actions/upload-artifact@v4 60 with: 61 name: prebuild-macos 62 path: ./prebuilds/ 63 64 pack: 65 needs: 66 - build-linux 67 - build-windows 68 - build-macos 69 runs-on: ubuntu-latest 70 outputs: 71 PACK_FILE: ${{ steps.pack.outputs.PACK_FILE }} 72 steps: 73 - uses: actions/checkout@v4 74 - uses: actions/download-artifact@v4 75 with: 76 path: /tmp/prebuilds/ 77 - name: Coalesce prebuilds from build matrix 78 run: | 79 mkdir prebuilds 80 for d in /tmp/prebuilds/*; do 81 cp -Rav $d/* prebuilds/ 82 done 83 - run: chmod a+x prebuilds/*/*.node && find prebuilds -executable -type f 84 - id: pack 85 name: Prepare NPM package 86 run: | 87 echo "PACK_FILE=$(npm pack)" >> "$GITHUB_OUTPUT" 88 - uses: actions/upload-artifact@v4 89 with: 90 name: package-tgz 91 path: ${{ steps.pack.outputs.PACK_FILE }} 92 if-no-files-found: 'error' 93 94 test-package: 95 needs: pack 96 strategy: 97 matrix: 98 node-version: [ 18, 20, 22, 23 ] 99 os: [ ubuntu-latest, windows-latest, macos-latest ] 100 runs-on: ${{ matrix.os }} 101 steps: 102 - uses: actions/setup-node@v4 103 with: 104 node-version: ${{ matrix.node-version }} 105 registry-url: 'https://registry.npmjs.org' 106 - uses: actions/download-artifact@v4 107 with: 108 name: package-tgz 109 - run: npm install ${{ needs.pack.outputs.PACK_FILE }} 110 - run: node -e "const b = require('bcrypt'); const h = b.hashSync('hello', 10); console.log(h, b.compareSync('hello', h))"