Skip to content

Parallelism & Portability #107

Parallelism & Portability

Parallelism & Portability #107

name: Test JavaScript
on:
pull_request:
branches: ["main", "main-*"]
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
permissions:
contents: read
jobs:
test_nodejs:
name: Test Node.js
runs-on: ubuntu-24.04
env:
CC: gcc-14
CXX: g++-14
steps:
- name: Checkout
uses: actions/checkout@v6
- name: Print Machine Specs
shell: bash
run: |
echo "::group::Machine Information"
uname -a || true
cat /proc/cpuinfo 2>/dev/null | head -30 || sysctl -a machdep.cpu 2>/dev/null | head -30 || wmic cpu get Name,NumberOfCores,MaxClockSpeed 2>/dev/null || true
free -h 2>/dev/null || vm_stat 2>/dev/null || systeminfo 2>/dev/null | head -20 || true
echo "::endgroup::"
- name: Update Compilers
uses: nick-fields/retry@v4
with:
max_attempts: 3
retry_wait_seconds: 10
timeout_minutes: 180
command: |
sudo apt update
sudo apt install -y cmake build-essential libjemalloc-dev libomp-dev
- name: Set Up Node.js
uses: actions/setup-node@v6
with:
node-version: 22
- name: Build and Test
run: |
npm install --ignore-scripts
node probes/probe.js
npx node-gyp rebuild
npm run build-js
npm test
test_wasm_emscripten:
name: Test WASM via Emscripten
runs-on: ubuntu-24.04
steps:
- name: Checkout
uses: actions/checkout@v6
- name: Print Machine Specs
shell: bash
run: |
echo "::group::Machine Information"
uname -a || true
cat /proc/cpuinfo 2>/dev/null | head -30 || sysctl -a machdep.cpu 2>/dev/null | head -30 || wmic cpu get Name,NumberOfCores,MaxClockSpeed 2>/dev/null || true
free -h 2>/dev/null || vm_stat 2>/dev/null || systeminfo 2>/dev/null | head -20 || true
echo "::endgroup::"
- name: Install Emscripten
uses: nick-fields/retry@v4
with:
max_attempts: 3
retry_wait_seconds: 15
timeout_minutes: 180
command: |
rm -rf ~/emsdk
git clone --depth 1 https://github.com/emscripten-core/emsdk.git ~/emsdk
(cd ~/emsdk && ./emsdk install latest && ./emsdk activate latest)
- name: Build WASM
run: |
source ~/emsdk/emsdk_env.sh
cmake -B build-wasm -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-wasm.cmake -DNK_BUILD_SHARED=ON
cmake --build build-wasm
- name: Set Up Node.js
uses: actions/setup-node@v6
with:
node-version: 22
- name: Build JavaScript Bindings
run: |
npm install --ignore-scripts
npm run build-js
- name: Test Emscripten Runtime
run: NK_RUNTIME=emscripten node --test test/test-wasm.mjs
test_wasm_emscripten64:
name: Test WASM64 via Emscripten (memory64)
runs-on: ubuntu-24.04
steps:
- name: Checkout
uses: actions/checkout@v6
- name: Print Machine Specs
shell: bash
run: |
echo "::group::Machine Information"
uname -a || true
cat /proc/cpuinfo 2>/dev/null | head -30 || sysctl -a machdep.cpu 2>/dev/null | head -30 || wmic cpu get Name,NumberOfCores,MaxClockSpeed 2>/dev/null || true
free -h 2>/dev/null || vm_stat 2>/dev/null || systeminfo 2>/dev/null | head -20 || true
echo "::endgroup::"
- name: Install Emscripten
uses: nick-fields/retry@v4
with:
max_attempts: 3
retry_wait_seconds: 15
timeout_minutes: 180
command: |
rm -rf ~/emsdk
git clone --depth 1 https://github.com/emscripten-core/emsdk.git ~/emsdk
(cd ~/emsdk && ./emsdk install latest && ./emsdk activate latest)
- name: Build WASM64
run: |
source ~/emsdk/emsdk_env.sh
cmake -B build-wasm64 -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-wasm64.cmake -DNK_BUILD_SHARED=ON
cmake --build build-wasm64
- name: Set Up Node.js
uses: actions/setup-node@v6
with:
node-version: 24
- name: Build JavaScript Bindings
run: |
npm install --ignore-scripts
npm run build-js
- name: Test Emscripten64 Runtime
run: NK_RUNTIME=emscripten64 node --test test/test-wasm.mjs
test_wasm_wasi:
name: Test WASM via WASI Node.js
runs-on: ubuntu-24.04
steps:
- name: Checkout
uses: actions/checkout@v6
- name: Print Machine Specs
shell: bash
run: |
echo "::group::Machine Information"
uname -a || true
cat /proc/cpuinfo 2>/dev/null | head -30 || sysctl -a machdep.cpu 2>/dev/null | head -30 || wmic cpu get Name,NumberOfCores,MaxClockSpeed 2>/dev/null || true
free -h 2>/dev/null || vm_stat 2>/dev/null || systeminfo 2>/dev/null | head -20 || true
echo "::endgroup::"
- name: Install WASI-SDK
uses: nick-fields/retry@v4
with:
max_attempts: 3
retry_wait_seconds: 15
timeout_minutes: 180
command: |
wget -q https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-24/wasi-sdk-24.0-x86_64-linux.tar.gz
tar xzf wasi-sdk-24.0-x86_64-linux.tar.gz -C ~
mv ~/wasi-sdk-* ~/wasi-sdk
- name: Build WASI
run: |
export WASI_SDK_PATH=~/wasi-sdk
cmake -B build-wasi -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-wasi.cmake -DNK_BUILD_TEST=ON -DNK_WASI_HOSTED=ON
cmake --build build-wasi
- name: Set Up Node.js
uses: actions/setup-node@v6
with:
node-version: 22
- name: Test WASI Runtime
run: NK_RUNTIME=wasi-node node --test test/test-wasm.mjs
test_wasm_browser:
name: Test WASM via Browser
runs-on: ubuntu-24.04
steps:
- name: Checkout
uses: actions/checkout@v6
- name: Print Machine Specs
shell: bash
run: |
echo "::group::Machine Information"
uname -a || true
cat /proc/cpuinfo 2>/dev/null | head -30 || sysctl -a machdep.cpu 2>/dev/null | head -30 || wmic cpu get Name,NumberOfCores,MaxClockSpeed 2>/dev/null || true
free -h 2>/dev/null || vm_stat 2>/dev/null || systeminfo 2>/dev/null | head -20 || true
echo "::endgroup::"
- name: Install Emscripten
uses: nick-fields/retry@v4
with:
max_attempts: 3
retry_wait_seconds: 15
timeout_minutes: 180
command: |
rm -rf ~/emsdk
git clone --depth 1 https://github.com/emscripten-core/emsdk.git ~/emsdk
(cd ~/emsdk && ./emsdk install latest && ./emsdk activate latest)
- name: Build WASM
run: |
source ~/emsdk/emsdk_env.sh
cmake -B build-wasm -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-wasm.cmake -DNK_BUILD_SHARED=ON
cmake --build build-wasm
- name: Set Up Node.js
uses: actions/setup-node@v6
with:
node-version: 22
- name: Build JavaScript Bindings
run: |
npm install --ignore-scripts
npm run build-js
- name: Build Browser Bundle
run: |
cp build-wasm/numkong.js build-wasm/numkong-emscripten.js
npx esbuild javascript/dist/esm/numkong-browser.js \
--bundle --format=esm --platform=browser --target=es2022 \
--outfile=build-wasm/numkong-bundle.js
- name: Install Playwright
uses: nick-fields/retry@v4
with:
max_attempts: 3
retry_wait_seconds: 15
timeout_minutes: 180
command: npx playwright install --with-deps chromium
- name: Test Browser runtime
run: npx playwright test --config test/playwright.config.ts
- name: Upload Test Report
if: always()
uses: actions/upload-artifact@v7
with:
name: playwright-report
path: playwright-report/
retention-days: 7
test_wasm_wasmer:
name: Test WASM via Wasmer
runs-on: ubuntu-24.04
steps:
- name: Checkout
uses: actions/checkout@v6
- name: Print Machine Specs
shell: bash
run: |
echo "::group::Machine Information"
uname -a || true
cat /proc/cpuinfo 2>/dev/null | head -30 || sysctl -a machdep.cpu 2>/dev/null | head -30 || wmic cpu get Name,NumberOfCores,MaxClockSpeed 2>/dev/null || true
free -h 2>/dev/null || vm_stat 2>/dev/null || systeminfo 2>/dev/null | head -20 || true
echo "::endgroup::"
- name: Install Rust Toolchain
uses: moonrepo/setup-rust@v1
- name: Install WASI-SDK
uses: nick-fields/retry@v4
with:
max_attempts: 3
retry_wait_seconds: 15
timeout_minutes: 180
command: |
wget -q https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-24/wasi-sdk-24.0-x86_64-linux.tar.gz
tar xzf wasi-sdk-24.0-x86_64-linux.tar.gz -C ~
mv ~/wasi-sdk-* ~/wasi-sdk
- name: Build WASI
run: |
export WASI_SDK_PATH=~/wasi-sdk
cmake -B build-wasi -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-wasi.cmake -DNK_BUILD_TEST=ON
cmake --build build-wasi
- name: Install Wasmer (HEAD for relaxed-SIMD support, not yet in stable)
uses: nick-fields/retry@v4
with:
max_attempts: 2
retry_wait_seconds: 30
timeout_minutes: 180
command: cargo install wasmer-cli --git https://github.com/wasmerio/wasmer.git --branch main --features cranelift
- name: Test Wasmer runtime
run: wasmer run --enable-simd --enable-relaxed-simd --forward-host-env ./build-wasi/nk_test.wasm
env:
NK_BUDGET_SECS: 0.1
test_wasm_wasmtime:
name: Test WASM via Wasmtime
runs-on: ubuntu-24.04
steps:
- name: Checkout
uses: actions/checkout@v6
- name: Print Machine Specs
shell: bash
run: |
echo "::group::Machine Information"
uname -a || true
cat /proc/cpuinfo 2>/dev/null | head -30 || sysctl -a machdep.cpu 2>/dev/null | head -30 || wmic cpu get Name,NumberOfCores,MaxClockSpeed 2>/dev/null || true
free -h 2>/dev/null || vm_stat 2>/dev/null || systeminfo 2>/dev/null | head -20 || true
echo "::endgroup::"
- name: Install Rust Toolchain
uses: moonrepo/setup-rust@v1
- name: Install WASI-SDK
uses: nick-fields/retry@v4
with:
max_attempts: 3
retry_wait_seconds: 15
timeout_minutes: 180
command: |
wget -q https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-24/wasi-sdk-24.0-x86_64-linux.tar.gz
tar xzf wasi-sdk-24.0-x86_64-linux.tar.gz -C ~
mv ~/wasi-sdk-* ~/wasi-sdk
- name: Build WASI
run: |
export WASI_SDK_PATH=~/wasi-sdk
cmake -B build-wasi -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-wasi.cmake -DNK_BUILD_TEST=ON
cmake --build build-wasi
- name: Test Wasmtime Runtime
run: cargo test --features wasm-runtime -- wasm_runtime
env:
NK_BUDGET_SECS: 0.1
test_deno:
name: Test Deno
runs-on: ubuntu-24.04
env:
CC: gcc-14
CXX: g++-14
steps:
- name: Checkout
uses: actions/checkout@v6
- name: Print Machine Specs
shell: bash
run: |
echo "::group::Machine Information"
uname -a || true
cat /proc/cpuinfo 2>/dev/null | head -30 || sysctl -a machdep.cpu 2>/dev/null | head -30 || wmic cpu get Name,NumberOfCores,MaxClockSpeed 2>/dev/null || true
free -h 2>/dev/null || vm_stat 2>/dev/null || systeminfo 2>/dev/null | head -20 || true
echo "::endgroup::"
- name: Update Compilers
uses: nick-fields/retry@v4
with:
max_attempts: 3
retry_wait_seconds: 10
timeout_minutes: 180
command: |
sudo apt update
sudo apt install -y cmake build-essential libjemalloc-dev libomp-dev
- name: Set Up Node.js
uses: actions/setup-node@v6
with:
node-version: 22
- name: Build and Test with Node
run: |
npm install --ignore-scripts
node probes/probe.js
npx node-gyp rebuild
npm run build-js
npm test
- name: Set Up Deno
uses: denoland/setup-deno@v2
with:
deno-version: v2.x
- name: Test with Deno
run: deno test -A --no-check
test_bun:
name: Test Bun
runs-on: ubuntu-24.04
env:
CC: gcc-14
CXX: g++-14
steps:
- name: Checkout
uses: actions/checkout@v6
- name: Print Machine Specs
shell: bash
run: |
echo "::group::Machine Information"
uname -a || true
cat /proc/cpuinfo 2>/dev/null | head -30 || true
free -h 2>/dev/null || true
echo "::endgroup::"
- name: Update Compilers
uses: nick-fields/retry@v4
with:
max_attempts: 3
retry_wait_seconds: 10
timeout_minutes: 180
command: |
sudo apt update
sudo apt install -y cmake build-essential libjemalloc-dev libomp-dev
- name: Set Up Node.js
uses: actions/setup-node@v6
with:
node-version: 22
- name: Build Prebuilds and JS
run: |
npm install --ignore-scripts
node probes/probe.js
npx node-gyp rebuild
npm run build-js
- name: Test with Node
run: npm test
- name: Set Up Bun
uses: oven-sh/setup-bun@v2
- name: Test with Bun
run: bun test ./test/test.mjs