6.9 KiB
GitHub Actions Workflow for Testing debi.sh
Overview
This workflow tests the Debian Network Reinstall Script (debi.sh) using KVM virtualization in GitHub Actions. It validates that the script correctly prepares a system for Debian installation, performs the actual installation, and verifies the newly installed system.
Test Matrix
The workflow uses a semantic matrix strategy to test ~15 different configurations across:
- Debian Versions: 10 (Buster), 11 (Bullseye), 12 (Bookworm)
- Mirrors: Default, USTC (China), Cloudflare
- Network Interface Naming: Standard (
ethx) or predictable names - User Account:
rootordebian - Network Console: Always enabled for remote installation monitoring
Key combinations tested:
- Debian 10 with default mirror (baseline)
- Debian 11 with all mirrors and both naming schemes
- Debian 12 with all mirrors and various user configurations
Base Image: All tests use Debian 11 (Bullseye) cloud image as the starting point, regardless of target version.
How It Works
1. Environment Setup
- Enables KVM support on GitHub Actions runner
- Caches APT packages for faster subsequent runs
- Installs QEMU and related tools (qemu-kvm, cloud-utils, sshpass, etc.)
2. Base Image Caching
- Downloads Debian 11 cloud image (only once, then cached)
- Reuses cached image across all matrix jobs
- Significantly speeds up workflow execution
3. VM Preparation
- Creates a copy-on-write disk image from the cached base image
- Generates cloud-init configuration for initial VM setup
- Configures root SSH access with password
rootpass123
4. VM Execution
- Starts QEMU VM with KVM acceleration
- Waits for SSH to become available
- Uploads
debi.shscript to the VM
5. Script Testing
- Builds arguments dynamically from matrix parameters:
--versionfrommatrix.version--ustcor--cloudflarefrommatrix.mirror--ethxfrommatrix.ethx--network-console(always enabled)--userand--passwordfrommatrix.user
- Executes
debi.shwith built arguments - Captures output for debugging
6. Installation Validation
The workflow validates that the script:
- Successfully downloads Debian installer components to
/boot/debian-*/ - Creates the required
linuxandinitrd.gzfiles - Updates GRUB configuration with Debian Installer entry
- Sets GRUB default to boot into the installer
7. Full Installation Test
After validation, the workflow:
- Reboots the VM to start the Debian installer
- Waits for the installation to complete (up to 30 minutes)
- Polls for SSH availability with the new password (
newpass123) - Verifies the newly installed system
7. Success Criteria
A test passes if:
- ✓ Script executes without critical errors
- ✓ Installer files exist in
/boot/debian-*/ - ✓ GRUB configuration contains "Debian Installer" entry
- ✓ VM successfully reboots into installer
- ✓ Installation completes automatically
- ✓ New system boots and is accessible via SSH with new credentials
Running the Tests
Automatic Execution
Tests run automatically on:
- Push to
masterormainbranch - Pull requests targeting
masterormain
Manual Execution
You can manually trigger the workflow:
- Go to Actions tab in GitHub
- Select "Test Debian Installation Script"
- Click "Run workflow"
Test Artifacts
Each test run uploads:
debi-output.log- Complete output from script executionserial.log- VM serial console log
Access artifacts from the workflow run summary page.
Interpreting Results
✅ Success
- All validation checks pass
- New system is accessible with new credentials
- Green checkmark in GitHub Actions UI
❌ Failure
Common failure scenarios and debugging:
-
SSH connection timeout (old credentials)
- Check serial console log
- Verify cloud-init configuration
-
Installer files not downloaded
- Review debi-output.log
- Check network connectivity
- Verify mirror availability
-
GRUB update failed
- Check for GRUB installation issues
- Verify disk partitioning
-
Installation timeout
- Installation may take longer than expected
- Check serial console for installer progress
- Verify network connectivity to mirrors
-
Cannot connect with new credentials
- Installation may have failed
- Check serial console for installation errors
- Verify preseed configuration
Password Strategy
The workflow uses two different passwords to verify installation success:
| Phase | User | Password | Purpose |
|---|---|---|---|
| Initial VM (cloud-init) | root | rootpass123 |
Access the base system to run debi.sh |
| New System (installed) | root/debian | newpass123 |
Verify the new system was installed |
If SSH connects with newpass123, it proves the new Debian system was installed successfully.
Limitations
This workflow tests the complete installation process:
- ✓ Script argument parsing
- ✓ Installer file downloads
- ✓ GRUB configuration updates
- ✓ Reboot into installer
- ✓ Unattended installation
- ✓ New system verification
Note: Full installation takes 10-30 minutes per test case.
Performance Optimization
The workflow includes several optimizations:
- APT Package Caching: Dependencies are cached across workflow runs
- Base Image Caching: Debian 11 cloud image is downloaded once and reused
- Single Base Image: All tests use Debian 11 as starting point (smaller cache footprint)
- Matrix Exclusions: Intelligent filtering reduces redundant test combinations
Adding New Test Cases
The workflow uses a semantic matrix. To modify test coverage:
Add a new Debian version:
matrix:
version: [10, 11, 12, 13] # Add 13
Test with a new mirror:
matrix:
mirror: ['default', 'ustc', 'cloudflare', 'tuna'] # Add tuna
Modify exclusions:
exclude:
# Add exclusions to prevent unwanted combinations
- version: 13
mirror: 'ustc' # Skip USTC for Debian 13
The workflow automatically builds command-line arguments from matrix parameters.
Troubleshooting
KVM not available
If KVM is not available, the workflow will fail. GitHub Actions runners support KVM, but some self-hosted runners may not.
Network timeouts
If downloads fail, consider:
- Adding retry logic
- Using alternative mirrors
- Checking GitHub Actions network restrictions
VM boot failures
Check the serial console log artifact for kernel messages and boot errors.
Installation hangs
If the installation takes too long:
- Check the serial console for progress
- Verify mirror connectivity
- Consider using a faster mirror (USTC, Cloudflare)
Cache issues
To clear caches and force fresh downloads:
- Go to Actions tab → Caches
- Delete relevant cache entries
- Re-run the workflow
Cache keys are based on workflow file hash, so modifying the workflow automatically invalidates caches.