name: CI env: DEBUG: napi:* APP_NAME: droplet MACOSX_DEPLOYMENT_TARGET: "10.13" permissions: contents: write id-token: write "on": push: branches: - main tags-ignore: - "**" paths: - package.json - .github/workflows/* pull_request: null jobs: build: strategy: fail-fast: false matrix: settings: - host: macos-latest target: x86_64-apple-darwin build: yarn build --target x86_64-apple-darwin - host: windows-latest build: yarn build --target x86_64-pc-windows-msvc target: x86_64-pc-windows-msvc - host: ubuntu-latest target: x86_64-unknown-linux-gnu docker: ghcr.io/napi-rs/napi-rs/nodejs-rust:lts-debian build: yarn build --target x86_64-unknown-linux-gnu - host: ubuntu-latest target: x86_64-unknown-linux-musl docker: ghcr.io/napi-rs/napi-rs/nodejs-rust:lts-alpine build: yarn build --target x86_64-unknown-linux-musl - host: macos-latest target: aarch64-apple-darwin build: yarn build --target aarch64-apple-darwin - host: ubuntu-latest target: aarch64-unknown-linux-gnu docker: ghcr.io/napi-rs/napi-rs/nodejs-rust:lts-debian-aarch64 build: yarn build --target aarch64-unknown-linux-gnu - host: ubuntu-latest target: aarch64-unknown-linux-musl docker: ghcr.io/napi-rs/napi-rs/nodejs-rust:lts-alpine build: |- set -e && rustup target add aarch64-unknown-linux-musl && yarn build --target aarch64-unknown-linux-musl - host: windows-latest target: aarch64-pc-windows-msvc build: yarn build --target aarch64-pc-windows-msvc - host: ubuntu-latest target: riscv64gc-unknown-linux-gnu setup: | sudo apt-get update sudo apt-get install gcc-riscv64-linux-gnu -y build: yarn build --target riscv64gc-unknown-linux-gnu name: nightly - ${{ matrix.settings.target }} - node@20 runs-on: ${{ matrix.settings.host }} steps: - uses: actions/checkout@v4 - name: Setup node uses: actions/setup-node@v4 if: ${{ !matrix.settings.docker }} with: node-version: 20 cache: yarn - name: Install uses: dtolnay/rust-toolchain@nightly if: ${{ !matrix.settings.docker }} with: toolchain: nightly targets: ${{ matrix.settings.target }} - name: Cache cargo uses: actions/cache@v4 with: path: | ~/.cargo/registry/index/ ~/.cargo/registry/cache/ ~/.cargo/git/db/ .cargo-cache target/ key: ${{ matrix.settings.target }}-cargo-${{ matrix.settings.host }} - uses: goto-bus-stop/setup-zig@v2 if: ${{ matrix.settings.target == 'armv7-unknown-linux-gnueabihf' || matrix.settings.target == 'armv7-unknown-linux-musleabihf' }} with: version: 0.13.0 - name: Setup toolchain run: ${{ matrix.settings.setup }} if: ${{ matrix.settings.setup }} shell: bash - name: Install dependencies run: |- cargo install patch-crate && cargo patch-crate && yarn install - 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/git/db:/usr/local/cargo/git/db -v ${{ github.workspace }}/.cargo/registry/cache:/usr/local/cargo/registry/cache -v ${{ github.workspace }}/.cargo/registry/index:/usr/local/cargo/registry/index -v ${{ github.workspace }}:/build -w /build" run: |- rustup default nightly && rustup target add ${{ matrix.settings.target }} && ${{ matrix.settings.build }} - name: Build run: ${{ matrix.settings.build }} if: ${{ !matrix.settings.docker }} shell: bash - name: Upload artifact uses: actions/upload-artifact@v4 with: name: bindings-${{ matrix.settings.target }} 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: macos-latest target: x86_64-apple-darwin - host: windows-latest target: x86_64-pc-windows-msvc node: - "18" - "20" runs-on: ${{ matrix.settings.host }} steps: - uses: actions/checkout@v4 - name: Setup node uses: actions/setup-node@v4 with: node-version: ${{ matrix.node }} cache: yarn architecture: x64 - name: Install dependencies run: yarn install - name: Download artifacts uses: actions/download-artifact@v4 with: name: bindings-${{ matrix.settings.target }} path: . - name: List packages run: ls -R . shell: bash - name: Test bindings run: yarn test # test-linux-x64-gnu-binding: # name: Test bindings on Linux-x64-gnu - node@${{ matrix.node }} # needs: # - build # strategy: # fail-fast: false # matrix: # node: # - "18" # - "20" # runs-on: ubuntu-latest # steps: # - uses: actions/checkout@v4 # - name: Setup node # uses: actions/setup-node@v4 # with: # node-version: ${{ matrix.node }} # cache: yarn # - name: Install dependencies # run: yarn install # - name: Download artifacts # uses: actions/download-artifact@v4 # with: # name: bindings-x86_64-unknown-linux-gnu # path: . # - name: List packages # run: ls -R . # shell: bash # - name: Test bindings # run: docker run --rm -v $(pwd):/build -w /build public.ecr.aws/docker/library/node:${{ matrix.node }}-slim yarn test # test-linux-x64-musl-binding: # name: Test bindings on x86_64-unknown-linux-musl - node@${{ matrix.node }} # needs: # - build # strategy: # fail-fast: false # matrix: # node: # - "18" # - "20" # runs-on: ubuntu-latest # steps: # - uses: actions/checkout@v4 # - name: Setup node # uses: actions/setup-node@v4 # with: # node-version: ${{ matrix.node }} # cache: yarn # - name: Install dependencies # run: | # yarn config set supportedArchitectures.libc "musl" # yarn install # - name: Download artifacts # uses: actions/download-artifact@v4 # with: # name: bindings-x86_64-unknown-linux-musl # path: . # - name: List packages # run: ls -R . # shell: bash # - name: Test bindings # run: docker run --rm -v $(pwd):/build -w /build public.ecr.aws/docker/library/node:${{ matrix.node }}-alpine yarn test # test-linux-aarch64-gnu-binding: # name: Test bindings on aarch64-unknown-linux-gnu - node@${{ matrix.node }} # needs: # - build # strategy: # fail-fast: false # matrix: # node: # - "18" # - "20" # runs-on: ubuntu-latest # steps: # - uses: actions/checkout@v4 # - name: Download artifacts # uses: actions/download-artifact@v4 # with: # name: bindings-aarch64-unknown-linux-gnu # path: . # - name: List packages # run: ls -R . # shell: bash # - name: Install dependencies # run: | # yarn config set supportedArchitectures.cpu "arm64" # yarn config set supportedArchitectures.libc "glibc" # yarn install # - 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: Setup and run tests # uses: addnab/docker-run-action@v3 # with: # image: public.ecr.aws/docker/library/node:${{ matrix.node }}-slim # options: "--platform linux/arm64 -v ${{ github.workspace }}:/build -w /build" # run: | # set -e # yarn test # ls -la # test-linux-aarch64-musl-binding: # name: Test bindings on aarch64-unknown-linux-musl - node@${{ matrix.node }} # needs: # - build # runs-on: ubuntu-latest # steps: # - uses: actions/checkout@v4 # - name: Download artifacts # uses: actions/download-artifact@v4 # with: # name: bindings-aarch64-unknown-linux-musl # path: . # - name: List packages # run: ls -R . # shell: bash # - name: Install dependencies # run: | # yarn config set supportedArchitectures.cpu "arm64" # yarn config set supportedArchitectures.libc "musl" # yarn install # - 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: Setup and run tests # uses: addnab/docker-run-action@v3 # with: # image: node:lts-alpine # options: "--platform linux/arm64 -v ${{ github.workspace }}:/build -w /build" # run: | # set -e # yarn test # test-linux-arm-gnueabihf-binding: # name: Test bindings on armv7-unknown-linux-gnueabihf - node@${{ matrix.node }} # needs: # - build # strategy: # fail-fast: false # matrix: # node: # - "18" # - "20" # runs-on: ubuntu-latest # steps: # - uses: actions/checkout@v4 # - name: Download artifacts # uses: actions/download-artifact@v4 # with: # name: bindings-armv7-unknown-linux-gnueabihf # path: . # - name: List packages # run: ls -R . # shell: bash # - name: Install dependencies # run: | # yarn config set supportedArchitectures.cpu "arm" # yarn install # - name: Set up QEMU # uses: docker/setup-qemu-action@v3 # with: # platforms: arm # - run: docker run --rm --privileged multiarch/qemu-user-static --reset -p yes # - name: Setup and run tests # uses: addnab/docker-run-action@v3 # with: # image: public.ecr.aws/docker/library/node:${{ matrix.node }}-bullseye-slim # options: "--platform linux/arm/v7 -v ${{ github.workspace }}:/build -w /build" # run: | # set -e # yarn test # ls -la universal-macOS: name: Build universal macOS binary needs: - build runs-on: macos-latest steps: - uses: actions/checkout@v4 - name: Setup node uses: actions/setup-node@v4 with: node-version: 20 cache: yarn - name: Install dependencies run: yarn install - name: Download macOS x64 artifact uses: actions/download-artifact@v4 with: name: bindings-x86_64-apple-darwin path: artifacts - name: Download macOS arm64 artifact uses: actions/download-artifact@v4 with: name: bindings-aarch64-apple-darwin path: artifacts - name: Move artifacts run: mv artifacts/* . - name: Combine binaries run: yarn universal - name: Upload artifact uses: actions/upload-artifact@v4 with: name: bindings-universal-apple-darwin path: ${{ env.APP_NAME }}.*.node if-no-files-found: error publish: name: Publish runs-on: ubuntu-latest needs: - test-macOS-windows-binding # - test-linux-x64-gnu-binding # - test-linux-x64-musl-binding # - test-linux-aarch64-gnu-binding # - test-linux-aarch64-musl-binding # - test-linux-arm-gnueabihf-binding - universal-macOS steps: - uses: actions/checkout@v4 - name: Setup node uses: actions/setup-node@v4 with: node-version: 20 cache: yarn - name: Install dependencies run: yarn install - name: Download all artifacts uses: actions/download-artifact@v4 with: path: artifacts - name: Move artifacts run: yarn artifacts - name: List packages run: ls -R ./npm shell: bash - name: Publish run: | npm config set provenance true echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" >> ~/.npmrc npm publish --access public env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} NPM_TOKEN: ${{ secrets.NPM_TOKEN }}