Skip to content

Multiplatform Build and Test #54

Multiplatform Build and Test

Multiplatform Build and Test #54

name: Multiplatform Build and Test
env:
WERROR: 1
BUILD_TYPE: Release
GEN: Ninja
on:
workflow_dispatch:
schedule:
- cron: "0 8 * * *"
jobs:
# Generate the binary db once to test that it can be read on all platforms.
generate-binary-demo:
runs-on: kuzu-self-hosted-testing
env:
NUM_THREADS: 32
GEN: Ninja
CC: gcc
CXX: g++
steps:
- uses: actions/checkout@v4
- name: Build
run: make release
- name: Generate datasets
run: bash scripts/generate_binary_demo.sh
- name: Upload binary-demo
uses: actions/upload-artifact@v4
with:
name: binary-demo
path: dataset/binary-demo
macos-build-test:
strategy:
matrix:
runner: [ macos-14, macos-15 ]
fail-fast: false
name: ${{ matrix.runner }}
runs-on: ${{ matrix.runner }}
needs: [ generate-binary-demo ]
defaults:
run:
shell: bash
steps:
- uses: actions/checkout@v4
continue-on-error: true
- name: Download binary-demo
uses: actions/download-artifact@v4
with:
name: binary-demo
path: ${{ github.workspace }}/dataset/binary-demo
- uses: actions/setup-python@v4
continue-on-error: true
with:
python-version: "3.11"
- name: Determine NUM_THREADS
run: |
export NUM_THREADS=$(sysctl -n hw.physicalcpu)
echo "NUM_THREADS=$NUM_THREADS" >> $GITHUB_ENV
echo "TEST_JOBS=$NUM_THREADS" >> $GITHUB_ENV
echo "CARGO_BUILD_JOBS=$NUM_THREADS" >> $GITHUB_ENV
echo "NUM_THREADS=$NUM_THREADS"
- name: Test
continue-on-error: true
run: |
set +e
make test
echo "Test,$?" >> status.txt
make clean
- name: Build
continue-on-error: true
run: |
set +e
make release
echo "Build,$?" >> status.txt
- name: C and C++ examples
continue-on-error: true
run: |
set +e
make example
echo "C and C++ examples,$?" >> status.txt
- name: Python test
continue-on-error: true
run: |
set +e
make pytest-venv
echo "Python test,$?" >> status.txt
- name: Node.js test
continue-on-error: true
run: |
node --version
npm --version
set +e
make nodejstest-deps
echo "Node.js test,$?" >> status.txt
- name: Java test
continue-on-error: true
run: |
java --version
set +e
make javatest
echo "Java test,$?" >> status.txt
- name: Cleanup
continue-on-error: true
run: make clean
- name: Rust share build
continue-on-error: true
run: echo $'[workspace]\nmembers = ["tools/rust_api","examples/rust"]\nresolver = "2"' > Cargo.toml
- name: Rust test
continue-on-error: true
working-directory: tools/rust_api
run: |
cargo --version
set +e
cargo test --release --features arrow
echo "Rust test,$?" >> ../../status.txt
- name: Rust example
continue-on-error: true
working-directory: examples/rust
run: |
set +e
cargo build --release --features arrow
echo "Rust example,$?" >> ../../status.txt
- name: Rename status.txt
if: ${{ always() }}
run: |
cat status.txt
mv status.txt ${{ matrix.runner }}.csv
- uses: actions/upload-artifact@v4
if: ${{ always() }}
with:
name: ${{ matrix.runner }}
path: ${{ matrix.runner }}.csv
windows-build-test:
strategy:
matrix:
runner: [ windows-2022, windows-2025 ]
fail-fast: false
name: ${{ matrix.runner }}
needs: [ generate-binary-demo ]
runs-on: ${{ matrix.runner }}
env:
WERROR: 0
steps:
- name: Disable Windows Defender
continue-on-error: true
shell: powershell
run: |
Set-MpPreference -DisableRealtimeMonitoring $true
Set-MpPreference -DisableBehaviorMonitoring $true
Set-MpPreference -DisableBlockAtFirstSeen $true
Set-MpPreference -DisableIOAVProtection $true
Set-MpPreference -DisablePrivacyMode $true
Set-MpPreference -SignatureDisableUpdateOnStartupWithoutEngine $true
Set-MpPreference -DisableArchiveScanning $true
Set-MpPreference -DisableIntrusionPreventionSystem $true
Set-MpPreference -DisableScriptScanning $true
Set-MpPreference -SubmitSamplesConsent NeverSend
- uses: ilammy/msvc-dev-cmd@v1
continue-on-error: true
- uses: actions/checkout@v4
continue-on-error: true
- name: Download binary-demo
uses: actions/download-artifact@v4
with:
name: binary-demo
path: ${{ github.workspace }}/dataset/binary-demo
- uses: ilammy/msvc-dev-cmd@v1
continue-on-error: true
- uses: actions/setup-python@v4
continue-on-error: true
with:
python-version: "3.11"
- name: Determine NUM_THREADS
shell: powershell
run: |
$numThreads = $env:NUMBER_OF_PROCESSORS
"NUM_THREADS=$numThreads" >> $env:GITHUB_ENV
"TEST_JOBS=$numThreads" >> $env:GITHUB_ENV
"CARGO_BUILD_JOBS=$numThreads" >> $env:GITHUB_ENV
Write-Host "NUMBER_OF_PROCESSORS=$numThreads"
- name: Test
continue-on-error: true
shell: cmd
run: |
make test
echo Test,%ERRORLEVEL% >> status.txt
make clean
- name: Build
continue-on-error: true
shell: cmd
run: |
make release
echo Build,%ERRORLEVEL% >> status.txt
- name: C and C++ examples
continue-on-error: true
shell: cmd
run: |
make example
echo C and C++ examples,%ERRORLEVEL% >> status.txt
- name: Python test
continue-on-error: true
shell: cmd
run: |
make pytest-venv
echo Python test,%ERRORLEVEL% >> status.txt
- name: Node.js test
continue-on-error: true
shell: cmd
run: |
make nodejstest-deps
echo Node.js test,%ERRORLEVEL% >> status.txt
- name: Set up JDK 11
continue-on-error: true
if: ${{ matrix.runner == 'windows-2022' }}
uses: actions/setup-java@v3
with:
java-version: '11'
distribution: 'temurin'
- name: Java test
continue-on-error: true
shell: cmd
run: |
java --version
make javatest
echo Java test,%ERRORLEVEL% >> status.txt
- name: Cleanup
shell: cmd
continue-on-error: true
run: make clean
- name: Rust share build
continue-on-error: true
shell: cmd
run: (echo [workspace]& echo members = ["tools/rust_api","examples/rust"]& echo resolver = "2") > Cargo.toml
- name: Rust test
continue-on-error: true
shell: cmd
run: |
cargo --version
set OPENSSL_DIR=C:\Program Files\OpenSSL-Win64
set CXXFLAGS=/std:c++20
cargo test --release --features arrow
echo Rust test,%ERRORLEVEL% >> status.txt
- name: Rust example
continue-on-error: true
shell: cmd
run: |
set OPENSSL_DIR=C:\Program Files\OpenSSL-Win64
set CXXFLAGS=/std:c++20
cargo build --release --features arrow
echo Rust example,%ERRORLEVEL% >> status.txt
- name: Rename status.txt
if: ${{ always() }}
shell: cmd
run: |
cat status.txt
rename status.txt ${{ matrix.runner }}.csv
- uses: actions/upload-artifact@v4
if: ${{ always() }}
with:
name: ${{ matrix.runner }}
path: ${{ matrix.runner }}.csv
debian-ubuntu-build-test:
strategy:
matrix:
image: [ "ubuntu:22.04", "ubuntu:24.04", "ubuntu:25.04", "debian:12", "debian:sid" ]
fail-fast: false
name: ${{ matrix.image }}
needs: [ generate-binary-demo ]
runs-on: ubuntu-24.04
container:
image: ${{ matrix.image }}
env:
CC: gcc
CXX: g++
JAVA_HOME: /usr/lib/jvm/java-17-openjdk-amd64
steps:
- name: Setup Node.js repo
if: ${{ matrix.image != 'debian:sid' && matrix.image != 'ubuntu:25.04' }}
continue-on-error: true
run: |
apt-get update
apt-get install -y ca-certificates curl gnupg
mkdir -p /etc/apt/keyrings
curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_20.x nodistro main" | tee /etc/apt/sources.list.d/nodesource.list
- name: Install packages
continue-on-error: true
run: |
apt-get update
apt-get install -y git build-essential cmake ninja-build python3 python3-dev python3-venv openjdk-17-jdk ca-certificates curl gnupg ${{ matrix.image == 'ubuntu:22.04' && 'gcc-12 g++-12' || 'gcc g++' }} ${{ (matrix.image == 'debian:sid' || matrix.image == 'ubuntu:25.04') && 'nodejs npm' || 'nodejs' }}
- name: Setup gcc 12
if: ${{ matrix.image == 'ubuntu:22.04' }}
continue-on-error: true
run: |
update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-12 100
update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-12 100
- uses: actions/checkout@v4
continue-on-error: true
- name: Download binary-demo
uses: actions/download-artifact@v4
with:
name: binary-demo
path: ${{ github.workspace }}/dataset/binary-demo
- name: Determine NUM_THREADS
run: |
export NUM_THREADS=$(nproc)
echo "NUM_THREADS=$NUM_THREADS" >> $GITHUB_ENV
echo "TEST_JOBS=$NUM_THREADS" >> $GITHUB_ENV
echo "CARGO_BUILD_JOBS=$NUM_THREADS" >> $GITHUB_ENV
echo "NUM_THREADS=$NUM_THREADS"
- name: Test
continue-on-error: true
run: |
set +e
make test
echo "Test,$?" >> status.txt
make clean
- name: Build
continue-on-error: true
run: |
set +e
make release
echo "Build,$?" >> status.txt
- name: C and C++ examples
continue-on-error: true
run: |
set +e
make example
echo "C and C++ examples,$?" >> status.txt
- name: Python test
continue-on-error: true
run: |
set +e
make pytest-venv
echo "Python test,$?" >> status.txt
- name: Node.js test
continue-on-error: true
run: |
node --version
npm --version
set +e
make nodejstest-deps
echo "Node.js test,$?" >> status.txt
- name: Java test
continue-on-error: true
run: |
java --version
set +e
make javatest
echo "Java test,$?" >> status.txt
- name: Cleanup
continue-on-error: true
run: make clean
- name: Install Rust
continue-on-error: true
run: |
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --no-update-default-toolchain
echo "$HOME/.cargo/bin" >> $GITHUB_PATH
$HOME/.cargo/bin/rustup toolchain install 1.81
- name: Rust share build
continue-on-error: true
run: echo '[workspace]\nmembers = ["tools/rust_api","examples/rust"]\nresolver = "2"' > Cargo.toml
- name: Rust test
continue-on-error: true
working-directory: tools/rust_api
run: |
cargo --version
set +e
cargo test --release --features arrow
echo "Rust test,$?" >> ../../status.txt
- name: Rust example
continue-on-error: true
working-directory: examples/rust
run: |
set +e
cargo build --release --features arrow
echo "Rust example,$?" >> ../../status.txt
- name: Rename status.txt
if: ${{ always() }}
run: |
cat status.txt
PLATFORM=$(echo ${{ matrix.image }} | tr ':' '-')
echo "PLATFORM=$PLATFORM" >> $GITHUB_ENV
mv status.txt $PLATFORM.csv
- uses: actions/upload-artifact@v4
if: ${{ always() }}
with:
name: ${{env.PLATFORM}}
path: ${{env.PLATFORM}}.csv
rhel-fedora-build-test:
strategy:
matrix:
image: [ "rockylinux:8", "rockylinux:9", "fedora:41", "fedora:42" ]
fail-fast: false
name: ${{ matrix.image }}
needs: [ generate-binary-demo ]
runs-on: ubuntu-24.04
container:
image: ${{ matrix.image }}
env:
CC: gcc
CXX: g++
JAVA_HOME: /usr/lib/jvm/java-${{ matrix.image == 'fedora:42' && '21' || '17' }}-openjdk
HOME: /root
steps:
- name: Enable EPEL on Rocky Linux
continue-on-error: true
if: ${{ matrix.image == 'rockylinux:8' || matrix.image == 'rockylinux:9' }}
run: |
dnf update -y
dnf install -y epel-release
dnf update -y
dnf config-manager --set-enabled ${{ matrix.image == 'rockylinux:8' && 'powertools' || 'crb' }} # For ninja.
- name: Enable SHA-1 on Rocky Linux 9
continue-on-error: true
if: matrix.image == 'rockylinux:9'
run: update-crypto-policies --set LEGACY
- name: Install packages
continue-on-error: true
run: |
curl -fsSL https://rpm.nodesource.com/setup_20.x | bash -
dnf install -y git cmake ninja-build nodejs ${{ (matrix.image == 'rockylinux:8' || matrix.image == 'rockylinux:9') && 'gcc-toolset-12 python3.11 python3.11-devel' || 'gcc gcc-c++ python3-devel' }} ${{ matrix.image == 'fedora:42' && 'java-21-openjdk-devel' || 'java-17-openjdk-devel' }}
dnf clean all
- name: Enable gcc-toolset-12 and python3.11 on Rocky Linux
if: ${{ matrix.image == 'rockylinux:8' || matrix.image == 'rockylinux:9' }}
continue-on-error: true
run: |
source /opt/rh/gcc-toolset-12/enable
echo $PATH >> $GITHUB_PATH
alternatives --install /usr/bin/python3 python3 /usr/bin/python3.11 1
alternatives --set python3 /usr/bin/python3.11
echo "PYTHON_EXECUTABLE=/usr/bin/python3.11" >> $GITHUB_ENV
echo "PYBIND11_PYTHON_VERSION=3.11" >> $GITHUB_ENV
- uses: actions/checkout@v4
continue-on-error: true
- name: Download binary-demo
uses: actions/download-artifact@v4
with:
name: binary-demo
path: ${{ github.workspace }}/dataset/binary-demo
- name: Determine NUM_THREADS
run: |
export NUM_THREADS=$(nproc)
echo "NUM_THREADS=$NUM_THREADS" >> $GITHUB_ENV
echo "TEST_JOBS=$NUM_THREADS" >> $GITHUB_ENV
echo "CARGO_BUILD_JOBS=$NUM_THREADS" >> $GITHUB_ENV
echo "NUM_THREADS=$NUM_THREADS"
- name: Test
continue-on-error: true
run: |
set +e
make test
echo "Test,$?" >> status.txt
make clean
- name: Build
continue-on-error: true
run: |
set +e
make release
echo "Build,$?" >> status.txt
- name: C and C++ examples
continue-on-error: true
run: |
set +e
make example
echo "C and C++ examples,$?" >> status.txt
- name: Python test
continue-on-error: true
run: |
set +e
make pytest-venv
echo "Python test,$?" >> status.txt
- name: Node.js test
continue-on-error: true
run: |
node --version
npm --version
set +e
make nodejstest-deps
echo "Node.js test,$?" >> status.txt
- name: Java test
continue-on-error: true
run: |
java --version
set +e
make javatest
echo "Java test,$?" >> status.txt
- name: Cleanup
continue-on-error: true
run: make clean
- name: Install Rust
continue-on-error: true
run: |
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --no-update-default-toolchain
echo "$HOME/.cargo/bin" >> $GITHUB_PATH
$HOME/.cargo/bin/rustup toolchain install 1.81
- name: Rust share build
continue-on-error: true
run: echo $'[workspace]\nmembers = ["tools/rust_api","examples/rust"]\nresolver = "2"' > Cargo.toml
- name: Rust test
continue-on-error: true
working-directory: tools/rust_api
run: |
cargo --version
set +e
cargo test --release --features arrow
echo "Rust test,$?" >> ../../status.txt
- name: Rust example
continue-on-error: true
working-directory: examples/rust
run: |
set +e
cargo build --release --features arrow
echo "Rust example,$?" >> ../../status.txt
- name: Rename status.txt
if: ${{ always() }}
run: |
cat status.txt
PLATFORM=$(echo ${{ matrix.image }} | tr ':' '-')
echo "PLATFORM=$PLATFORM" >> $GITHUB_ENV
mv status.txt $PLATFORM.csv
- uses: actions/upload-artifact@v4
if: ${{ always() }}
with:
name: ${{env.PLATFORM}}
path: ${{env.PLATFORM}}.csv
archlinux-build-test:
name: archlinux
runs-on: ubuntu-24.04
needs: [ generate-binary-demo ]
container:
image: archlinux:latest
env:
CC: gcc
CXX: g++
JAVA_HOME: /usr/lib/jvm/java-17-openjdk
steps:
- name: Install packages
continue-on-error: true
run: |
pacman -Syu --noconfirm
pacman -S --needed --noconfirm git base-devel cmake ninja gcc python npm jdk17-openjdk
- uses: actions/checkout@v4
continue-on-error: true
- name: Download binary-demo
uses: actions/download-artifact@v4
with:
name: binary-demo
path: ${{ github.workspace }}/dataset/binary-demo
- name: Determine NUM_THREADS
run: |
export NUM_THREADS=$(nproc)
echo "NUM_THREADS=$NUM_THREADS" >> $GITHUB_ENV
echo "TEST_JOBS=$NUM_THREADS" >> $GITHUB_ENV
echo "CARGO_BUILD_JOBS=$NUM_THREADS" >> $GITHUB_ENV
echo "NUM_THREADS=$NUM_THREADS"
- name: Test
continue-on-error: true
run: |
set +e
make test
echo "Test,$?" >> status.txt
make clean
- name: Build
continue-on-error: true
run: |
set +e
make release
echo "Build,$?" >> status.txt
- name: C and C++ examples
continue-on-error: true
run: |
set +e
make example
echo "C and C++ examples,$?" >> status.txt
- name: Python test
continue-on-error: true
run: |
set +e
make pytest-venv
echo "Python test,$?" >> status.txt
- name: Node.js test
continue-on-error: true
run: |
set +e
make nodejstest-deps
echo "Node.js test,$?" >> status.txt
- name: Java test
continue-on-error: true
run: |
java --version
set +e
make javatest
echo "Java test,$?" >> status.txt
- name: Cleanup
continue-on-error: true
run: make clean
- name: Install Rust
continue-on-error: true
run: |
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --no-update-default-toolchain
echo "$HOME/.cargo/bin" >> $GITHUB_PATH
$HOME/.cargo/bin/rustup toolchain install stable
- name: Rust share build
continue-on-error: true
run: echo $'[workspace]\nmembers = ["tools/rust_api","examples/rust"]\nresolver = "2"' > Cargo.toml
- name: Rust test
working-directory: tools/rust_api
continue-on-error: true
run: |
cargo --version
set +e
cargo test --release --features arrow
echo "Rust test,$?" >> ../../status.txt
- name: Rust example
working-directory: examples/rust
continue-on-error: true
run: |
set +e
cargo build --release --features arrow
echo "Rust example,$?" >> ../../status.txt
- name: Rename status.txt
if: ${{ always() }}
run: |
cat status.txt
mv status.txt archlinux.csv
- uses: actions/upload-artifact@v4
if: ${{ always() }}
with:
name: archlinux
path: archlinux.csv
collect-results:
runs-on: ubuntu-22.04
env:
DISCORD_CHANNEL_ID: ${{ secrets.DISCORD_CHANNEL_ID }}
DISCORD_BOT_TOKEN: ${{ secrets.DISCORD_BOT_TOKEN }}
GITHUB_URL: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
if: ${{ always() }}
needs:
[
macos-build-test,
windows-build-test,
debian-ubuntu-build-test,
rhel-fedora-build-test,
archlinux-build-test,
]
steps:
- uses: actions/checkout@v4
- name: Download artifacts
uses: actions/download-artifact@v4
with:
path: results
- name: List artifacts
run: ls -R results
- name: Create summary
run: |
pip3 install pandas tabulate discord.py
python3 scripts/multiplatform-test-helper/collect-results.py results
python3 scripts/multiplatform-test-helper/notify-discord.py results.json
- name: Upload summary
uses: actions/upload-artifact@v4
with:
name: results
path: results.md