From 3ba25ccc98aea2904c0e90d7d11d46ba772c5e61 Mon Sep 17 00:00:00 2001 From: Adam Gutglick Date: Fri, 12 Jun 2026 10:51:34 +0100 Subject: [PATCH 1/9] Containerize the musl tests Signed-off-by: Adam Gutglick --- .github/workflows/musl.yml | 67 ++++++++++++++++---------------------- 1 file changed, 28 insertions(+), 39 deletions(-) diff --git a/.github/workflows/musl.yml b/.github/workflows/musl.yml index c2454e3a5e6..94ef9d044bc 100644 --- a/.github/workflows/musl.yml +++ b/.github/workflows/musl.yml @@ -28,52 +28,41 @@ jobs: ${{ github.repository == 'vortex-data/vortex' && format('runs-on={0}/runner=amd64-large/image=ubuntu24-full-x64-pre-v2/tag=rust-build-musl', github.run_id) || 'ubuntu-latest' }} + container: rust-alpine3.21 + env: + # -crt-static makes build-script binaries dynamically linked so bindgen + # (custom-labels, a transitive dep of vortex-io) can dlopen libclang; a + # fully static musl build script panics with "Dynamic loading not supported". + RUSTFLAGS: "-A warnings -C target-feature=-crt-static" steps: - - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6 - # Build and test natively inside Alpine so the musl C/C++ toolchain (gcc, g++) and - # GNU ld are used. Cross-compiling from the glibc host is not viable: musl-tools - # ships no musl-g++ for C++ deps such as custom-labels, and zig's linker rejects the - # --dynamic-list arg those deps emit. Checkout runs on the host because JS actions - # cannot run inside an Alpine (musl) container, so this job provisions rustup + - # nextest itself rather than using the prebuilt toolchain / sccache setup that the - # glibc test runners use. - # # Exclusions: # - CUDA crates have no CUDA toolkit / musl target (as in the wasm build). # - vortex-duckdb and its dependents can't build standalone for musl: its # build.rs has no prebuilt DuckDB for musl. The DuckDB extension builds it # against a musl DuckDB it compiles itself, so it is exercised there instead. - - name: Build & test workspace for x86_64-unknown-linux-musl + - name: Install Alpine packages + run: | + # tzdata provides /usr/share/zoneinfo; without it Alpine has no timezone + # database and datetime tests fail with "failed to find time zone `UTC`". + apk add --no-cache build-base clang clang-dev llvm-dev cmake make perl \ + pkgconf protobuf protobuf-dev openssl-dev zstd-dev bash git curl ca-certificates \ + python3 python3-dev tar tzdata + + - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6 + + - name: Install nextest + run: | + # Prebuilt static musl nextest binary; building it from source would + # roughly double the cold-cache compile time of this job. + curl -LsSf https://get.nexte.st/latest/linux-musl \ + | tar zxf - -C "$HOME/.cargo/bin" + + - name: Run workspace tests for x86_64-unknown-linux-musl run: | - docker run --rm -v "${GITHUB_WORKSPACE}:/work" -w /work alpine:3.21 sh -euc ' - # tzdata provides /usr/share/zoneinfo; without it Alpine has no timezone - # database and datetime tests fail with "failed to find time zone `UTC`". - apk add --no-cache build-base clang clang-dev llvm-dev cmake make perl \ - pkgconf protobuf protobuf-dev openssl-dev zstd-dev bash git curl ca-certificates \ - python3 python3-dev tar tzdata - # -crt-static makes build-script binaries dynamically linked so bindgen - # (custom-labels, a transitive dep of vortex-io) can dlopen libclang; a - # fully static musl build script panics with "Dynamic loading not supported". - export CARGO_HOME=/root/.cargo CARGO_TARGET_DIR=/tmp/target RUSTFLAGS="-A warnings -C target-feature=-crt-static" - export PATH="$CARGO_HOME/bin:$PATH" - curl --proto =https --tlsv1.2 -sSf https://sh.rustup.rs \ - | sh -s -- -y --profile minimal --default-toolchain none - rustup show - # Prebuilt static musl nextest binary; building it from source would - # roughly double the cold-cache compile time of this job. - curl -LsSf https://get.nexte.st/latest/linux-musl \ - | tar zxf - -C "$CARGO_HOME/bin" - # The workspace is bind-mounted from the host runner and owned by a - # different uid than the container root, so git rejects it as "dubious - # ownership" and `git rev-parse HEAD` returns empty. vortex-bench and the - # benchmarks website embed that SHA in snapshots (redacted to / - # ); an empty SHA breaks the redaction and fails 10 snapshot tests. - git config --global --add safe.directory /work - cargo nextest run --cargo-profile ci --locked --workspace --no-fail-fast \ - --exclude vortex-cuda --exclude vortex-cub --exclude vortex-nvcomp \ - --exclude gpu-scan-cli --exclude vortex-test-e2e-cuda \ - --exclude vortex-duckdb --exclude duckdb-bench --exclude vortex-sqllogictest - ' + cargo nextest run --cargo-profile ci --locked --workspace --no-fail-fast \ + --exclude vortex-cuda --exclude vortex-cub --exclude vortex-nvcomp \ + --exclude gpu-scan-cli --exclude vortex-test-e2e-cuda \ + --exclude vortex-duckdb --exclude duckdb-bench --exclude vortex-sqllogictest - name: Alert incident.io if: failure() && github.event_name == 'push' && github.ref == 'refs/heads/develop' From 658e346a6e961f0370d8f7ee4c409d46faeeea4c Mon Sep 17 00:00:00 2001 From: Adam Gutglick Date: Fri, 12 Jun 2026 10:55:49 +0100 Subject: [PATCH 2/9] follow up Signed-off-by: Adam Gutglick --- .github/workflows/musl.yml | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/.github/workflows/musl.yml b/.github/workflows/musl.yml index 94ef9d044bc..dfe8e4025d5 100644 --- a/.github/workflows/musl.yml +++ b/.github/workflows/musl.yml @@ -41,23 +41,25 @@ jobs: # build.rs has no prebuilt DuckDB for musl. The DuckDB extension builds it # against a musl DuckDB it compiles itself, so it is exercised there instead. - name: Install Alpine packages + # tzdata provides /usr/share/zoneinfo; without it Alpine has no timezone + # database and datetime tests fail with "failed to find time zone `UTC`". run: | - # tzdata provides /usr/share/zoneinfo; without it Alpine has no timezone - # database and datetime tests fail with "failed to find time zone `UTC`". apk add --no-cache build-base clang clang-dev llvm-dev cmake make perl \ - pkgconf protobuf protobuf-dev openssl-dev zstd-dev bash git curl ca-certificates \ + pkgconf protobuf protobuf-dev openssl-dev zstd-dev git curl ca-certificates \ python3 python3-dev tar tzdata - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6 - name: Install nextest + shell: bash + # Prebuilt static musl nextest binary; building it from source would + # roughly double the cold-cache compile time of this job. run: | - # Prebuilt static musl nextest binary; building it from source would - # roughly double the cold-cache compile time of this job. curl -LsSf https://get.nexte.st/latest/linux-musl \ | tar zxf - -C "$HOME/.cargo/bin" - name: Run workspace tests for x86_64-unknown-linux-musl + shell: bash run: | cargo nextest run --cargo-profile ci --locked --workspace --no-fail-fast \ --exclude vortex-cuda --exclude vortex-cub --exclude vortex-nvcomp \ From 1cb227b2ea84ac6497b80653be6bf838690e6fdb Mon Sep 17 00:00:00 2001 From: Adam Gutglick Date: Fri, 12 Jun 2026 11:08:45 +0100 Subject: [PATCH 3/9] Pull musl image from ghcr mirror Signed-off-by: Adam Gutglick --- .github/workflows/musl.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/workflows/musl.yml b/.github/workflows/musl.yml index dfe8e4025d5..4a9ffd092e4 100644 --- a/.github/workflows/musl.yml +++ b/.github/workflows/musl.yml @@ -28,7 +28,11 @@ jobs: ${{ github.repository == 'vortex-data/vortex' && format('runs-on={0}/runner=amd64-large/image=ubuntu24-full-x64-pre-v2/tag=rust-build-musl', github.run_id) || 'ubuntu-latest' }} - container: rust-alpine3.21 + container: + image: ghcr.io/rust-lang/rust:1-alpine3.21 + credentials: + username: ${{ github.repository_owner }} + password: ${{ secrets.GITHUB_TOKEN }} env: # -crt-static makes build-script binaries dynamically linked so bindgen # (custom-labels, a transitive dep of vortex-io) can dlopen libclang; a From c583e701852339b76498b4ec18e2d441894342cb Mon Sep 17 00:00:00 2001 From: Adam Gutglick Date: Fri, 12 Jun 2026 11:22:16 +0100 Subject: [PATCH 4/9] install bash Signed-off-by: Adam Gutglick --- .github/workflows/musl.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/musl.yml b/.github/workflows/musl.yml index 4a9ffd092e4..374860f7c4d 100644 --- a/.github/workflows/musl.yml +++ b/.github/workflows/musl.yml @@ -50,7 +50,7 @@ jobs: run: | apk add --no-cache build-base clang clang-dev llvm-dev cmake make perl \ pkgconf protobuf protobuf-dev openssl-dev zstd-dev git curl ca-certificates \ - python3 python3-dev tar tzdata + python3 python3-dev tar tzdata bash - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6 From 8a0ee8ac75ffa2cf4ee4292d637ed53cc009af06 Mon Sep 17 00:00:00 2001 From: Adam Gutglick Date: Fri, 12 Jun 2026 11:25:50 +0100 Subject: [PATCH 5/9] create target dir Signed-off-by: Adam Gutglick --- .github/workflows/musl.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/musl.yml b/.github/workflows/musl.yml index 374860f7c4d..0c1d4b8fa83 100644 --- a/.github/workflows/musl.yml +++ b/.github/workflows/musl.yml @@ -59,6 +59,7 @@ jobs: # Prebuilt static musl nextest binary; building it from source would # roughly double the cold-cache compile time of this job. run: | + mkdir -p "$HOME/.cargo/bin" curl -LsSf https://get.nexte.st/latest/linux-musl \ | tar zxf - -C "$HOME/.cargo/bin" From 997a443e1aaa9a200db037e06ae88f1a0f06bfd9 Mon Sep 17 00:00:00 2001 From: Adam Gutglick Date: Fri, 12 Jun 2026 11:28:24 +0100 Subject: [PATCH 6/9] use example Signed-off-by: Adam Gutglick --- .github/workflows/musl.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/musl.yml b/.github/workflows/musl.yml index 0c1d4b8fa83..b5d1d302e14 100644 --- a/.github/workflows/musl.yml +++ b/.github/workflows/musl.yml @@ -60,8 +60,7 @@ jobs: # roughly double the cold-cache compile time of this job. run: | mkdir -p "$HOME/.cargo/bin" - curl -LsSf https://get.nexte.st/latest/linux-musl \ - | tar zxf - -C "$HOME/.cargo/bin" + curl -LsSf https://get.nexte.st/latest/linux-musl | tar zxf - -C ${CARGO_HOME:-~/.cargo}/bin - name: Run workspace tests for x86_64-unknown-linux-musl shell: bash From 07045caa8fbe0e8dfe776482d527ac24e1a20053 Mon Sep 17 00:00:00 2001 From: Adam Gutglick Date: Fri, 12 Jun 2026 11:31:19 +0100 Subject: [PATCH 7/9] minimize Signed-off-by: Adam Gutglick --- .github/workflows/musl.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/musl.yml b/.github/workflows/musl.yml index b5d1d302e14..bd6529fc30c 100644 --- a/.github/workflows/musl.yml +++ b/.github/workflows/musl.yml @@ -59,7 +59,6 @@ jobs: # Prebuilt static musl nextest binary; building it from source would # roughly double the cold-cache compile time of this job. run: | - mkdir -p "$HOME/.cargo/bin" curl -LsSf https://get.nexte.st/latest/linux-musl | tar zxf - -C ${CARGO_HOME:-~/.cargo}/bin - name: Run workspace tests for x86_64-unknown-linux-musl From 83b5a87c08712c5708c52e66ca7ab00318e456d0 Mon Sep 17 00:00:00 2001 From: Adam Gutglick Date: Fri, 12 Jun 2026 11:35:12 +0100 Subject: [PATCH 8/9] Exclude even more things Signed-off-by: Adam Gutglick --- .github/workflows/musl.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/musl.yml b/.github/workflows/musl.yml index bd6529fc30c..c78d4e479f9 100644 --- a/.github/workflows/musl.yml +++ b/.github/workflows/musl.yml @@ -67,7 +67,9 @@ jobs: cargo nextest run --cargo-profile ci --locked --workspace --no-fail-fast \ --exclude vortex-cuda --exclude vortex-cub --exclude vortex-nvcomp \ --exclude gpu-scan-cli --exclude vortex-test-e2e-cuda \ - --exclude vortex-duckdb --exclude duckdb-bench --exclude vortex-sqllogictest + --exclude vortex-duckdb --exclude duckdb-bench --exclude vortex-sqllogictest \ + --exclude vortex-bench --exclude lance-bench --exclude datafusion-bench --exclude vortex-datafusion \ + --exclude compress-bench --exclude random-access-bench - name: Alert incident.io if: failure() && github.event_name == 'push' && github.ref == 'refs/heads/develop' From ee7946187e5c24ab353275eafc89ada65bf9dcc4 Mon Sep 17 00:00:00 2001 From: Adam Gutglick Date: Fri, 12 Jun 2026 12:00:49 +0100 Subject: [PATCH 9/9] no way we're running website tests in CI Signed-off-by: Adam Gutglick --- .github/workflows/musl.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/musl.yml b/.github/workflows/musl.yml index c78d4e479f9..cf8ff08eeb6 100644 --- a/.github/workflows/musl.yml +++ b/.github/workflows/musl.yml @@ -69,7 +69,7 @@ jobs: --exclude gpu-scan-cli --exclude vortex-test-e2e-cuda \ --exclude vortex-duckdb --exclude duckdb-bench --exclude vortex-sqllogictest \ --exclude vortex-bench --exclude lance-bench --exclude datafusion-bench --exclude vortex-datafusion \ - --exclude compress-bench --exclude random-access-bench + --exclude compress-bench --exclude random-access-bench --exclude vortex-bench-server - name: Alert incident.io if: failure() && github.event_name == 'push' && github.ref == 'refs/heads/develop'