432 lines
9.7 KiB
Markdown
432 lines
9.7 KiB
Markdown
# 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:
|
|
|
|
```bash
|
|
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
|
|
|
|
```bash
|
|
# 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
|
|
|
|
```bash
|
|
# 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
|
|
|
|
```bash
|
|
# 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
|
|
|
|
```bash
|
|
# 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
|
|
|
|
```bash
|
|
# 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
|
|
|
|
```bash
|
|
# 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
|
|
|
|
```bash
|
|
# 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
|
|
|
|
```bash
|
|
# 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
|
|
|
|
```bash
|
|
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
|
|
|
|
```bash
|
|
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
|
|
```bash
|
|
# 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
|
|
```bash
|
|
# 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
|
|
```bash
|
|
# 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
|
|
```bash
|
|
# 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
|
|
```bash
|
|
# 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:
|
|
|
|
```bash
|
|
# 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:
|
|
```bash
|
|
chmod +x cleanup-all.sh
|
|
./cleanup-all.sh manual-1234567890 # Use your BUILD_ID
|
|
```
|