name: Distro Test Matrix on: push: branches: [ main, master ] pull_request: branches: [ main, master ] workflow_dispatch: jobs: test: name: Test on ${{ matrix.container }} runs-on: ubuntu-latest continue-on-error: true strategy: fail-fast: false matrix: container: - ubuntu:22.04 - ubuntu:24.04 - debian:12 - fedora:39 container: image: ${{ matrix.container }} steps: - name: Checkout code uses: actions/checkout@v4 - name: Install basic dependencies run: | set -e # Install bash and basic tools if command -v apt-get >/dev/null 2>&1; then apt-get update apt-get install -y bash curl python3 git elif command -v dnf >/dev/null 2>&1; then # Fedora needs cache update first in container environment dnf clean all || true dnf makecache || true dnf install -y bash curl python3 git || { echo "⚠ dnf install failed, trying with --nogpgcheck..." dnf install -y --nogpgcheck bash curl python3 git } fi # ============================================================================ # TEST 1: Verify /etc/os-release exists and distro detection works # ============================================================================ - name: Test distro detection run: | echo "=== Testing Distro Detection ===" if [ -f /etc/os-release ]; then echo "/etc/os-release exists: OK" cat /etc/os-release else echo "/etc/os-release NOT found: FAIL" exit 1 fi # ============================================================================ # TEST 2: Test the distro detection logic from install.sh # ============================================================================ # Note: We cannot source install.sh directly because it has a root check # that fails in containers. Instead, we test the same logic independently. - name: Test detect_distro() function run: | echo "=== Testing detect_distro() Function ===" # Verify the function exists in install.sh if grep -q "detect_distro()" install.sh; then echo "✓ detect_distro() function found in install.sh" else echo "✗ detect_distro() function not found" exit 1 fi # Test the distro detection logic (same as in install.sh) . /etc/os-release DISTRO_NAME="$NAME" DISTRO_ID="$ID" DISTRO_VERSION="$VERSION_ID" DISTRO_FAMILY="unknown" if [[ "$ID" == "ubuntu" || "$ID_LIKE" == *"ubuntu"* || "$ID" == "pop" || "$ID" == "linuxmint" || "$ID" == "elementary" || "$ID" == "zorin" ]]; then DISTRO_FAMILY="ubuntu" elif [[ "$ID" == "debian" || "$ID_LIKE" == *"debian"* ]]; then DISTRO_FAMILY="debian" elif [[ "$ID" == "fedora" || "$ID_LIKE" == *"fedora"* || "$ID" == "rhel" || "$ID" == "centos" || "$ID" == "rocky" || "$ID" == "almalinux" ]]; then DISTRO_FAMILY="fedora" elif [[ "$ID" == "arch" || "$ID_LIKE" == *"arch"* || "$ID" == "manjaro" || "$ID" == "endeavouros" ]]; then DISTRO_FAMILY="arch" elif [[ "$ID" == "opensuse" || "$ID_LIKE" == *"suse"* ]]; then DISTRO_FAMILY="suse" elif [[ "$ID" == "gentoo" ]]; then DISTRO_FAMILY="gentoo" elif [[ "$ID" == "alpine" ]]; then DISTRO_FAMILY="alpine" elif [[ "$ID" == "void" ]]; then DISTRO_FAMILY="void" elif [[ "$ID" == "solus" ]]; then DISTRO_FAMILY="solus" elif [[ "$ID" == "mageia" ]]; then DISTRO_FAMILY="mageia" fi echo "Detected: $DISTRO_NAME $DISTRO_VERSION ($DISTRO_FAMILY family)" echo "DISTRO_FAMILY=$DISTRO_FAMILY" echo "DISTRO_ID=$DISTRO_ID" # Verify we detected a known family if [[ "$DISTRO_FAMILY" == "unknown" ]]; then echo "⚠ Warning: Distro family is 'unknown', this may indicate incomplete detection" else echo "✓ Distro detection successful" fi # ============================================================================ # TEST 3: Test detect_typelib_path() function # ============================================================================ - name: Test detect_typelib_path() function run: | echo "=== Testing detect_typelib_path() Function ===" # Install pkg-config first (needed for typelib detection) if command -v apt-get >/dev/null 2>&1; then apt-get install -y pkg-config libgirepository1.0-dev 2>/dev/null || true elif command -v dnf >/dev/null 2>&1; then dnf install -y pkg-config gobject-introspection-devel 2>/dev/null || true fi # Test typelib path detection bash -c ' # Function from install.sh detect_typelib_path() { # Try pkg-config first (most reliable) if command -v pkg-config >/dev/null 2>&1; then local path=$(pkg-config --variable=typelibdir gobject-introspection-1.0 2>/dev/null) if [ -n "$path" ] && [ -d "$path" ]; then echo "$path" return 0 fi fi # Fallback to common distribution-specific paths for path in \ /usr/lib/x86_64-linux-gnu/girepository-1.0 \ /usr/lib/aarch64-linux-gnu/girepository-1.0 \ /usr/lib/arm-linux-gnueabihf/girepository-1.0 \ /usr/lib/riscv64-linux-gnu/girepository-1.0 \ /usr/lib/powerpc64le-linux-gnu/girepository-1.0 \ /usr/lib/s390x-linux-gnu/girepository-1.0 \ /usr/lib64/girepository-1.0 \ /usr/lib/girepository-1.0 \ /usr/local/lib/girepository-1.0 \ /usr/local/lib64/girepository-1.0; do if [ -d "$path" ]; then echo "$path" return 0 fi done # Ultimate fallback echo "/usr/lib/girepository-1.0" return 1 } TYPOB_PATH=$(detect_typelib_path) echo "Detected typelib path: $TYPOB_PATH" if [ -d "$TYPOB_PATH" ]; then echo "✓ Typelib path exists: $TYPOB_PATH" ls -la "$TYPOB_PATH" | head -5 || true else echo "⚠ Typelib path does not exist: $TYPOB_PATH (may be OK if pkg-config not available)" fi ' # ============================================================================ # TEST 4: Check install.sh syntax # ============================================================================ - name: Check install.sh syntax run: | echo "=== Checking install.sh Syntax ===" bash -n install.sh echo "✓ install.sh: Syntax OK" # ============================================================================ # TEST 5: Run the dependency checker # ============================================================================ - name: Run dependency checker run: | echo "=== Running Dependency Checker ===" bash scripts/check-system-deps.sh || echo "⚠ Some dependencies missing (expected in container)" continue-on-error: true # ============================================================================ # TEST 6: Test installer help command # ============================================================================ - name: Test installer --help run: | echo "=== Testing Installer --help ===" bash install.sh --help || true # ============================================================================ # TEST 7: Test minimal install (venv setup only) # ============================================================================ - name: Test minimal installer (dry-run venv setup) run: | echo "=== Testing Minimal Installer (venv setup) ===" # Install minimal dependencies needed for venv creation if command -v apt-get >/dev/null 2>&1; then apt-get update -qq apt-get install -y python3-venv python3-pip python3-dev 2>/dev/null || true elif command -v dnf >/dev/null 2>&1; then dnf install -y python3-virtualenv python3-pip python3-devel 2>/dev/null || true fi # Create a temporary venv to test the flow python3 -m venv /tmp/test-venv || { echo "⚠ Could not create venv (may need additional system deps)" exit 0 } echo "✓ Virtual environment created successfully" ls -la /tmp/test-venv/bin/ rm -rf /tmp/test-venv # ============================================================================ # TEST 8: Test Python import paths # ============================================================================ - name: Test Python import paths run: | echo "=== Testing Python Import Paths ===" python3 -c "import sys; sys.path.insert(0, 'src'); print('Python path configured')" python3 --version echo "✓ Python is available" # ============================================================================ # SUMMARY: Aggregate results from all container tests # ============================================================================ summary: name: Test Summary runs-on: ubuntu-latest needs: test if: always() steps: - name: Check test results run: | echo "====================================" echo "Distro Test Matrix Results" echo "====================================" echo "" echo "All container tests have completed." echo "Check individual job logs for details." echo "" echo "Expected behavior:" echo " ✓ ubuntu:22.04 - Full support expected" echo " ✓ ubuntu:24.04 - Full support expected" echo " ✓ debian:12 - Full support expected" echo " ⚠ fedora:39 - Good support, minor differences expected" echo "" echo "Key tests performed:" echo " 1. /etc/os-release availability" echo " 2. Distro detection function" echo " 3. Typelib path detection" echo " 4. install.sh syntax validation" echo " 5. Dependency checker" echo " 6. Installer --help command" echo " 7. Virtual environment creation" echo " 8. Python availability"