Files
resf-testing-repo/docs/manual-steps.md
Stephen Simpson bb829c9b63 updates
2025-11-26 08:15:00 -06:00

9.7 KiB

Manual Test Run - Step by Step

This guide provides the exact commands Jenkins runs, so you can execute them manually for testing.

Quick Start - Automated Script

I've created an interactive script that walks through all steps:

cd /Users/ssimpson/Documents/git/resf-test-jenkins

# Edit the configuration in the script first:
vim docs/manual-test-run.sh
# Update: TEST_REPO_URL, TEST_REPO_BRANCH, TEST_NAME

# Run the interactive script:
./docs/manual-test-run.sh

The script will pause at each step so you can see what's happening.


Manual Step-by-Step Commands

If you prefer to run each command manually, here's the exact sequence:

Prerequisites Check

# Verify required tools
which qemu-img virsh virt-install virt-customize sparrowdo git curl

# Verify libvirt is running
sudo systemctl status libvirtd

# Verify SSH keys exist
ls -la ~/.ssh/id_rsa ~/.ssh/id_rsa.pub

Step 1: Set Variables

# Set your configuration
export BUILD_ID="manual-$(date +%s)"
export IMAGES_DIR="/var/lib/libvirt/images"
export WORK_DIR="/Users/ssimpson/Documents/git/resf-test-jenkins/manual-test-${BUILD_ID}"
export SCRIPT_DIR="/Users/ssimpson/Documents/git/resf-test-jenkins"

# QCOW2 Image URL
export QCOW2_URL="https://download.rockylinux.org/pub/rocky/9/images/x86_64/Rocky-9-GenericCloud-Base.latest.x86_64.qcow2"

# SSH Keys
export SSH_PRIVATE_KEY="${HOME}/.ssh/id_rsa"
export SSH_PUBLIC_KEY="${HOME}/.ssh/id_rsa.pub"

# Test Configuration - EDIT THESE
export TEST_NAME="my-test"
export TEST_REPO_URL="https://github.com/your-org/your-test-repo.git"
export TEST_REPO_BRANCH="main"

# Image download behavior (set to "true" to force re-download)
export REDOWNLOAD_IMAGE="false"

echo "Configuration set for build: ${BUILD_ID}"

Step 2: Initialize Environment

# Create working directory
mkdir -p "${WORK_DIR}"
cd "${WORK_DIR}"

# Ensure images directory exists and is writable
sudo mkdir -p "${IMAGES_DIR}"
sudo chown ${USER}:${USER} "${IMAGES_DIR}"

# Verify scripts are executable
chmod +x "${SCRIPT_DIR}/scripts"/*.sh

echo "Environment initialized"

Step 3: Download Base QCOW2 Image

# Extract filename from URL for caching
export IMAGE_FILENAME=$(basename "${QCOW2_URL}")
export CACHED_IMAGE="${IMAGES_DIR}/${IMAGE_FILENAME}"
export BASE_IMAGE="${IMAGES_DIR}/base-${BUILD_ID}.qcow2"

echo "Image URL: ${QCOW2_URL}"
echo "Cached image: ${CACHED_IMAGE}"
echo "Build image: ${BASE_IMAGE}"

if [ "${REDOWNLOAD_IMAGE}" = "true" ]; then
    echo "REDOWNLOAD_IMAGE is enabled - forcing fresh download"
    curl -L --progress-bar -o "${BASE_IMAGE}" "${QCOW2_URL}"
else
    if [ -f "${CACHED_IMAGE}" ]; then
        echo "Found cached image, creating copy for this build..."
        cp "${CACHED_IMAGE}" "${BASE_IMAGE}"
    else
        echo "No cached image found, downloading..."
        curl -L --progress-bar -o "${CACHED_IMAGE}" "${QCOW2_URL}"
        echo "Creating copy for this build..."
        cp "${CACHED_IMAGE}" "${BASE_IMAGE}"
    fi
fi

# Verify the image
echo "Verifying image..."
qemu-img info "${BASE_IMAGE}" | head -10

echo "Base image ready: ${BASE_IMAGE}"

Step 4: Prepare Golden Image

# Set golden image path
export GOLDEN_IMAGE="${IMAGES_DIR}/golden-${BUILD_ID}.qcow2"

# Set prep script (you can customize this)
export PREP_SCRIPT="${SCRIPT_DIR}/docs/default-prep.sh"

echo "Creating golden image..."
echo "Base: ${BASE_IMAGE}"
echo "Golden: ${GOLDEN_IMAGE}"
echo "Prep Script: ${PREP_SCRIPT}"
echo "SSH Key: ${SSH_PUBLIC_KEY}"

# Run the setup script
"${SCRIPT_DIR}/scripts/setup_base.sh" \
    "${BASE_IMAGE}" \
    "${PREP_SCRIPT}" \
    "${GOLDEN_IMAGE}" \
    "${SSH_PUBLIC_KEY}"

echo "Golden image ready: ${GOLDEN_IMAGE}"

Step 5: Provision Test VM

# Set VM name
export VM_NAME="${TEST_NAME}-${BUILD_ID}"

echo "Provisioning VM: ${VM_NAME}"

# Provision the VM and capture its IP
export VM_IP=$("${SCRIPT_DIR}/scripts/provision_vm.sh" "${VM_NAME}" "${GOLDEN_IMAGE}" 60)

if [ "$VM_IP" = "ERROR" ] || [ -z "$VM_IP" ]; then
    echo "ERROR: Failed to provision VM"
    exit 1
fi

echo "VM provisioned successfully"
echo "VM Name: ${VM_NAME}"
echo "IP Address: ${VM_IP}"

# Wait for SSH to be ready
echo "Waiting for SSH to be ready..."
for i in {1..30}; do
    if ssh -i "${SSH_PRIVATE_KEY}" \
           -o StrictHostKeyChecking=no \
           -o ConnectTimeout=5 \
           -o UserKnownHostsFile=/dev/null \
           root@${VM_IP} 'echo "SSH ready"' 2>/dev/null; then
        echo "SSH connection established!"
        break
    fi
    echo "Attempt $i/30..."
    sleep 2
done

# Test SSH connection manually
echo "Testing SSH connection..."
ssh -i "${SSH_PRIVATE_KEY}" \
    -o StrictHostKeyChecking=no \
    -o UserKnownHostsFile=/dev/null \
    root@${VM_IP} 'hostname && cat /etc/rocky-release'

Step 6: Clone Test Repository

# Create test workspace
export TEST_WORKSPACE="${WORK_DIR}/test-workspace"
mkdir -p "${TEST_WORKSPACE}"
cd "${TEST_WORKSPACE}"

echo "Cloning test repository..."
echo "URL: ${TEST_REPO_URL}"
echo "Branch: ${TEST_REPO_BRANCH}"

# Clone the repository
git clone -b "${TEST_REPO_BRANCH}" "${TEST_REPO_URL}" test-repo

# Find the sparrowfile
export SPARROWFILE=$(find test-repo -name sparrowfile -type f | head -1)

if [ -z "$SPARROWFILE" ]; then
    echo "ERROR: No sparrowfile found in repository"
    exit 1
fi

echo "Found sparrowfile: ${SPARROWFILE}"

# Show sparrowfile contents
echo "Sparrowfile contents:"
cat "${SPARROWFILE}"

Step 7: Run Sparrowdo Test

# Create logs directory
mkdir -p "${TEST_WORKSPACE}/logs"

echo "=========================================="
echo "Running Sparrowdo Test"
echo "=========================================="
echo "Target: root@${VM_IP}"
echo "Sparrowfile: ${SPARROWFILE}"
echo "Log: ${TEST_WORKSPACE}/logs/test.log"
echo ""

# Run the test
timeout 900 sparrowdo \
    --host="${VM_IP}" \
    --ssh_user=root \
    --ssh_private_key="${SSH_PRIVATE_KEY}" \
    --ssh_args="-o StrictHostKeyChecking=no -o ConnectTimeout=10 -o UserKnownHostsFile=/dev/null" \
    --no_sudo \
    --sparrowfile="${SPARROWFILE}" 2>&1 | tee "${TEST_WORKSPACE}/logs/test.log"

echo ""
echo "Test completed!"
echo "Logs saved to: ${TEST_WORKSPACE}/logs/test.log"

Step 8: Cleanup

echo "=========================================="
echo "Cleanup"
echo "=========================================="

# Destroy the VM
echo "Destroying VM: ${VM_NAME}"
"${SCRIPT_DIR}/scripts/cleanup_vm.sh" "${VM_NAME}"

# Optional: Remove temporary images
echo ""
echo "Temporary images:"
echo "  Base: ${BASE_IMAGE}"
echo "  Golden: ${GOLDEN_IMAGE}"
echo ""
read -p "Remove temporary images? (y/n): " -n 1 -r
echo

if [[ $REPLY =~ ^[Yy]$ ]]; then
    echo "Removing images..."
    sudo rm -f "${BASE_IMAGE}"
    sudo rm -f "${GOLDEN_IMAGE}"
    echo "Images removed"
else
    echo "Images preserved at:"
    echo "  ${BASE_IMAGE}"
    echo "  ${GOLDEN_IMAGE}"
fi

Step 9: View Results

echo "=========================================="
echo "Test Run Summary"
echo "=========================================="
echo "Build ID: ${BUILD_ID}"
echo "Test Name: ${TEST_NAME}"
echo "VM Name: ${VM_NAME}"
echo "Working Directory: ${WORK_DIR}"
echo "Test Logs: ${TEST_WORKSPACE}/logs/test.log"
echo ""

# View the test log
echo "=== Test Log ==="
cat "${TEST_WORKSPACE}/logs/test.log"

Troubleshooting During Manual Run

VM Won't Start

# Check libvirt status
sudo systemctl status libvirtd

# List all VMs
virsh list --all

# Check VM details
virsh dominfo "${VM_NAME}"

# View VM console
virsh console "${VM_NAME}"  # Ctrl+] to exit

Can't Get IP Address

# Check network
virsh net-list --all
virsh net-info default

# View DHCP leases
virsh net-dhcp-leases default

# Try alternative IP detection
virsh domifaddr "${VM_NAME}" --source lease
virsh domifaddr "${VM_NAME}" --source agent
virsh domifaddr "${VM_NAME}" --source arp

SSH Connection Fails

# Test SSH manually with verbose output
ssh -vvv -i "${SSH_PRIVATE_KEY}" \
    -o StrictHostKeyChecking=no \
    -o UserKnownHostsFile=/dev/null \
    root@${VM_IP}

# Check if SSH key was injected
sudo virt-cat -a "${GOLDEN_IMAGE}" /root/.ssh/authorized_keys

# Check VM network from inside
virsh console "${VM_NAME}"
# Then inside VM:
# ip addr
# systemctl status sshd
# firewall-cmd --list-all

Sparrowdo Fails

# Test connectivity first
ssh -i "${SSH_PRIVATE_KEY}" \
    -o StrictHostKeyChecking=no \
    root@${VM_IP} 'which perl && perl --version'

# Run sparrowdo with debug output
sparrowdo \
    --host="${VM_IP}" \
    --ssh_user=root \
    --ssh_private_key="${SSH_PRIVATE_KEY}" \
    --verbose \
    --sparrowfile="${SPARROWFILE}"

Clean Up Failed VMs

# List all VMs
virsh list --all

# Force cleanup
for vm in $(virsh list --all --name | grep "${BUILD_ID}"); do
    virsh destroy "$vm" 2>/dev/null || true
    virsh undefine "$vm" 2>/dev/null || true
    sudo rm -f "/var/lib/libvirt/images/${vm}.qcow2"
done

Quick Cleanup Script

If something goes wrong and you need to clean up everything:

# Save this as cleanup-all.sh
#!/bin/bash

BUILD_ID="${1:-manual}"

echo "Cleaning up build: ${BUILD_ID}"

# Stop and remove VMs
for vm in $(virsh list --all --name | grep "${BUILD_ID}"); do
    echo "Removing VM: $vm"
    virsh destroy "$vm" 2>/dev/null || true
    virsh undefine "$vm" 2>/dev/null || true
    sudo rm -f "/var/lib/libvirt/images/${vm}.qcow2"
done

# Remove images
sudo rm -f "/var/lib/libvirt/images/base-${BUILD_ID}.qcow2"
sudo rm -f "/var/lib/libvirt/images/golden-${BUILD_ID}.qcow2"

# Remove working directory
rm -rf "/Users/ssimpson/Documents/git/resf-test-jenkins/manual-test-${BUILD_ID}"

echo "Cleanup complete"

Then run:

chmod +x cleanup-all.sh
./cleanup-all.sh manual-1234567890  # Use your BUILD_ID