diff --git a/.gitea/workflows/docker-build.yml b/.gitea/workflows/docker-build.yml index 7e6883a..7bcee3d 100644 --- a/.gitea/workflows/docker-build.yml +++ b/.gitea/workflows/docker-build.yml @@ -18,7 +18,30 @@ env: UBUNTU_VERSION: ${{ vars.UBUNTU_VERSION || '22.04' }} jobs: + test: + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Run unit tests + uses: docker/build-push-action@v6 + with: + context: . + file: ./Dockerfile + target: tester + push: false + build-args: | + CUDA_VERSION=${{ env.CUDA_VERSION }} + UBUNTU_VERSION=${{ env.UBUNTU_VERSION }} + cache-from: type=registry,ref=${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:buildcache + build-and-push: + needs: test runs-on: ubuntu-latest steps: diff --git a/Dockerfile b/Dockerfile index 6ca9dc8..61ef8dc 100644 --- a/Dockerfile +++ b/Dockerfile @@ -82,6 +82,27 @@ RUN --mount=type=cache,target=/usr/local/cargo/registry \ && cp target/release/whisper-server /usr/local/bin/whisper-server +# ╔══════════════════════════════════════════════════════════╗ +# ║ STAGE 1b — tester ║ +# ║ Runs unit tests against the release build artifacts ║ +# ║ Uses CUDA stubs so tests run without a physical GPU ║ +# ║ ║ +# ║ Usage: ║ +# ║ docker build --target tester . ║ +# ╚══════════════════════════════════════════════════════════╝ +FROM builder AS tester + +# libcuda.so.1 stub — satisfies the dynamic linker without a real driver +RUN ln -sf /usr/local/cuda/lib64/stubs/libcuda.so \ + /usr/local/cuda/lib64/stubs/libcuda.so.1 + +# Reuse the same cache mounts so no recompilation is needed +RUN --mount=type=cache,target=/usr/local/cargo/registry \ + --mount=type=cache,target=/build/target \ + LD_LIBRARY_PATH=/usr/local/cuda/lib64/stubs \ + cargo test --release + + # ╔══════════════════════════════════════════════════════════╗ # ║ STAGE 2 — runtime ║ # ║ Minimal CUDA runtime image — no build tools ║ diff --git a/run_tests.sh b/run_tests.sh new file mode 100755 index 0000000..943a7f0 --- /dev/null +++ b/run_tests.sh @@ -0,0 +1,37 @@ +#!/usr/bin/env bash +# run_tests.sh — Run the unit test suite inside Docker (no GPU required) +# +# Uses the `tester` Docker stage which: +# 1. Builds the release binary (or reuses cached build) +# 2. Symlinks the CUDA stubs so libcuda.so.1 is satisfied without a driver +# 3. Runs `cargo test --release` +# +# Usage: +# ./run_tests.sh # run all unit tests +# ./run_tests.sh models # run only tests matching "models" +# CUDA_VERSION=12.1.0 ./run_tests.sh + +set -euo pipefail + +CUDA_VERSION=${CUDA_VERSION:-12.4.1} +UBUNTU_VERSION=${UBUNTU_VERSION:-22.04} +TEST_FILTER=${1:-} + +echo "==> Building tester stage (CUDA ${CUDA_VERSION} / Ubuntu ${UBUNTU_VERSION})..." +docker build \ + --target tester \ + --build-arg CUDA_VERSION="${CUDA_VERSION}" \ + --build-arg UBUNTU_VERSION="${UBUNTU_VERSION}" \ + --tag whisper-tester:local \ + . + +if [[ -n "${TEST_FILTER}" ]]; then + echo "==> Running tests matching '${TEST_FILTER}'..." + docker run --rm \ + -e LD_LIBRARY_PATH=/usr/local/cuda/lib64/stubs \ + whisper-tester:local \ + sh -c "cd /build && ln -sf /usr/local/cuda/lib64/stubs/libcuda.so /usr/local/cuda/lib64/stubs/libcuda.so.1 && LD_LIBRARY_PATH=/usr/local/cuda/lib64/stubs cargo test --release '${TEST_FILTER}'" +else + echo "==> All tests ran during docker build (tester stage)." + echo " Build succeeded — all tests passed." +fi