name: CI env: DEBUG: napi:* APP_NAME: image MACOSX_DEPLOYMENT_TARGET: '10.13' SYSTEM_DEPS_DAV1D_BUILD_INTERNAL: 'always' permissions: contents: write id-token: write 'on': push: branches: - main tags-ignore: - '**' paths-ignore: - '**/*.md' - LICENSE - '**/*.gitignore' - .editorconfig - docs/** - website/** pull_request: null concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true jobs: build: strategy: fail-fast: false matrix: settings: - host: macos-14 target: x86_64-apple-darwin setup: | brew install meson llvm build: | export PATH="/opt/homebrew/opt/llvm/bin:$PATH" export CC=clang export CXX=clang++ export CMAKE_BUILD_PARALLEL_LEVEL=2 clang --version yarn workspace @napi-rs/image build --target x86_64-apple-darwin --features with_simd - host: windows-latest build: | python -m pip install meson yarn workspace @napi-rs/image build --target x86_64-pc-windows-msvc --features with_simd target: x86_64-pc-windows-msvc - host: macos-14 setup: | brew install meson llvm cargo install cargo-xwin build: | export XWIN_CACHE_DIR="$(pwd)/.xwin" export XWIN_ARCH=x86 export CFLAGS="-mavx2 -mpclmul" export CXXFLAGS="-mavx2 -mpclmul" export CARGO_PROFILE_RELEASE_LTO="false" export PATH="/opt/homebrew/opt/llvm/bin:$PATH" clang --version CARGO="cargo-xwin" yarn workspace @napi-rs/image build --features with_simd --target i686-pc-windows-msvc target: i686-pc-windows-msvc - host: ubuntu-latest target: x86_64-unknown-linux-gnu docker: ghcr.io/napi-rs/napi-rs/nodejs-rust:lts-debian build: >- set -e && apt-get update && apt-get install meson -y && rm /usr/lib/llvm-18/lib/libc++.so && export LDFLAGS="-L/usr/lib/llvm-18/lib -L/usr/x86_64-unknown-linux-gnu/lib/gcc/x86_64-unknown-linux-gnu/4.8.5" && export CFLAGS="-fuse-ld=lld -B/usr/aarch64-unknown-linux-gnu/lib/gcc/aarch64-unknown-linux-gnu/4.8.5 --sysroot=/usr/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/sysroot" && export CXXFLAGS="-stdlib=libc++ -fuse-ld=lld -B/usr/aarch64-unknown-linux-gnu/lib/gcc/aarch64-unknown-linux-gnu/4.8.5 --sysroot=/usr/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/sysroot -L/usr/lib/llvm-15/lib" && yarn workspace @napi-rs/image build --features with_simd --target x86_64-unknown-linux-gnu && chmod -R 777 target - host: ubuntu-latest target: x86_64-unknown-linux-musl docker: ghcr.io/napi-rs/napi-rs/nodejs-rust:lts-alpine build: >- set -e && unset RUSTFLAGS && unset CC && unset CXX && apk add --update --repository http://dl-cdn.alpinelinux.org/alpine/edge/testing --no-cache perl nasm aom-dev meson && export LIB_AOM_STATIC_LIB_PATH=/usr/lib && export LIB_AOM_INCLUDE_PATH=/usr/include/aom/aom && export LIB_AOM_PKG_CONFIG_PATH=/usr/lib/pkgconfig && yarn workspace @napi-rs/image build --target x86_64-unknown-linux-musl --features with_simd && chmod -R 777 target - host: macos-latest target: aarch64-apple-darwin setup: | brew install meson llvm build: | export PATH="/usr/local/opt/llvm/bin:$PATH" export MACOSX_DEPLOYMENT_TARGET='11.0' export CMAKE_BUILD_PARALLEL_LEVEL=2 export CC=clang export CXX=clang++ export CARGO_TARGET_AARCH64_APPLE_DARWIN_LINKER="clang" clang --version yarn workspace @napi-rs/image build --target aarch64-apple-darwin --features with_simd -- -vvv - host: ubuntu-latest target: aarch64-unknown-linux-gnu docker: ghcr.io/napi-rs/napi-rs/nodejs-rust:lts-debian-aarch64 build: >- set -e && rm /usr/aarch64-unknown-linux-gnu/lib/llvm-18/lib/libunwind.so && rm /usr/aarch64-unknown-linux-gnu/lib/llvm-18/lib/libc++.so && export LDFLAGS="-L/usr/aarch64-unknown-linux-gnu/lib/gcc/aarch64-unknown-linux-gnu/4.8.5" && export CFLAGS="-fuse-ld=lld -mcrc -B/usr/aarch64-unknown-linux-gnu/lib/gcc/aarch64-unknown-linux-gnu/4.8.5 --sysroot=/usr/aarch64-unknown-linux-gnu/aarch64-unknown-linux-gnu/sysroot" && export CXXFLAGS="-fuse-ld=lld -mcrc -B/usr/aarch64-unknown-linux-gnu/lib/gcc/aarch64-unknown-linux-gnu/4.8.5 --sysroot=/usr/aarch64-unknown-linux-gnu/aarch64-unknown-linux-gnu/sysroot -L/usr/aarch64-unknown-linux-gnu/lib/llvm-18/lib -stdlib=libc++" && yarn workspace @napi-rs/image build --features with_simd --target aarch64-unknown-linux-gnu && chmod -R 777 target - host: ubuntu-latest target: armv7-unknown-linux-gnueabihf setup: | sudo apt-get update sudo apt-get install meson gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf build: CC="arm-linux-gnueabihf-gcc" yarn workspace @napi-rs/image build --target armv7-unknown-linux-gnueabihf --features oxipng_libdeflater --use-napi-cross - host: ubuntu-latest target: aarch64-linux-android build: | sudo apt update sudo apt install meson -y export LDFLAGS="--target=aarch64-linux-android24" yarn workspace @napi-rs/image build --target aarch64-linux-android --features with_simd - host: ubuntu-latest target: aarch64-unknown-linux-musl docker: ghcr.io/napi-rs/napi-rs/nodejs-rust:lts-alpine build: >- set -e && unset RUSTFLAGS && unset CC && unset CXX && apk add --update --repository http://dl-cdn.alpinelinux.org/alpine/edge/testing --no-cache aom-dev perl meson && yarn workspace @napi-rs/image build --target aarch64-unknown-linux-musl --features with_simd && chmod -R 777 target - host: macos-14 target: wasm32-wasi-preview1-threads setup: | wget https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-21/wasi-sdk-21.0-macos.tar.gz tar -xvf wasi-sdk-21.0-macos.tar.gz build: | export WASI_SDK_PATH="$(pwd)/wasi-sdk-21.0" export CMAKE_BUILD_PARALLEL_LEVEL=2 yarn workspace @napi-rs/image build --target wasm32-wasi-preview1-threads name: stable - ${{ matrix.settings.target }} - node@20 runs-on: ${{ matrix.settings.host }} env: RUST_TARGET: ${{ matrix.settings.target }} steps: - uses: actions/checkout@v4 - name: Setup node uses: actions/setup-node@v4 with: node-version: 20 cache: yarn - name: Setup nasm uses: ilammy/setup-nasm@v1 if: matrix.settings.target == 'x86_64-pc-windows-msvc' || matrix.settings.target == 'x86_64-apple-darwin' || matrix.settings.target == 'i686-pc-windows-msvc' - name: Install uses: dtolnay/rust-toolchain@stable with: toolchain: stable targets: ${{ matrix.settings.target }} - name: Cache cargo registry uses: actions/cache@v4 with: path: | ~/.cargo/registry/index/ ~/.cargo/registry/cache/ ~/.cargo/git/db/ .cargo-cache .xwin ~/.napi-rs target/ key: ${{ matrix.settings.target }}-cargo-cache - uses: goto-bus-stop/setup-zig@v2 if: ${{ contains(matrix.settings.target, 'musl') }} with: version: 0.11.0 - 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/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: ${{ 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: | packages/*/*.node packages/*/*.wasm if-no-files-found: error build-freebsd: runs-on: macos-13 name: Build FreeBSD steps: - uses: actions/checkout@v4 - name: Build id: build uses: cross-platform-actions/action@v0.24.0 env: DEBUG: 'napi:*' RUSTUP_HOME: /home/runner/rustup CARGO_HOME: /home/runner/cargo RUSTUP_IO_THREADS: 1 with: operating_system: freebsd version: '13.2' memory: 8G cpu_count: 3 environment_variables: 'DEBUG RUSTUP_IO_THREADS' shell: bash run: | env | sort sudo pkg install -y -f curl node libnghttp2 npm cmake nasm perl5 sudo npm install -g yarn --ignore-scripts curl https://sh.rustup.rs -sSf --output rustup.sh sh rustup.sh -y --default-toolchain stable source "$HOME/.cargo/env" echo "~~~~ rustc --version ~~~~" rustc --version echo "~~~~ node -v ~~~~" node -v echo "~~~~ yarn --version ~~~~" yarn --version pwd ls -lah whoami env freebsd-version yarn install --immutable --mode=skip-build yarn workspace @napi-rs/image build --features oxipng_libdeflater rm -rf node_modules rm -rf target rm -rf .yarn - name: Upload artifact uses: actions/upload-artifact@v4 with: name: bindings-freebsd path: packages/*/*.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 - host: macos-14 target: x86_64-apple-darwin - host: macos-14 target: aarch64-apple-darwin node: - '18' - '20' runs-on: ${{ matrix.settings.host }} steps: - uses: actions/checkout@v4 - name: Setup node uses: actions/setup-node@v4 if: startsWith(matrix.settings.target, 'x86_64') with: node-version: ${{ matrix.node }} cache: 'yarn' architecture: 'x64' - name: Setup node uses: actions/setup-node@v4 if: startsWith(matrix.settings.target, 'aarch64') with: node-version: ${{ matrix.node }} cache: 'yarn' architecture: 'arm64' - name: Install dependencies run: yarn install --immutable - name: Download artifacts uses: actions/download-artifact@v4 with: name: bindings-${{ matrix.settings.target }} path: artifacts - name: Move artifacts run: yarn artifacts shell: bash - name: List packages run: ls -R . shell: bash - name: Test bindings if: startsWith(matrix.settings.target, 'aarch64') run: | yarn test yarn electron electron.js - name: Test bindings if: startsWith(matrix.settings.target, 'x86_64') 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 --immutable - name: Download artifacts uses: actions/download-artifact@v4 with: name: bindings-x86_64-unknown-linux-gnu path: artifacts - name: Move artifacts run: yarn artifacts shell: bash - name: List packages run: ls -R . shell: bash - name: Test bindings run: docker run --rm -v $(pwd):/build -w /build 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 install --immutable --mode=skip-build - name: Download artifacts uses: actions/download-artifact@v4 with: name: bindings-x86_64-unknown-linux-musl path: artifacts - name: Move artifacts run: yarn artifacts shell: bash - name: List packages run: ls -R . shell: bash - name: Test bindings run: docker run --rm -v $(pwd):/build -w /build 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: - '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: artifacts - name: Install dependencies run: yarn install --immutable --mode=skip-build - name: Move artifacts run: yarn artifacts shell: bash - name: List packages run: ls -R packages shell: bash - 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:${{ matrix.node }}-slim options: '--platform linux/arm64 -v ${{ github.workspace }}:/build -w /build' run: 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: artifacts - name: Install dependencies run: yarn install --immutable --mode=skip-build - name: Move artifacts run: yarn artifacts shell: bash - name: List packages run: ls -R packages shell: bash - 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: node:${{ matrix.node }}-bullseye-slim options: '--platform linux/arm/v7 -v ${{ github.workspace }}:/build -w /build' run: yarn test test-wasi-on-nodejs: name: Test wasi on Node.js runs-on: macos-14 needs: - build steps: - uses: actions/checkout@v4 - name: Download artifacts uses: actions/download-artifact@v4 with: name: bindings-wasm32-wasi-preview1-threads path: artifacts - name: Install dependencies run: yarn install --immutable --mode=skip-build - name: Move artifacts run: yarn artifacts shell: bash - name: List packages run: ls -R packages shell: bash - name: Run tests run: yarn test -s env: NAPI_RS_FORCE_WASI: '1' publish: name: Publish runs-on: ubuntu-latest needs: - build-freebsd - test-macOS-windows-binding - test-linux-x64-gnu-binding - test-linux-x64-musl-binding - test-linux-aarch64-gnu-binding - test-linux-arm-gnueabihf-binding - test-wasi-on-nodejs 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 --immutable --mode=skip-build - name: Download all artifacts uses: actions/download-artifact@v4 with: path: artifacts - name: Move artifacts run: yarn artifacts - name: List packages run: ls -R ./packages shell: bash - name: Publish if: "startsWith(github.event.head_commit.message, 'chore(release): publish')" run: | npm config set provenance true echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" >> ~/.npmrc npx lerna publish from-package --no-verify-access --yes env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} NPM_TOKEN: ${{ secrets.NPM_TOKEN }}