chore: update benchmark framework and result (#939) #2106
This file contains 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: 'skia' | |
MACOSX_DEPLOYMENT_TARGET: '10.13' | |
permissions: | |
contents: write | |
id-token: write | |
on: | |
push: | |
branches: | |
- main | |
tags-ignore: | |
- '**' | |
pull_request: | |
concurrency: | |
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.sha }} | |
cancel-in-progress: ${{ github.ref_name != 'main' }} | |
jobs: | |
lint: | |
name: Lint SourceCode | |
runs-on: ubuntu-latest | |
container: | |
image: ghcr.io/brooooooklyn/canvas/ubuntu-builder:jammy | |
steps: | |
- uses: actions/checkout@v4 | |
with: | |
submodules: true | |
- name: Setup node | |
uses: actions/setup-node@v4 | |
with: | |
node-version: 20 | |
cache: 'yarn' | |
- name: Install | |
uses: ./.github/actions/setup-rust | |
with: | |
targets: x86_64-apple-darwin | |
components: clippy, rustfmt | |
- name: Install dependencies | |
run: yarn install --immutable --mode=skip-build | |
- name: Download skia binary | |
run: | | |
git config --global --add safe.directory $(pwd) | |
node ./scripts/release-skia-binary.mjs --download | |
- name: 'Lint JS/TS' | |
run: yarn 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' | |
setup: brew install nasm | |
build: | | |
rustc --print target-cpus | |
clang --version | |
yarn build --target x86_64-apple-darwin | |
downloadTarget: '' | |
- host: windows-latest | |
setup: | | |
choco upgrade llvm | |
build: yarn build --target x86_64-pc-windows-msvc | |
target: 'x86_64-pc-windows-msvc' | |
downloadTarget: '' | |
- host: ubuntu-latest | |
target: 'x86_64-unknown-linux-gnu' | |
downloadTarget: '' | |
docker: ghcr.io/brooooooklyn/canvas/ubuntu-builder:jammy | |
build: yarn build --target x86_64-unknown-linux-gnu | |
- host: ubuntu-latest | |
downloadTarget: 'x86_64-unknown-linux-musl' | |
target: 'x86_64-unknown-linux-musl' | |
docker: ghcr.io/brooooooklyn/canvas/musl-builder:lts | |
build: >- | |
set -e && | |
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 build --target x86_64-unknown-linux-musl | |
- host: macos-latest | |
downloadTarget: 'aarch64-apple-darwin' | |
target: 'aarch64-apple-darwin' | |
build: | | |
export MACOSX_DEPLOYMENT_TARGET='11.0' | |
clang --version | |
yarn build --target aarch64-apple-darwin | |
- host: ubuntu-latest | |
downloadTarget: 'aarch64-unknown-linux-gnu' | |
target: 'aarch64-unknown-linux-gnu' | |
docker: ghcr.io/brooooooklyn/canvas/ubuntu-builder:jammy-aarch64 | |
build: >- | |
set -e && | |
rustup target add aarch64-unknown-linux-gnu && | |
yarn build --target aarch64-unknown-linux-gnu | |
- host: ubuntu-latest | |
target: 'aarch64-unknown-linux-musl' | |
downloadTarget: 'aarch64-unknown-linux-musl' | |
docker: ghcr.io/brooooooklyn/canvas/musl-builder:lts | |
build: >- | |
set -e && | |
rustup target add aarch64-unknown-linux-musl && | |
unset RUSTFLAGS && | |
export LIB_AOM_PKG_CONFIG_PATH=/usr/aarch64-alpine-linux-musl/aom/lib/pkgconfig/aom.pc && | |
export LIB_AOM_INCLUDE_PATH=/usr/aarch64-alpine-linux-musl/aom/include && | |
export LIB_AOM_STATIC_LIB_PATH=/usr/aarch64-alpine-linux-musl/aom/lib && | |
yarn build --target aarch64-unknown-linux-musl | |
- host: ubuntu-latest | |
target: 'armv7-unknown-linux-gnueabihf' | |
downloadTarget: 'armv7-unknown-linux-gnueabihf' | |
setup: | | |
sudo apt-get update | |
sudo apt-get install gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf libatomic1-armhf-cross -y | |
docker run --rm --privileged multiarch/qemu-user-static --reset -p yes | |
docker buildx build --load --platform linux/arm/v7 -t ubuntu:jammy-armv7 . -f jammy-armv7.Dockerfile | |
docker run --rm -dt --name ubuntu-jammy-armv7 ubuntu:jammy-armv7 | |
sudo mkdir -p /usr/arm-linux-gnueabihf/lib/llvm-18 | |
sudo docker cp ubuntu-jammy-armv7:/usr/lib/llvm-18/lib /usr/arm-linux-gnueabihf/lib/llvm-18/lib | |
sudo docker cp ubuntu-jammy-armv7:/usr/lib/llvm-18/include /usr/arm-linux-gnueabihf/lib/llvm-18/include | |
docker stop ubuntu-jammy-armv7 | |
build: yarn build --target armv7-unknown-linux-gnueabihf --zig --zig-link-only --zig-abi-suffix=2.18 | |
- host: ubuntu-latest | |
target: 'aarch64-linux-android' | |
downloadTarget: 'aarch64-linux-android' | |
build: | | |
export CLANG_VERSION=`ls ${ANDROID_NDK_LATEST_HOME}/toolchains/llvm/prebuilt/linux-x86_64/lib/clang | sed 's/ *$//g'` | |
touch "${ANDROID_NDK_LATEST_HOME}/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/${CLANG_VERSION}/lib/linux/aarch64/libgcc.a" | |
chmod 777 "${ANDROID_NDK_LATEST_HOME}/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/${CLANG_VERSION}/lib/linux/aarch64/libgcc.a" | |
echo "INPUT(-lunwind)" > "${ANDROID_NDK_LATEST_HOME}/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/${CLANG_VERSION}/lib/linux/aarch64/libgcc.a" | |
export LDFLAGS="-fuse-ld=lld" | |
export CC=aarch64-linux-android24-clang | |
export CXX=aarch64-linux-android24-clang++ | |
export CMAKE_TOOLCHAIN_FILE_aarch64_linux_android="$(pwd)/cmake/android-determine.cmake" | |
yarn build --target aarch64-linux-android | |
name: stable - ${{ matrix.settings.target }} - node@20 | |
runs-on: ${{ matrix.settings.host }} | |
steps: | |
- uses: actions/checkout@v4 | |
with: | |
submodules: true | |
- name: Setup node | |
uses: actions/setup-node@v4 | |
with: | |
node-version: 20 | |
cache: 'yarn' | |
- name: Set up QEMU | |
if: ${{ matrix.settings.target == 'armv7-unknown-linux-gnueabihf' }} | |
uses: docker/setup-qemu-action@v3 | |
with: | |
platforms: linux/arm/v7 | |
- name: Set up Docker Buildx | |
if: ${{ matrix.settings.target == 'armv7-unknown-linux-gnueabihf' }} | |
uses: docker/setup-buildx-action@v3 | |
with: | |
platforms: linux/arm/v7 | |
- uses: goto-bus-stop/setup-zig@v2 | |
if: ${{ matrix.settings.target == 'armv7-unknown-linux-gnueabihf' }} | |
with: | |
version: 0.13.0 | |
- name: Set env | |
if: matrix.settings.host == 'windows-latest' | |
run: echo "C:\\msys64\\mingw64\\bin" >> $GITHUB_PATH | |
shell: bash | |
- name: Setup nasm | |
uses: ilammy/setup-nasm@v1 | |
if: matrix.settings.host == 'windows-latest' | |
- name: Install | |
uses: ./.github/actions/setup-rust | |
with: | |
targets: ${{ matrix.settings.target }} | |
- name: Install dependencies | |
run: yarn install --immutable --mode=skip-build | |
- name: Setup toolchain | |
run: ${{ matrix.settings.setup }} | |
if: ${{ matrix.settings.setup }} | |
- name: Download skia binary | |
run: node ./scripts/release-skia-binary.mjs --download --target=${{ matrix.settings.downloadTarget }} | |
- name: 'Build' | |
if: ${{ !matrix.settings.docker }} | |
run: ${{ matrix.settings.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: Upload artifact | |
uses: actions/upload-artifact@v4 | |
with: | |
name: bindings-${{ matrix.settings.target }} | |
path: ${{ env.APP_NAME }}.*.node | |
test-macOS-windows-binding: | |
name: Test bindings on ${{ matrix.settings.target }} - node@${{ matrix.node }} | |
needs: | |
- build | |
strategy: | |
fail-fast: false | |
matrix: | |
settings: | |
- host: macos-14 | |
target: 'x86_64-apple-darwin' | |
- host: macos-14 | |
target: 'aarch64-apple-darwin' | |
- host: windows-latest | |
target: 'x86_64-pc-windows-msvc' | |
node: ['18', '20'] | |
runs-on: ${{ matrix.settings.host }} | |
steps: | |
- uses: actions/checkout@v4 | |
with: | |
submodules: true | |
- name: Download Apple Emoji font | |
uses: robinraju/release-downloader@v1 | |
with: | |
repository: 'PoomSmart/EmojiLibrary' | |
fileName: [email protected] | |
tag: '0.15.4' | |
token: ${{ secrets.GITHUB_TOKEN }} | |
out-file-path: __test__/fonts/ | |
- 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 --mode=skip-build | |
- name: Download artifacts | |
uses: actions/download-artifact@v4 | |
with: | |
name: bindings-${{ matrix.settings.target }} | |
path: . | |
- name: Download icudtl.dat | |
if: matrix.settings.host == 'windows-latest' | |
run: node ./scripts/release-skia-binary.mjs --download-icu | |
- name: Test bindings | |
run: yarn test:ci | |
- name: Test failed | |
if: ${{ failure() }} | |
uses: actions/upload-artifact@v4 | |
with: | |
name: failure-images-${{ matrix.settings.target }}-${{ matrix.node }} | |
path: __test__/failure/** | |
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: Download Apple Emoji font | |
uses: robinraju/release-downloader@v1 | |
with: | |
repository: 'PoomSmart/EmojiLibrary' | |
tag: '0.15.4' | |
fileName: [email protected] | |
token: ${{ secrets.GITHUB_TOKEN }} | |
out-file-path: __test__/fonts/ | |
- 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-gnu | |
path: . | |
- name: List packages | |
run: ls -R . | |
shell: bash | |
- name: Test bindings | |
run: docker run --rm -v $(pwd):/canvas -w /canvas node:${{ matrix.node }}-slim yarn test:ci | |
- name: Test failed | |
if: ${{ failure() }} | |
uses: actions/upload-artifact@v4 | |
with: | |
name: failure-images-x86_64-unknown-linux-gnu-${{ matrix.node }} | |
path: __test__/failure/** | |
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: Download Apple Emoji font | |
uses: robinraju/release-downloader@v1 | |
with: | |
repository: 'PoomSmart/EmojiLibrary' | |
fileName: [email protected] | |
tag: '0.15.4' | |
token: ${{ secrets.GITHUB_TOKEN }} | |
out-file-path: __test__/fonts/ | |
- 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 --immutable --mode=skip-build | |
- 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):/canvas -w /canvas node:${{ matrix.node }}-alpine yarn test:ci | |
- name: Test failed | |
if: ${{ failure() }} | |
uses: actions/upload-artifact@v4 | |
with: | |
name: failure-images-x86_64-unknown-linux-musl-${{ matrix.node }} | |
path: __test__/failure/** | |
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', '21'] | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v4 | |
- name: Download Apple Emoji font | |
uses: robinraju/release-downloader@v1 | |
with: | |
repository: 'PoomSmart/EmojiLibrary' | |
tag: '0.15.4' | |
fileName: [email protected] | |
token: ${{ secrets.GITHUB_TOKEN }} | |
out-file-path: __test__/fonts/ | |
- 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 --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: Setup and run tests | |
uses: addnab/docker-run-action@v3 | |
with: | |
image: node:${{ matrix.node }}-slim | |
options: '--platform linux/arm64 -v ${{ github.workspace }}:/skia -w /skia' | |
run: | | |
set -e && \ | |
yarn test:ci && \ | |
ls -la | |
- name: Test failed | |
if: ${{ failure() }} | |
uses: actions/upload-artifact@v4 | |
with: | |
name: failure-images-aarch64-unknown-linux-gnu-${{ matrix.node }} | |
path: __test__/failure/** | |
test-linux-aarch64-musl-binding: | |
name: Test bindings on aarch64-unknown-linux-musl - node@lts | |
needs: | |
- build | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v4 | |
- name: Download Apple Emoji font | |
uses: robinraju/release-downloader@v1 | |
with: | |
repository: 'PoomSmart/EmojiLibrary' | |
tag: '0.15.4' | |
fileName: [email protected] | |
token: ${{ secrets.GITHUB_TOKEN }} | |
out-file-path: __test__/fonts/ | |
- 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 --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: Setup and run tests | |
uses: addnab/docker-run-action@v3 | |
with: | |
image: node:lts-alpine | |
options: '--platform linux/arm64 -v ${{ github.workspace }}:/skia -w /skia' | |
run: | | |
set -e | |
yarn test:ci | |
- name: Test failed | |
if: ${{ failure() }} | |
uses: actions/upload-artifact@v4 | |
with: | |
name: failure-images-aarch64-unknown-linux-musl-lts | |
path: __test__/failure/** | |
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 Apple Emoji font | |
uses: robinraju/release-downloader@v1 | |
with: | |
repository: 'PoomSmart/EmojiLibrary' | |
tag: '0.15.4' | |
fileName: [email protected] | |
token: ${{ secrets.GITHUB_TOKEN }} | |
out-file-path: __test__/fonts/ | |
- 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 --immutable --mode=skip-build | |
- 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 }}:/skia -w /skia' | |
run: | | |
set -e && \ | |
yarn test:ci && \ | |
ls -la | |
- name: Test failed | |
if: ${{ failure() }} | |
uses: actions/upload-artifact@v4 | |
with: | |
name: failure-images-armv7-unknown-linux-gnueabihf-${{ matrix.node }} | |
path: __test__/failure/** | |
rust-test: | |
name: stable - macOS - cargo - test | |
runs-on: macos-14 | |
steps: | |
- uses: actions/checkout@v4 | |
with: | |
submodules: true | |
- name: Install | |
uses: ./.github/actions/setup-rust | |
with: | |
targets: x86_64-apple-darwin | |
- name: Install dependencies | |
run: yarn install --immutable --mode=skip-build | |
- name: Install nasm | |
run: brew install nasm llvm | |
- name: Download skia binary | |
run: node ./scripts/release-skia-binary.mjs --download | |
- name: Test | |
run: | | |
clang --version | |
cargo test -- --nocapture | |
bench: | |
name: Bench | |
runs-on: ubuntu-latest | |
container: | |
image: ghcr.io/brooooooklyn/canvas/ubuntu-builder:jammy | |
steps: | |
- uses: actions/checkout@v4 | |
with: | |
submodules: true | |
- name: Setup node | |
uses: actions/setup-node@v4 | |
with: | |
node-version: 20 | |
cache: 'yarn' | |
- name: Install | |
uses: ./.github/actions/setup-rust | |
with: | |
targets: x86_64-unknown-linux-gnu | |
- name: Install dependencies | |
run: yarn install --immutable | |
- name: Download skia binary | |
run: | | |
git config --global --add safe.directory $(pwd) | |
node ./scripts/release-skia-binary.mjs --download | |
- name: 'Build' | |
run: yarn build | |
- name: 'Run benchmark' | |
run: yarn bench | |
publish: | |
name: Publish | |
runs-on: ubuntu-latest | |
needs: | |
- 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 | |
- test-macOS-windows-binding | |
steps: | |
- uses: actions/checkout@v4 | |
with: | |
submodules: true | |
- 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: Download ICU for Windows | |
run: node ./scripts/release-skia-binary.mjs --download-icu | |
- name: List packages | |
run: ls -R ./npm | |
shell: bash | |
- name: Publish | |
run: | | |
npm config set provenance true | |
if git log -1 --pretty=%B | grep "^[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 "^[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 }} |