#!/bin/bash # ============================================================================ # Docker-based eBPF Kernel Compatibility Test # Tests eBPF code on different Ubuntu versions (targeting different kernels) # # Usage: ./docker-kernel-test.sh # Example: ./docker-kernel-test.sh ubuntu:20.04 5.4 focal # ============================================================================ set -euo pipefail # Disable MSYS path conversion for Docker commands export MSYS_NO_PATHCONV=1 export MSYS2_ARG_CONV_EXCL="*" BASE_IMAGE="${1:-ubuntu:22.04}" KERNEL_VERSION="${2:-5.15}" DISTRO_NAME="${3:-jammy}" # Get repo root if [[ "$OSTYPE" == "msys" ]] || [[ "$OSTYPE" == "cygwin" ]] || [[ -n "${WINDIR:-}" ]]; then SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd -W 2>/dev/null || pwd)" REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd -W 2>/dev/null || pwd)" REPO_ROOT="${REPO_ROOT//\\//}" else SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" REPO_ROOT="$(cd "${SCRIPT_DIR}/../.." && pwd)" fi OUTPUT_DIR="${REPO_ROOT}/out" echo "==============================================" echo "eBPF Kernel Compatibility Test" echo "==============================================" echo "Base image: ${BASE_IMAGE}" echo "Target kernel: ${KERNEL_VERSION}" echo "Distro: ${DISTRO_NAME}" echo "Repo root: ${REPO_ROOT}" echo "" mkdir -p "${OUTPUT_DIR}" 2>/dev/null || true IMAGE_TAG="stellaops-ebpf-test:${DISTRO_NAME}" # Check if image already exists if ! docker image inspect "${IMAGE_TAG}" >/dev/null 2>&1; then echo "Building test container image..." # Use heredoc with docker build docker build -t "${IMAGE_TAG}" --build-arg BASE_IMAGE="${BASE_IMAGE}" - <<'DOCKERFILE' ARG BASE_IMAGE=ubuntu:22.04 FROM ${BASE_IMAGE} ENV DEBIAN_FRONTEND=noninteractive ENV DOTNET_NOLOGO=1 ENV DOTNET_CLI_TELEMETRY_OPTOUT=1 ENV DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=1 ENV TZ=UTC RUN apt-get update && apt-get install -y \ curl wget ca-certificates apt-transport-https \ libc6 libicu-dev libssl-dev zlib1g \ && rm -rf /var/lib/apt/lists/* RUN wget https://dot.net/v1/dotnet-install.sh -O dotnet-install.sh \ && chmod +x dotnet-install.sh \ && ./dotnet-install.sh --channel 10.0 --install-dir /usr/share/dotnet \ && ln -s /usr/share/dotnet/dotnet /usr/bin/dotnet \ && rm dotnet-install.sh WORKDIR /src DOCKERFILE echo "Image built: ${IMAGE_TAG}" else echo "Using cached image: ${IMAGE_TAG}" fi echo "" echo "Running tests in container..." docker run --rm \ -v "${REPO_ROOT}:/src" \ -v "${OUTPUT_DIR}:/out" \ -e STELLAOPS_UPDATE_FIXTURES=false \ "${IMAGE_TAG}" \ /bin/bash -c " cd /src echo '==============================================' echo 'Environment Info' echo '==============================================' uname -a cat /etc/os-release | head -3 dotnet --version echo '' echo '==============================================' echo 'Restoring packages' echo '==============================================' dotnet restore src/Signals/__Tests/StellaOps.Signals.Ebpf.Tests/StellaOps.Signals.Ebpf.Tests.csproj \ --configfile nuget.config 2>&1 | tail -5 echo '' echo '==============================================' echo 'Building' echo '==============================================' dotnet build src/Signals/__Tests/StellaOps.Signals.Ebpf.Tests/StellaOps.Signals.Ebpf.Tests.csproj \ -c Release 2>&1 | tail -8 echo '' echo '==============================================' echo 'Running Tests' echo '==============================================' dotnet test src/Signals/__Tests/StellaOps.Signals.Ebpf.Tests/StellaOps.Signals.Ebpf.Tests.csproj \ -c Release --no-build \ --logger 'trx;LogFileName=/out/ebpf-tests-${DISTRO_NAME}.trx' \ --logger 'console;verbosity=minimal' TEST_EXIT_CODE=\$? echo '' echo '==============================================' echo 'Test Results' echo '==============================================' if [ \$TEST_EXIT_CODE -eq 0 ]; then echo 'Kernel ${KERNEL_VERSION} (${DISTRO_NAME}): ALL TESTS PASSED' else echo 'Kernel ${KERNEL_VERSION} (${DISTRO_NAME}): TESTS FAILED' exit \$TEST_EXIT_CODE fi " echo "" echo "==============================================" echo "Test complete for kernel ${KERNEL_VERSION}" echo "=============================================="