name: NodeJS env: WORKING_DIRECTORY: bindings/nodejs DEBUG: 'napi:*' MACOSX_DEPLOYMENT_TARGET: '10.13' NODE_OPTIONS: '--max-old-space-size=3072' CARGO_UNSTABLE_TARGET_APPLIES_TO_HOST: true CARGO_TARGET_APPLIES_TO_HOST: false on: push: branches: - master tags-ignore: - '**' paths: - 'bindings/nodejs/**' - 'core/**' - 'test-data/**' - '.github/workflows/node.yaml' pull_request: paths: - 'bindings/nodejs/**' - 'core/**' - 'test-data/**' - '.github/workflows/node.yaml' permissions: contents: write jobs: build: if: "!contains(github.event.head_commit.message, 'skip ci')" strategy: fail-fast: false matrix: settings: - host: windows-latest target: 'x86_64-pc-windows-msvc' build: | yarn build --target x86_64-pc-windows-msvc - host: macos-15-intel target: 'x86_64-apple-darwin' build: | rustup target add x86_64-apple-darwin yarn build --target x86_64-apple-darwin strip -x ./*.node - host: macos-latest target: 'aarch64-apple-darwin' build: | sudo rm -Rf /Library/Developer/CommandLineTools/SDKs/*; export CC=$(xcrun -f clang); export CXX=$(xcrun -f clang++); SYSROOT=$(xcrun --sdk macosx --show-sdk-path); export CFLAGS="-isysroot $SYSROOT -isystem $SYSROOT"; yarn build --target aarch64-apple-darwin strip -x ./*.node - host: ubuntu-latest target: 'x86_64-unknown-linux-gnu' docker: ghcr.io/napi-rs/napi-rs/nodejs-rust:lts-debian build: | set -e sudo apt-get update sudo apt-get install -y patch cd bindings/nodejs rustup install 1.88.0 rustup default 1.88.0 rustup target add x86_64-unknown-linux-gnu yarn build --target x86_64-unknown-linux-gnu strip ./*.node - host: ubuntu-latest target: 'aarch64-unknown-linux-gnu' docker: ghcr.io/napi-rs/napi-rs/nodejs-rust:lts-debian-aarch64 build: | set -e sudo apt-get update sudo apt-get install -y patch cd bindings/nodejs rustup install 1.88.0 rustup default 1.88.0 rustup target add aarch64-unknown-linux-gnu yarn build --target aarch64-unknown-linux-gnu llvm-strip ./*.node - host: ubuntu-latest target: 'x86_64-unknown-linux-musl' docker: ghcr.io/napi-rs/napi-rs/nodejs-rust:lts-alpine build: | set -e cd bindings/nodejs rustup install 1.88.0 rustup default 1.88.0 rustup target add x86_64-unknown-linux-musl yarn build --target x86_64-unknown-linux-musl strip ./*.node - host: ubuntu-latest target: 'aarch64-unknown-linux-musl' docker: ghcr.io/napi-rs/napi-rs/nodejs-rust:lts-alpine build: | set -e cd bindings/nodejs # Set environment variables for the Rust toolchain export CC_aarch64_unknown_linux_musl=aarch64-linux-musl-gcc export CARGO_TARGET_AARCH64_UNKNOWN_LINUX_MUSL_LINKER=aarch64-linux-musl-gcc rustup install 1.88.0 rustup default 1.88.0 rustup target add aarch64-unknown-linux-musl yarn build --target aarch64-unknown-linux-musl /aarch64-linux-musl-cross/bin/aarch64-linux-musl-strip *.node - host: ubuntu-latest target: 'wasm32-wasip1-threads' setup: | wget https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-27/wasi-sdk-27.0-x86_64-linux.tar.gz tar -xvf wasi-sdk-27.0-x86_64-linux.tar.gz build: | set -e rustup install 1.88.0 rustup default 1.88.0 rustup target add wasm32-wasip1-threads export WASI_SDK_PATH="$(pwd)/wasi-sdk-27.0-x86_64-linux" export CMAKE_BUILD_PARALLEL_LEVEL=2 export TARGET_CXXFLAGS="--target=wasm32-wasi-threads --sysroot=$(pwd)/wasi-sdk-27.0-x86_64-linux/share/wasi-sysroot -pthread -mllvm -wasm-enable-sjlj -lsetjmp" export TARGET_CFLAGS="$TARGET_CXXFLAGS" yarn build --target wasm32-wasip1-threads name: stable - ${{ matrix.settings.target }} - node@22 runs-on: ${{ matrix.settings.host }} defaults: run: working-directory: ${{ env.WORKING_DIRECTORY }} steps: - uses: actions/checkout@v3 - name: Setup node uses: actions/setup-node@v3 if: ${{ !matrix.settings.docker }} with: node-version: 22 check-latest: true cache: yarn cache-dependency-path: 'bindings/nodejs/yarn.lock' - name: Install uses: dtolnay/rust-toolchain@stable if: ${{ !matrix.settings.docker }} with: toolchain: stable targets: ${{ matrix.settings.target }} - name: Cache cargo registry uses: actions/cache@v3 with: path: | ~/.cargo/registry ~/.cargo/git target .cargo-cache key: ${{ matrix.settings.target }}-cargo-registry - name: Setup toolchain run: ${{ matrix.settings.setup }} if: ${{ matrix.settings.setup }} shell: bash - name: 'Install dependencies' run: yarn install --immutable --mode=skip-build - name: Build in docker uses: addnab/docker-run-action@v3 if: ${{ matrix.settings.docker }} with: image: ${{ matrix.settings.docker }} options: --user 0:0 -v ${{ github.workspace }}/.cargo-cache/.cargo/git:/usr/local/cargo/git -v ${{ github.workspace }}/.cargo-cache/.cargo/registry:/usr/local/cargo/registry -v ${{ github.workspace }}:/build -w /build run: ${{ matrix.settings.build }} - name: 'Build' run: ${{ matrix.settings.build }} if: ${{ !matrix.settings.docker }} shell: bash - name: 'Check' if: ${{ matrix.settings.target != 'x86_64-pc-windows-msvc' }} run: ls -la - name: Upload artifact ${{ matrix.settings.target }} if: ${{ matrix.settings.target != 'wasm32-wasip1-threads' }} uses: actions/upload-artifact@v4 with: name: bindings-${{ matrix.settings.target }} path: bindings/nodejs/*.node if-no-files-found: error - name: Upload artifact ${{ matrix.settings.target }} if: ${{ matrix.settings.target == 'wasm32-wasip1-threads' }} uses: actions/upload-artifact@v4 with: name: bindings-wasm32-wasi if-no-files-found: error path: | bindings/nodejs/*.wasm bindings/nodejs/zen-engine.wasi* bindings/nodejs/wasi-worker* test-macOS-windows-binding: name: Test bindings on ${{ matrix.settings.target }} - node@${{ matrix.node }} needs: - build defaults: run: working-directory: ${{ env.WORKING_DIRECTORY }} strategy: fail-fast: false matrix: settings: - host: macos-15-intel target: 'x86_64-apple-darwin' - host: macos-latest target: 'aarch64-apple-darwin' - host: windows-latest target: 'x86_64-pc-windows-msvc' node: [ '20', '22' ] runs-on: ${{ matrix.settings.host }} steps: - uses: actions/checkout@v3 with: submodules: true - name: Setup node uses: actions/setup-node@v3 with: node-version: ${{ matrix.node }} check-latest: true cache: yarn cache-dependency-path: 'bindings/nodejs/yarn.lock' - name: Install dependencies run: yarn install --immutable --mode=skip-build - name: Download artifacts uses: actions/download-artifact@v4 with: name: bindings-${{ matrix.settings.target }} path: artifacts - name: Create dirs run: yarn createNpmDirs shell: bash - name: Move artifacts run: yarn artifacts shell: bash - name: Test bindings run: | yarn install yarn link yarn test test-linux-x64-gnu-binding: name: Test bindings on Linux-x64-gnu - node@${{ matrix.node }} needs: - build defaults: run: working-directory: ${{ env.WORKING_DIRECTORY }} strategy: fail-fast: false matrix: node: [ '20', '22' ] runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Setup node uses: actions/setup-node@v3 with: node-version: ${{ matrix.node }} check-latest: true cache: yarn cache-dependency-path: 'bindings/nodejs/yarn.lock' - name: Install dependencies run: yarn install --immutable --mode=skip-build - name: Download artifacts uses: actions/download-artifact@v4 with: name: bindings-x86_64-unknown-linux-gnu path: artifacts - name: List artifacts run: | ls -la ../../artifacts shell: bash - name: Create dirs run: yarn createNpmDirs shell: bash - name: Move artifacts run: yarn artifacts shell: bash - name: List folder run: ls ./ shell: bash - name: Test bindings uses: addnab/docker-run-action@v3 with: image: node:${{ matrix.node }}-slim options: -v ${{ github.workspace }}:/workspace run: | cd workspace/bindings/nodejs yarn install yarn link yarn test test-linux-x64-musl-binding: name: Test bindings on Linux-x64-musl - node@${{ matrix.node }} needs: - build defaults: run: working-directory: ${{ env.WORKING_DIRECTORY }} strategy: fail-fast: false matrix: node: [ '20', '22' ] runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Setup node uses: actions/setup-node@v3 with: node-version: ${{ matrix.node }} check-latest: true cache: yarn cache-dependency-path: 'bindings/nodejs/yarn.lock' - name: Install dependencies run: yarn install --immutable --mode=skip-build - name: Download artifacts uses: actions/download-artifact@v4 with: name: bindings-x86_64-unknown-linux-musl path: artifacts - name: Create dirs run: yarn createNpmDirs shell: bash - name: Move artifacts run: yarn artifacts shell: bash - name: List folder run: ls ./ shell: bash - name: Test bindings uses: addnab/docker-run-action@v3 with: image: node:${{ matrix.node }}-alpine options: -v ${{ github.workspace }}:/workspace run: | cd workspace/bindings/nodejs yarn install yarn link yarn test test-linux-aarch64-musl-binding: name: Test bindings on Linux-aarch64-musl - node@${{ matrix.node }} needs: - build defaults: run: working-directory: ${{ env.WORKING_DIRECTORY }} strategy: fail-fast: false matrix: node: [ '20', '22' ] runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Setup node uses: actions/setup-node@v3 with: node-version: ${{ matrix.node }} check-latest: true cache: yarn cache-dependency-path: 'bindings/nodejs/yarn.lock' - name: Install dependencies run: | yarn config set supportedArchitectures.cpu "arm64" yarn config set supportedArchitectures.libc "musl" yarn install --immutable --mode=skip-build - name: Set up QEMU uses: docker/setup-qemu-action@v3 with: platforms: arm64 - run: docker run --rm --privileged multiarch/qemu-user-static --reset -p yes - name: Download artifacts uses: actions/download-artifact@v4 with: name: bindings-aarch64-unknown-linux-musl path: artifacts - name: Create dirs run: yarn createNpmDirs shell: bash - name: Move artifacts run: yarn artifacts shell: bash - name: List folder run: ls ./ shell: bash - name: Test bindings uses: addnab/docker-run-action@v3 with: options: --platform linux/arm64 -v ${{ github.workspace }}:/workspace image: node:${{ matrix.node }}-alpine run: | cd workspace/bindings/nodejs yarn install yarn link yarn test # test-linux-aarch64-gnu-binding: # name: Test bindings on aarch64-unknown-linux-gnu - node@${{ matrix.node }} # needs: # - build # defaults: # run: # working-directory: ${{ env.WORKING_DIRECTORY }} # strategy: # fail-fast: false # matrix: # node: ['14', '16', '18'] # runs-on: ubuntu-latest # # steps: # - uses: actions/checkout@v3 # - run: docker run --rm --privileged multiarch/qemu-user-static:register --reset # - name: List directory # run: | # ls -la && # pwd # # - name: Download artifacts # uses: actions/download-artifact@v4 # with: # name: bindings-aarch64-unknown-linux-gnu # path: artifacts # # - name: Install dependencies # run: | # yarn config set supportedArchitectures.cpu "arm64" # yarn config set supportedArchitectures.libc "glibc" # yarn install --immutable --mode=skip-build # - name: Move artifacts # run: yarn artifacts # shell: bash # # - name: List folder # run: ls ./ # shell: bash # # - name: Setup and run tests # uses: addnab/docker-run-action@v3 # with: # image: ghcr.io/napi-rs/napi-rs/nodejs:aarch64-${{ matrix.node }} # options: -v ${{ github.workspace }}:/workspace -w /workspace # run: | # ls -la # cd bindings/nodejs # yarn install # yarn link # yarn test release: name: Release runs-on: ubuntu-latest defaults: run: working-directory: ${{ env.WORKING_DIRECTORY }} needs: - test-linux-x64-gnu-binding # - test-linux-x64-centos-7 - test-linux-x64-musl-binding # - test-linux-aarch64-gnu-binding # - test-linux-arm-gnueabihf-binding - test-macOS-windows-binding - test-linux-aarch64-musl-binding steps: - uses: actions/checkout@v3 - name: Setup node uses: actions/setup-node@v3 with: node-version: 22 check-latest: true cache: yarn cache-dependency-path: 'bindings/nodejs/yarn.lock' registry-url: 'https://registry.npmjs.org' # Organisation scope: '@gorules' - name: 'Install dependencies' run: yarn install --immutable --mode=skip-build - name: Download all artifacts uses: actions/download-artifact@v4 with: path: artifacts - name: List all artifacts run: ls -la ../../artifacts - name: Copy LICENSE run: cp ../../LICENSE . - name: Create dirs run: yarn createNpmDirs shell: bash - name: Move artifacts run: yarn artifacts - name: List folder run: ls ./ shell: bash - name: Lerna publish if: "startsWith(github.event.head_commit.message, 'chore(release): publish nodejs')" run: yarn lerna publish from-package --no-verify-access --yes env: NPM_TOKEN: ${{ secrets.NPM_TOKEN }} NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}