Skip to content

fix: Linux portability for the test harness; add local Docker repro #11

fix: Linux portability for the test harness; add local Docker repro

fix: Linux portability for the test harness; add local Docker repro #11

Workflow file for this run

name: CI
on:
push:
branches: [main]
tags-ignore: ['**']
pull_request:
schedule:
- cron: '23 3 * * *'
workflow_dispatch:
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
env:
PINNED_STOOLAP_VERSION: v0.4.0
MARIADB_VERSION: '11.4'
jobs:
format:
name: clang-format
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install clang-format
# Pin to clang-format-18 (Ubuntu 24.04's default `clang-format`).
# Different major versions disagree on edge cases (notably
# multi-line macro backslash alignment), so the format gate
# needs a fixed target. Local devs: install clang-format-18
# via apt, brew install llvm@18, or `docker run ubuntu:24.04`.
run: |
sudo apt-get update
sudo apt-get install -y clang-format-18
- name: Check formatting
run: clang-format-18 --dry-run --Werror src/*.{cc,h}
# ----------------------------------------------------------------------
# Build libstoolap.{so,dylib} once per OS/version; share via artifact so
# plugin build / test jobs don't need a Rust toolchain.
# ----------------------------------------------------------------------
build-lib:
name: Build libstoolap (${{ matrix.version_label }}, ${{ matrix.target }})
needs: format
strategy:
fail-fast: false
# Until upstream cuts a release that contains every FFI symbol the
# plugin uses (currently `stoolap_stmt_exec_batch` is in `main`
# only; the latest release v0.4.0 doesn't have it), the `pinned`
# row would fail to build. Run only `main` for now; restore the
# `pinned` row by adding back a v0.4.1+ entry once upstream ships
# one. Tracked in docs/upstream/stoolap_ffi_issue.md.
matrix:
include:
- os: ubuntu-latest
target: x86_64-unknown-linux-gnu
lib: libstoolap.so
stoolap_version: main
version_label: main
- os: macos-latest
target: aarch64-apple-darwin
lib: libstoolap.dylib
stoolap_version: main
version_label: main
runs-on: ${{ matrix.os }}
steps:
- name: Clone stoolap engine
run: git clone --depth 1 --branch ${{ matrix.stoolap_version }} https://github.com/stoolap/stoolap.git stoolap-engine
- name: Install Rust
uses: dtolnay/rust-toolchain@stable
- name: Cache Rust build
uses: actions/cache@v4
with:
path: |
stoolap-engine/target
~/.cargo/registry
key: rust-${{ matrix.target }}-${{ matrix.stoolap_version }}-${{ github.sha }}
restore-keys: |
rust-${{ matrix.target }}-${{ matrix.stoolap_version }}-
- name: Build libstoolap
working-directory: stoolap-engine
run: cargo build --release --features ffi
- name: Upload library + header
uses: actions/upload-artifact@v4
with:
name: stoolap-${{ matrix.version_label }}-${{ matrix.target }}
path: |
stoolap-engine/target/release/${{ matrix.lib }}
stoolap-engine/include/stoolap.h
if-no-files-found: error
test-macos:
name: Test on macOS (${{ matrix.version_label }}, MariaDB 11.4)
needs: build-lib
runs-on: macos-latest
strategy:
fail-fast: false
matrix:
include:
- version_label: main
steps:
- uses: actions/checkout@v4
- name: Install MariaDB ${{ env.MARIADB_VERSION }}
run: |
brew install mariadb@${{ env.MARIADB_VERSION }} cmake
MARIADB_PREFIX="$(brew --prefix)/opt/mariadb@${{ env.MARIADB_VERSION }}"
echo "MARIADB_PREFIX=$MARIADB_PREFIX" >> $GITHUB_ENV
echo "$MARIADB_PREFIX/bin" >> $GITHUB_PATH
- name: Download libstoolap
uses: actions/download-artifact@v4
with:
name: stoolap-${{ matrix.version_label }}-aarch64-apple-darwin
path: stoolap-staging
- name: Stage stoolap (CMakeLists layout)
run: |
mkdir -p stoolap-fake/include stoolap-fake/target/release
cp stoolap-staging/include/stoolap.h stoolap-fake/include/
cp stoolap-staging/target/release/libstoolap.dylib stoolap-fake/target/release/
# Rewrite the dylib's LC_ID_DYLIB to @rpath/libstoolap.dylib
# BEFORE building the plugin so the linker bakes that path
# into the plugin's LC_LOAD_DYLIB. Otherwise the plugin
# records the dylib's absolute build-time path, and dyld
# tries to load it from there at INSTALL PLUGIN time on
# any other host. Re-sign because install_name_tool
# invalidates the codesign blob; macOS 14+ refuses unsigned
# dylibs at dlopen.
install_name_tool -id @rpath/libstoolap.dylib \
stoolap-fake/target/release/libstoolap.dylib
codesign --remove-signature \
stoolap-fake/target/release/libstoolap.dylib || true
codesign --sign - stoolap-fake/target/release/libstoolap.dylib
- name: Build plugin
run: |
cmake -S . -B build \
-DMariaDB_ROOT=$MARIADB_PREFIX \
-DSTOOLAP_DIR=$PWD/stoolap-fake
cmake --build build -j
- name: Install plugin
run: |
# The plugin's INSTALL_RPATH includes @loader_path, so the
# dylib must sit next to the .so in the plugin dir for dyld
# to resolve the @rpath/libstoolap.dylib reference baked
# into the plugin at link time (see the staging step above).
install -m 0755 build/ha_stoolap.so $MARIADB_PREFIX/lib/plugin/
install -m 0755 stoolap-fake/target/release/libstoolap.dylib \
$MARIADB_PREFIX/lib/plugin/
- name: Install Python deps
run: python3 -m pip install --break-system-packages --user mysql-connector-python
- name: Run tests
run: python3 tests/runner.py
- name: Upload server log on failure
if: failure()
uses: actions/upload-artifact@v4
with:
name: macos-${{ matrix.version_label }}-mariadbd-err
path: /tmp/stoolap-test.err
if-no-files-found: ignore
test-linux:
name: Test on Ubuntu (${{ matrix.version_label }}, MariaDB 11.4)
needs: build-lib
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
include:
- version_label: main
steps:
- uses: actions/checkout@v4
- name: Install MariaDB ${{ env.MARIADB_VERSION }} + dev headers
run: |
curl -LsS https://r.mariadb.com/downloads/mariadb_repo_setup \
| sudo bash -s -- --mariadb-server-version=$MARIADB_VERSION --skip-maxscale --skip-tools
sudo apt-get update
sudo apt-get install -y mariadb-server libmariadbd-dev cmake g++ python3-pip
sudo systemctl stop mariadb || true
sudo systemctl disable mariadb || true
echo "MARIADB_PREFIX=/usr" >> $GITHUB_ENV
echo "MARIADBD_BIN=/usr/sbin/mariadbd" >> $GITHUB_ENV
echo "MARIADB_BIN=/usr/bin/mariadb" >> $GITHUB_ENV
echo "MARIADB_INSTALL_DB_BIN=/usr/bin/mariadb-install-db" >> $GITHUB_ENV
if [ -d /usr/lib/mysql/plugin ]; then
echo "MARIADB_PLUGIN_DIR=/usr/lib/mysql/plugin" >> $GITHUB_ENV
else
echo "MARIADB_PLUGIN_DIR=/usr/lib/mariadb/plugin" >> $GITHUB_ENV
fi
- name: Download libstoolap
uses: actions/download-artifact@v4
with:
name: stoolap-${{ matrix.version_label }}-x86_64-unknown-linux-gnu
path: stoolap-staging
- name: Install libstoolap + stage CMakeLists layout
run: |
sudo install -m 0755 stoolap-staging/target/release/libstoolap.so /usr/local/lib/
sudo ldconfig
mkdir -p stoolap-fake/include stoolap-fake/target/release
cp stoolap-staging/include/stoolap.h stoolap-fake/include/
cp stoolap-staging/target/release/libstoolap.so stoolap-fake/target/release/
- name: Build plugin
run: |
cmake -S . -B build \
-DMariaDB_ROOT=$MARIADB_PREFIX \
-DSTOOLAP_DIR=$PWD/stoolap-fake
cmake --build build -j$(nproc)
- name: Install plugin
run: sudo install -m 0755 build/ha_stoolap.so $MARIADB_PLUGIN_DIR/
- name: Install Python deps
run: pip install --user mysql-connector-python
- name: Run tests
run: python3 tests/runner.py
- name: Upload server log on failure
if: failure()
uses: actions/upload-artifact@v4
with:
name: linux-${{ matrix.version_label }}-mariadbd-err
path: /tmp/stoolap-test.err
if-no-files-found: ignore