chore(release): make a release verifiable, and pin what builds it (epic #701, phase 5) #650
Workflow file for this run
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Distro Test Matrix | |
| on: | |
| push: | |
| branches: [ main, master ] | |
| paths: | |
| - 'install.sh' | |
| - 'scripts/**' | |
| - 'pyproject.toml' | |
| - 'src/vocalinux/version.py' | |
| - '.github/workflows/distro-test-matrix.yml' | |
| pull_request: | |
| branches: [ main, master ] | |
| paths: | |
| - 'install.sh' | |
| - 'scripts/**' | |
| - 'pyproject.toml' | |
| - 'src/vocalinux/version.py' | |
| - '.github/workflows/distro-test-matrix.yml' | |
| workflow_dispatch: | |
| jobs: | |
| test: | |
| name: Test on ${{ matrix.container }} | |
| runs-on: ubuntu-latest | |
| continue-on-error: true | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| container: | |
| - ubuntu:24.04 | |
| - ubuntu:26.04 | |
| - debian:12 | |
| - fedora:39 | |
| container: | |
| image: ${{ matrix.container }} | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@fbc6f3992d24b796d5a048ff273f7fcc4a7b6c09 # v5 | |
| - 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:24.04 - Full support expected" | |
| echo " ✓ ubuntu:26.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" |