refactor: [#107] simplify error handling with From trait for Progress… #516
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: E2E Provision and Destroy Tests | |
| # This workflow tests infrastructure provisioning and destruction (creating and destroying VMs/containers) | |
| # It does NOT test software configuration/installation to avoid GitHub Actions | |
| # network connectivity issues with LXD VMs. | |
| # | |
| # NOTE: This workflow uses CI-specific approaches like 'sudo chmod 666' on the LXD socket | |
| # and 'sudo' with LXD commands. These approaches are NOT recommended for local development. | |
| # For local use, follow the proper group membership approach documented in templates/tofu/lxd/README.md | |
| # | |
| # NETWORK TUNING: We use smorimoto/tune-github-hosted-runner-network to fix flaky networking | |
| # issues that cause Docker GPG key downloads to fail intermittently in GitHub Actions. | |
| # See: https://github.com/actions/runner-images/issues/1187 and https://github.com/actions/runner-images/issues/2890 | |
| on: | |
| push: | |
| pull_request: | |
| workflow_dispatch: # Allow manual triggering | |
| jobs: | |
| e2e-provision-tests: | |
| runs-on: ubuntu-latest | |
| timeout-minutes: 30 # Reduced timeout since we're not installing software | |
| steps: | |
| - name: Checkout repository | |
| uses: actions/checkout@v4 | |
| - name: Tune GitHub-hosted runner network | |
| uses: smorimoto/tune-github-hosted-runner-network@v1 | |
| - name: Setup Rust toolchain | |
| uses: dtolnay/rust-toolchain@stable | |
| with: | |
| toolchain: stable | |
| - name: Cache Rust dependencies | |
| uses: Swatinem/rust-cache@v2 | |
| - name: Install and configure LXD | |
| run: ./scripts/setup/install-lxd-ci.sh | |
| - name: Install OpenTofu | |
| run: ./scripts/setup/install-opentofu.sh | |
| - name: Verify installations | |
| run: | | |
| sudo lxc version | |
| tofu version | |
| cargo --version | |
| - name: Build E2E provision and destroy tests binary | |
| run: | | |
| cargo build --bin e2e-provision-and-destroy-tests --release | |
| - name: Run E2E provision and destroy test | |
| run: | | |
| # Run the E2E provision and destroy test with debug logging for better debugging | |
| # Use sudo -E and preserve PATH to ensure cargo is accessible | |
| echo "🚀 Starting E2E provision and destroy test at $(date)" | |
| sudo -E env "PATH=$PATH" cargo run --bin e2e-provision-and-destroy-tests | |
| echo "✅ E2E provision and destroy test completed at $(date)" | |
| env: | |
| # Preserve environment variables for the E2E test | |
| RUST_LOG: debug | |
| - name: Get test outputs (on success) | |
| if: success() | |
| run: | | |
| echo "=== Infrastructure Outputs ===" | |
| # Only check outputs if build directory still exists (it may be cleaned up by DestroyCommand) | |
| if [ -d "build/e2e-provision/tofu/lxd" ]; then | |
| cd build/e2e-provision/tofu/lxd | |
| sudo -E tofu output || echo "No outputs available" | |
| else | |
| echo "Build directory not found (likely cleaned up by DestroyCommand)" | |
| fi | |
| echo "=== Container Status ===" | |
| sudo lxc list torrust-tracker-vm-e2e-provision || echo "Container not found" | |
| # Check if the container has an IP address before proceeding | |
| sudo lxc info torrust-tracker-vm-e2e-provision || echo "Container info not available" | |
| - name: Debug information (on failure) | |
| if: failure() | |
| run: | | |
| echo "=== LXD Status ===" | |
| sudo lxc list || echo "LXC list failed" | |
| echo "=== OpenTofu State ===" | |
| if [ -d "build/e2e-provision/tofu/lxd" ]; then | |
| cd build/e2e-provision/tofu/lxd | |
| sudo -E tofu show || echo "No state to show" | |
| else | |
| echo "No OpenTofu state directory found" | |
| fi | |
| echo "=== System Resources ===" | |
| df -h | |
| free -h | |
| echo "=== Recent logs ===" | |
| sudo journalctl --since "10 minutes ago" --no-pager | tail -50 || echo "Journal logs not available" | |
| - name: Cleanup infrastructure (on failure only) | |
| if: failure() | |
| run: | | |
| echo "Test failed - attempting emergency cleanup..." | |
| # Try OpenTofu cleanup only if build directory still exists | |
| if [ -d "build/e2e-provision/tofu/lxd" ]; then | |
| echo "Found OpenTofu state directory, attempting tofu destroy..." | |
| cd build/e2e-provision/tofu/lxd | |
| sudo -E tofu destroy -auto-approve || echo "Tofu destroy failed or nothing to destroy" | |
| else | |
| echo "No OpenTofu state directory found (likely cleaned up by DestroyCommand)" | |
| fi | |
| # Always attempt LXD cleanup (no working directory dependency) | |
| echo "Attempting LXD resource cleanup..." | |
| sudo lxc delete torrust-tracker-vm-e2e-provision --force || echo "Container deletion failed or container doesn't exist" | |
| sudo lxc profile delete torrust-profile-e2e-provision || echo "Profile deletion failed or profile doesn't exist" | |
| - name: Final verification | |
| if: always() | |
| run: | | |
| echo "Verifying final cleanup..." | |
| sudo lxc list | |
| echo "=== Test Summary ===" | |
| echo "E2E provision and destroy test workflow completed" | |
| if [ "${{ job.status }}" = "success" ]; then | |
| echo "✅ All provision and destroy tests passed successfully" | |
| else | |
| echo "❌ Some provision and destroy tests failed - check logs above" | |
| fi |