Skip to content

refactor: [#107] simplify error handling with From trait for Progress… #516

refactor: [#107] simplify error handling with From trait for Progress…

refactor: [#107] simplify error handling with From trait for Progress… #516

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