chore: bump up node version to v24 #170
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: CI | |
| env: | |
| DEBUG: napi:* | |
| APP_NAME: project-detector | |
| MACOSX_DEPLOYMENT_TARGET: '10.13' | |
| CARGO_INCREMENTAL: '1' | |
| permissions: | |
| contents: write | |
| id-token: write | |
| on: | |
| push: | |
| branches: | |
| - main | |
| tags-ignore: | |
| - '**' | |
| paths-ignore: | |
| - '**/*.md' | |
| - LICENSE | |
| - '**/*.gitignore' | |
| - .editorconfig | |
| - docs/** | |
| pull_request: null | |
| concurrency: | |
| group: ${{ github.workflow }}-${{ github.ref }} | |
| cancel-in-progress: true | |
| jobs: | |
| lint: | |
| name: Lint | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@v5 | |
| - name: setup pnpm | |
| uses: pnpm/action-setup@v4 | |
| - name: Setup node | |
| uses: actions/setup-node@v5 | |
| with: | |
| node-version: 24 | |
| cache: pnpm | |
| - name: Install | |
| uses: dtolnay/rust-toolchain@stable | |
| with: | |
| components: clippy, rustfmt | |
| - name: Install dependencies | |
| run: pnpm install --force | |
| - name: ESLint | |
| run: pnpm lint | |
| - name: Cargo fmt | |
| run: cargo fmt -- --check | |
| - name: Clippy | |
| run: cargo clippy | |
| build: | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| settings: | |
| - host: macos-latest | |
| target: x86_64-apple-darwin | |
| build: pnpm build --target x86_64-apple-darwin | |
| - host: windows-latest | |
| build: pnpm build --target x86_64-pc-windows-msvc | |
| target: x86_64-pc-windows-msvc | |
| - host: windows-latest | |
| build: pnpm build --target i686-pc-windows-msvc | |
| target: i686-pc-windows-msvc | |
| - host: ubuntu-latest | |
| target: x86_64-unknown-linux-gnu | |
| build: pnpm build --target x86_64-unknown-linux-gnu --use-napi-cross | |
| - host: ubuntu-latest | |
| target: x86_64-unknown-linux-musl | |
| build: pnpm build --target x86_64-unknown-linux-musl -x | |
| - host: macos-latest | |
| target: aarch64-apple-darwin | |
| build: pnpm build --target aarch64-apple-darwin | |
| - host: ubuntu-latest | |
| target: aarch64-unknown-linux-gnu | |
| build: pnpm build --target aarch64-unknown-linux-gnu --use-napi-cross | |
| - host: ubuntu-latest | |
| target: armv7-unknown-linux-gnueabihf | |
| build: pnpm build --target armv7-unknown-linux-gnueabihf --use-napi-cross | |
| - host: ubuntu-latest | |
| target: aarch64-linux-android | |
| build: pnpm build --target aarch64-linux-android | |
| - host: ubuntu-latest | |
| target: armv7-linux-androideabi | |
| build: pnpm build --target armv7-linux-androideabi | |
| - host: ubuntu-latest | |
| target: aarch64-unknown-linux-musl | |
| build: pnpm build --target aarch64-unknown-linux-musl -x | |
| - host: windows-latest | |
| target: aarch64-pc-windows-msvc | |
| build: pnpm build --target aarch64-pc-windows-msvc | |
| - host: ubuntu-latest | |
| target: wasm32-wasip1-threads | |
| build: pnpm build --target wasm32-wasip1-threads | |
| - host: ubuntu-latest | |
| target: aarch64-unknown-linux-ohos | |
| build: pnpm build --target aarch64-unknown-linux-ohos | |
| - host: ubuntu-latest | |
| target: x86_64-unknown-linux-ohos | |
| build: pnpm build --target x86_64-unknown-linux-ohos | |
| name: stable - ${{ matrix.settings.target }} - node@20 | |
| runs-on: ${{ matrix.settings.host }} | |
| steps: | |
| - uses: actions/checkout@v5 | |
| - name: setup pnpm | |
| uses: pnpm/action-setup@v4 | |
| - name: Setup node | |
| uses: actions/setup-node@v5 | |
| with: | |
| node-version: 24 | |
| cache: pnpm | |
| - name: Install | |
| uses: dtolnay/rust-toolchain@stable | |
| with: | |
| toolchain: stable | |
| targets: ${{ matrix.settings.target }} | |
| - name: Setup WASI SDK | |
| if: ${{ matrix.settings.target == 'wasm32-wasip1-threads' }} | |
| run: | | |
| wget https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-20/wasi-sdk-20.0-linux.tar.gz | |
| tar -xzf wasi-sdk-20.0-linux.tar.gz | |
| ls -la wasi-sdk-20.0/ | |
| echo "WASI_SDK_PATH=$PWD/wasi-sdk-20.0" >> $GITHUB_ENV | |
| echo "WASI_SYSROOT=$PWD/wasi-sdk-20.0/share/wasi-sysroot" >> $GITHUB_ENV | |
| - name: Cache cargo | |
| uses: actions/cache@v4 | |
| with: | |
| path: | | |
| ~/.cargo/registry/index/ | |
| ~/.cargo/registry/cache/ | |
| ~/.cargo/git/db/ | |
| ~/.napi-rs | |
| .cargo-cache | |
| target/ | |
| key: ${{ matrix.settings.target }}-cargo-${{ matrix.settings.host }} | |
| - uses: mlugg/setup-zig@v2 | |
| if: ${{ contains(matrix.settings.target, 'musl') }} | |
| with: | |
| version: 0.15.1 | |
| - name: Install cargo-zigbuild | |
| uses: taiki-e/install-action@v2 | |
| if: ${{ contains(matrix.settings.target, 'musl') }} | |
| env: | |
| GITHUB_TOKEN: ${{ github.token }} | |
| with: | |
| tool: cargo-zigbuild | |
| - name: Setup toolchain | |
| run: ${{ matrix.settings.setup }} | |
| if: ${{ matrix.settings.setup }} | |
| shell: bash | |
| - name: Install dependencies | |
| run: pnpm install --force | |
| - name: Setup node x86 | |
| uses: actions/setup-node@v5 | |
| if: matrix.settings.target == 'i686-pc-windows-msvc' | |
| with: | |
| node-version: 24 | |
| cache: pnpm | |
| architecture: x86 | |
| - name: Setup OpenHarmony SDK | |
| if: ${{ contains(matrix.settings.target, 'ohos') }} | |
| uses: openharmony-rs/[email protected] | |
| - name: Build | |
| run: | | |
| if [[ "${{ matrix.settings.target }}" == "wasm32-wasip1-threads" ]]; then | |
| export WASI_SDK_PATH="$PWD/wasi-sdk-20.0" | |
| export WASI_SYSROOT="$PWD/wasi-sdk-20.0/share/wasi-sysroot" | |
| export CC_wasm32_wasip1_threads="$PWD/wasi-sdk-20.0/bin/clang" | |
| export CXX_wasm32_wasip1_threads="$PWD/wasi-sdk-20.0/bin/clang++" | |
| export AR_wasm32_wasip1_threads="$PWD/wasi-sdk-20.0/bin/llvm-ar" | |
| export RANLIB_wasm32_wasip1_threads="$PWD/wasi-sdk-20.0/bin/llvm-ranlib" | |
| export CFLAGS_wasm32_wasip1_threads="--sysroot=$PWD/wasi-sdk-20.0/share/wasi-sysroot" | |
| export CXXFLAGS_wasm32_wasip1_threads="--sysroot=$PWD/wasi-sdk-20.0/share/wasi-sysroot" | |
| export LDFLAGS_wasm32_wasip1_threads="--sysroot=$PWD/wasi-sdk-20.0/share/wasi-sysroot" | |
| export NAPI_RS_WASI_RUNTIME=emnapi | |
| pnpm build --target ${{ matrix.settings.target }} | |
| echo "=== Generated files ===" | |
| ls -la *.wasm | |
| ls -la *.cjs | |
| ls -la project-detector.* | |
| echo "=== Checking for WASI binding files ===" | |
| find . -name "*.cjs" -o -name "*wasi*" -o -name "*wasm*" -o -name "*worker*" 2>/dev/null | head -20 || echo "No additional files found" | |
| else | |
| ${{ matrix.settings.build }} | |
| fi | |
| shell: bash | |
| - name: Upload artifact | |
| uses: actions/upload-artifact@v4 | |
| if: matrix.settings.target != 'wasm32-wasip1-threads' | |
| with: | |
| name: bindings-${{ matrix.settings.target }} | |
| path: '*.node' | |
| if-no-files-found: error | |
| - name: Upload WASI artifact | |
| uses: actions/upload-artifact@v4 | |
| if: matrix.settings.target == 'wasm32-wasip1-threads' | |
| with: | |
| name: bindings-wasm32-wasip1-threads | |
| path: | | |
| project-detector.wasm32-wasi.wasm | |
| project-detector.wasm32-wasi.debug.wasm | |
| project-detector.wasi.cjs | |
| project-detector.wasi-browser.js | |
| wasi-worker.mjs | |
| wasi-worker-browser.mjs | |
| wasi-worker.* | |
| browser.js | |
| *.browser.* | |
| if-no-files-found: error | |
| build-freebsd: | |
| runs-on: ubuntu-latest | |
| name: Build FreeBSD | |
| steps: | |
| - uses: actions/checkout@v5 | |
| - name: Build | |
| id: build | |
| uses: cross-platform-actions/[email protected] | |
| env: | |
| DEBUG: napi:* | |
| RUSTUP_IO_THREADS: 1 | |
| with: | |
| operating_system: freebsd | |
| version: '14.3' | |
| memory: 8G | |
| cpu_count: 3 | |
| environment_variables: DEBUG RUSTUP_IO_THREADS | |
| shell: bash | |
| run: | | |
| sudo pkg install -y -f curl node libnghttp2 npm | |
| sudo npm install -g corepack | |
| curl https://sh.rustup.rs -sSf --output rustup.sh | |
| sh rustup.sh -y --profile minimal --default-toolchain beta | |
| corepack prepare | |
| corepack enable | |
| source "$HOME/.cargo/env" | |
| echo "~~~~ rustc --version ~~~~" | |
| rustc --version | |
| echo "~~~~ node -v ~~~~" | |
| node -v | |
| echo "~~~~ pnpm --version ~~~~" | |
| pnpm --version | |
| pwd | |
| ls -lah | |
| whoami | |
| env | |
| freebsd-version | |
| pnpm install --force | |
| pnpm build | |
| rm -rf node_modules | |
| rm -rf target | |
| - name: Upload artifact | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: bindings-freebsd | |
| path: ${{ env.APP_NAME }}.*.node | |
| if-no-files-found: error | |
| test-macOS-windows-binding: | |
| name: Test bindings on ${{ matrix.settings.target }} - node@${{ matrix.node }} | |
| needs: | |
| - build | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| settings: | |
| - host: windows-latest | |
| target: x86_64-pc-windows-msvc | |
| architecture: x64 | |
| - host: macos-latest | |
| target: x86_64-apple-darwin | |
| architecture: x64 | |
| - host: macos-latest | |
| target: aarch64-apple-darwin | |
| architecture: arm64 | |
| node: | |
| - '20' | |
| - '22' | |
| runs-on: ${{ matrix.settings.host }} | |
| steps: | |
| - uses: actions/checkout@v5 | |
| - name: setup pnpm | |
| uses: pnpm/action-setup@v4 | |
| - name: Setup node | |
| uses: actions/setup-node@v5 | |
| with: | |
| node-version: ${{ matrix.node }} | |
| cache: pnpm | |
| architecture: ${{ matrix.settings.architecture }} | |
| - name: Install dependencies | |
| run: pnpm install --force | |
| - name: Download artifacts | |
| uses: actions/download-artifact@v5 | |
| with: | |
| name: bindings-${{ matrix.settings.target }} | |
| path: . | |
| - name: List packages | |
| run: ls -R . | |
| shell: bash | |
| - name: Test bindings | |
| run: pnpm test | |
| test-linux-binding: | |
| name: Test ${{ matrix.target }} - node@${{ matrix.node }} | |
| needs: | |
| - build | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| target: | |
| - x86_64-unknown-linux-gnu | |
| - x86_64-unknown-linux-musl | |
| - aarch64-unknown-linux-gnu | |
| - aarch64-unknown-linux-musl | |
| - armv7-unknown-linux-gnueabihf | |
| node: | |
| - '20' | |
| - '22' | |
| runs-on: ${{ contains(matrix.target, 'aarch64') && 'ubuntu-24.04-arm' || 'ubuntu-latest' }} | |
| steps: | |
| - uses: actions/checkout@v5 | |
| - name: setup pnpm | |
| uses: pnpm/action-setup@v4 | |
| - name: Setup node | |
| uses: actions/setup-node@v5 | |
| with: | |
| node-version: ${{ matrix.node }} | |
| cache: pnpm | |
| - name: Output docker params | |
| id: docker | |
| run: | | |
| node -e " | |
| if ('${{ matrix.target }}'.startsWith('aarch64')) { | |
| console.log('PLATFORM=linux/arm64') | |
| } else if ('${{ matrix.target }}'.startsWith('armv7')) { | |
| console.log('PLATFORM=linux/arm/v7') | |
| } else { | |
| console.log('PLATFORM=linux/amd64') | |
| } | |
| " >> $GITHUB_OUTPUT | |
| node -e " | |
| if ('${{ matrix.target }}'.endsWith('-musl')) { | |
| console.log('IMAGE=node:${{ matrix.node }}-alpine') | |
| } else { | |
| console.log('IMAGE=node:${{ matrix.node }}-slim') | |
| } | |
| " >> $GITHUB_OUTPUT | |
| echo "PNPM_STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_OUTPUT | |
| # use --force to download the all platform/arch dependencies | |
| - name: Install dependencies | |
| run: pnpm install --force | |
| - name: Download artifacts | |
| uses: actions/download-artifact@v5 | |
| with: | |
| name: bindings-${{ matrix.target }} | |
| path: . | |
| - name: List packages | |
| run: ls -R . | |
| shell: bash | |
| - name: Set up QEMU | |
| uses: docker/setup-qemu-action@v3 | |
| if: ${{ contains(matrix.target, 'armv7') }} | |
| with: | |
| platforms: all | |
| - run: docker run --rm --privileged multiarch/qemu-user-static --reset -p yes | |
| if: ${{ contains(matrix.target, 'armv7') }} | |
| - name: Test bindings | |
| uses: addnab/docker-run-action@v3 | |
| with: | |
| image: ${{ steps.docker.outputs.IMAGE }} | |
| options: -v ${{ steps.docker.outputs.PNPM_STORE_PATH }}:${{ steps.docker.outputs.PNPM_STORE_PATH }} -v ${{ github.workspace }}:${{ github.workspace }} -w ${{ github.workspace }} --platform ${{ steps.docker.outputs.PLATFORM }} | |
| run: npm run test | |
| test-wasi: | |
| name: Test WASI target | |
| needs: | |
| - build | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@v5 | |
| - name: setup pnpm | |
| uses: pnpm/action-setup@v4 | |
| - name: Setup node | |
| uses: actions/setup-node@v5 | |
| with: | |
| node-version: 24 | |
| cache: pnpm | |
| - name: Install dependencies | |
| run: pnpm install --force | |
| - name: Download artifacts | |
| uses: actions/download-artifact@v5 | |
| with: | |
| name: bindings-wasm32-wasip1-threads | |
| path: . | |
| - name: List packages | |
| run: ls -R . | |
| shell: bash | |
| - name: Test bindings | |
| run: | | |
| export NAPI_RS_FORCE_WASI=1 | |
| export NODE_OPTIONS="--experimental-wasi-unstable-preview1" | |
| echo "=== Files before test ===" | |
| ls -la *.wasm *.cjs project-detector.* 2>/dev/null || echo "No matching files found" | |
| echo "=== Running test ===" | |
| pnpm test | |
| env: | |
| NAPI_RS_FORCE_WASI: 1 | |
| NODE_OPTIONS: --experimental-wasi-unstable-preview1 | |
| publish: | |
| name: Publish | |
| runs-on: ubuntu-latest | |
| needs: | |
| - lint | |
| - build-freebsd | |
| - test-macOS-windows-binding | |
| - test-linux-binding | |
| - test-wasi | |
| steps: | |
| - uses: actions/checkout@v5 | |
| - name: setup pnpm | |
| uses: pnpm/action-setup@v4 | |
| - name: Setup node | |
| uses: actions/setup-node@v5 | |
| with: | |
| node-version: 24 | |
| cache: pnpm | |
| - name: Install dependencies | |
| run: pnpm install --force | |
| - name: Build | |
| run: pnpm postbuild | |
| - name: Download all artifacts | |
| uses: actions/download-artifact@v5 | |
| with: | |
| path: artifacts | |
| - name: List downloaded artifacts | |
| run: | | |
| echo "=== Downloaded artifacts ===" | |
| find artifacts -type f | head -20 | |
| echo "=== WASI artifacts ===" | |
| find artifacts -name "*wasi*" -o -name "*wasm*" | head -10 | |
| - name: Copy WASI files to root | |
| run: | | |
| echo "=== Copying WASI files to root directory ===" | |
| cp artifacts/bindings-wasm32-wasip1-threads/project-detector.wasi.cjs . || echo "WASI CJS file not found" | |
| cp artifacts/bindings-wasm32-wasip1-threads/project-detector.wasi-browser.js . || echo "WASI browser file not found" | |
| cp artifacts/bindings-wasm32-wasip1-threads/wasi-worker.mjs . || echo "WASI worker file not found" | |
| cp artifacts/bindings-wasm32-wasip1-threads/wasi-worker-browser.mjs . || echo "WASI browser worker file not found" | |
| cp artifacts/bindings-wasm32-wasip1-threads/wasi-worker.* . || echo "No additional WASI worker files found" | |
| cp artifacts/bindings-wasm32-wasip1-threads/browser.js . || echo "Browser JS file not found" | |
| cp artifacts/bindings-wasm32-wasip1-threads/*.browser.* . || echo "No additional browser files found" | |
| ls -la project-detector.wasi.* wasi-worker* browser.js *.browser.* || echo "No WASI files in root" | |
| - name: create npm dirs | |
| run: pnpm napi create-npm-dirs | |
| - name: Move artifacts | |
| run: pnpm artifacts | |
| - name: List packages | |
| run: ls -R ./npm | |
| shell: bash | |
| - name: Publish | |
| run: | | |
| npm config set provenance true | |
| if git log -1 --pretty=%B | grep "^v\?[0-9]\+\.[0-9]\+\.[0-9]\+$"; | |
| then | |
| echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" >> ~/.npmrc | |
| npm publish --access public | |
| elif git log -1 --pretty=%B | grep "^v\?[0-9]\+\.[0-9]\+\.[0-9]\+"; | |
| then | |
| echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" >> ~/.npmrc | |
| npm publish --tag next --access public | |
| else | |
| echo "Not a release, skipping publish" | |
| fi | |
| env: | |
| GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
| NPM_TOKEN: ${{ secrets.NPM_TOKEN }} |