name: Zig-Cross-Compile env: DEBUG: 'napi:*' TEST_ZIG_CROSS: '1' concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true on: push: branches: - main pull_request: jobs: build: name: Zig-Cross-Compile-On-Linux runs-on: ubuntu-latest strategy: fail-fast: false matrix: target: [ 'aarch64-apple-darwin', 'x86_64-unknown-linux-musl', 'aarch64-unknown-linux-musl', 'armv7-unknown-linux-musleabihf', ] steps: - run: docker run --rm --privileged multiarch/qemu-user-static:register --reset - uses: actions/checkout@v4 - name: Setup node uses: actions/setup-node@v4 with: node-version: 22 cache: 'yarn' - name: Install uses: dtolnay/rust-toolchain@stable with: toolchain: 1.80.1 targets: ${{ matrix.target }} - name: Cache cargo uses: actions/cache@v4 with: path: | ~/.cargo/registry ~/.cargo/git target key: stable-zig-${{ matrix.target }}-cargo-cache - name: Install ziglang uses: goto-bus-stop/setup-zig@v2 with: version: 0.14.0 - name: Install cargo-zigbuild uses: taiki-e/install-action@v2 with: tool: cargo-zigbuild env: GITHUB_TOKEN: ${{ github.token }} - name: Install dependencies run: yarn install --immutable --mode=skip-build - name: install MacOS SDK if: contains(matrix.target, 'apple') run: | curl -L "https://github.com/phracker/MacOSX-SDKs/releases/download/11.3/MacOSX11.3.sdk.tar.xz" | tar -J -x -C /opt - name: Cross build native tests env: SDKROOT: /opt/MacOSX11.3.sdk run: | yarn build:test -- --target ${{ matrix.target }} --cross-compile - name: Upload artifacts uses: actions/upload-artifact@v4 with: name: compat-${{ matrix.target }} path: ./examples/napi-compat-mode/index.node if-no-files-found: error - name: Upload artifacts uses: actions/upload-artifact@v4 with: name: napi-${{ matrix.target }} path: ./examples/napi/*.node if-no-files-found: error test: name: Test Zig Cross Compiled ${{ matrix.settings.target }} runs-on: ${{ matrix.settings.host }} needs: - build strategy: fail-fast: false matrix: settings: - host: ubuntu-latest target: x86_64-unknown-linux-musl - host: macos-latest target: aarch64-apple-darwin - host: ubuntu-24.04-arm target: aarch64-unknown-linux-musl docker-platform: arm64 - host: ubuntu-latest target: armv7-unknown-linux-musleabihf docker-platform: arm/v7 steps: - uses: actions/checkout@v4 - name: Setup node uses: actions/setup-node@v4 with: node-version: 22 cache: 'yarn' - name: Install dependencies run: | yarn config set --json supportedArchitectures.libc '["current", "musl"]' yarn config set --json supportedArchitectures.cpu '["current", "arm64", "arm", "wasm32"]' yarn install --immutable --mode=skip-build - name: Download artifacts uses: actions/download-artifact@v4 with: name: napi-${{ matrix.settings.target }} path: ./examples/napi/ - name: Download artifacts uses: actions/download-artifact@v4 with: name: compat-${{ matrix.settings.target }} path: ./examples/napi-compat-mode/ - name: List files run: | ls ./examples/napi ls ./examples/napi-compat-mode - name: Test run: | yarn workspace @examples/napi test -s --verbose yarn workspace @examples/compat-mode test -s --verbose env: SKIP_UNWIND_TEST: 1 if: matrix.settings.host == 'macos-latest' - run: docker run --rm --privileged multiarch/qemu-user-static --reset -p yes if: matrix.settings.host == 'ubuntu-latest' - name: Test uses: addnab/docker-run-action@v3 if: matrix.settings.host == 'ubuntu-latest' && matrix.settings.target != 'x86_64-unknown-linux-musl' && matrix.settings.target != 'armv7-unknown-linux-musleabihf' with: image: node:lts-alpine options: --platform linux/${{ matrix.settings.docker-platform }} -v ${{ github.workspace }}:/build -w /build run: | set -e yarn test - name: Test uses: addnab/docker-run-action@v3 if: matrix.settings.target == 'armv7-unknown-linux-musleabihf' # Docker issues continue-on-error: true with: # https://github.com/nodejs/docker-node/issues/1798 image: node:18-alpine options: --platform linux/${{ matrix.settings.docker-platform }} -v ${{ github.workspace }}:/build -w /build run: | set -e export NODE_OPTIONS="--max-old-space-size=8192" yarn tsc -p examples/napi/tsconfig.json rm -rf examples/napi/__tests__ mv examples/napi/dist/__tests__ examples/napi/ yarn workspace @examples/napi test -s --verbose - name: Test uses: addnab/docker-run-action@v3 if: matrix.settings.target == 'x86_64-unknown-linux-musl' with: image: node:lts-alpine options: -v ${{ github.workspace }}:/napi-rs -w /napi-rs run: yarn test zig-done: runs-on: ubuntu-latest needs: - test steps: - run: exit 1 if: ${{ always() && (contains(needs.*.result, 'failure') || contains(needs.*.result, 'cancelled')) }}