feat: add deploy-to-vm script for managing virtual machine deployment

This commit is contained in:
2025-06-07 00:19:27 +02:00
parent f032c4abbd
commit bae38db78d
2 changed files with 155 additions and 0 deletions

154
scripts/deploy-to-vm Executable file
View File

@@ -0,0 +1,154 @@
#!/usr/bin/env bash
set -Euo pipefail
SCRIPT_DIR=$(dirname "$(readlink -f "$0")")
PROJECT_ROOT=$(readlink -f "$SCRIPT_DIR/..")
TARGET_DIR="/tmp/cloonar-config"
SSH_PORT=2222
SSH_HOST="localhost"
SSH_USER="root"
SSH_PASS="linux"
SSH_OPTIONS="-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null"
ARCHIVE_PATH="/tmp/cloonar-config.tar.gz"
# Parse command line options
START_VM=0
KEEP_FILES=0
VERBOSE=0
NO_REBOOT=0
while [[ $# -gt 0 ]]; do
case $1 in
--start-vm)
START_VM=1
shift
;;
--keep-files)
KEEP_FILES=1
shift
;;
--verbose)
VERBOSE=1
shift
;;
--no-reboot)
NO_REBOOT=1
shift
;;
*)
echo "Unknown option: $1"
echo "Usage: $0 [--start-vm] [--keep-files] [--verbose] [--no-reboot]"
exit 1
;;
esac
done
log() {
echo "==> $1"
}
error() {
echo "ERROR: $1" >&2
exit 1
}
verbose() {
if [[ $VERBOSE -eq 1 ]]; then
echo "$1"
fi
}
cleanup() {
if [[ $KEEP_FILES -eq 0 ]]; then
log "Cleaning up temporary files..."
rm -f "$ARCHIVE_PATH"
sshpass -p "$SSH_PASS" ssh $SSH_OPTIONS -p $SSH_PORT $SSH_USER@$SSH_HOST "rm -rf $TARGET_DIR" || true
fi
}
trap cleanup EXIT
# Check if VM is running by testing SSH connection
check_vm_running() {
sshpass -p "$SSH_PASS" ssh $SSH_OPTIONS -p $SSH_PORT $SSH_USER@$SSH_HOST "echo 2>/dev/null" >/dev/null
}
# Wait for SSH to become available
wait_for_ssh() {
local retries=60
local wait_time=2
log "Waiting for SSH connection..."
while [[ $retries -gt 0 ]]; do
if check_vm_running; then
log "SSH connection established"
return 0
fi
verbose "Waiting... ($retries attempts remaining)"
retries=$((retries - 1))
sleep $wait_time
done
return 1
}
# Check if sshpass is installed
if ! command -v sshpass >/dev/null; then
error "sshpass is required but not installed. Please install it first."
fi
# Start VM if requested or not running
if [[ $START_VM -eq 1 ]] || ! check_vm_running; then
log "Starting VM..."
"$SCRIPT_DIR/run-vm" >/dev/null 2>&1 || error "Failed to start VM"
log "VM started, waiting 10 seconds for initial boot..."
sleep 10
wait_for_ssh || error "Failed to establish SSH connection"
fi
# Create archive of project files
log "Creating project archive..."
cd "$PROJECT_ROOT"
tar czf "$ARCHIVE_PATH" \
example/ \
modules/ \
.sops.yaml \
2>/dev/null || true
if [[ ! -f "$ARCHIVE_PATH" ]]; then
error "Failed to create archive at $ARCHIVE_PATH"
fi
# Copy files to VM
log "Copying files to VM..."
sshpass -p "$SSH_PASS" ssh $SSH_OPTIONS -p $SSH_PORT $SSH_USER@$SSH_HOST "rm -rf $TARGET_DIR; mkdir -p $TARGET_DIR" || error "Failed to create target directory"
sshpass -p "$SSH_PASS" scp $SSH_OPTIONS -P $SSH_PORT "$ARCHIVE_PATH" "$SSH_USER@$SSH_HOST:$TARGET_DIR/cloonar-config.tar.gz" || error "Failed to copy archive"
# Extract files and build configuration
log "Extracting files and building configuration..."
sshpass -p "$SSH_PASS" ssh $SSH_OPTIONS -p $SSH_PORT $SSH_USER@$SSH_HOST "cd $TARGET_DIR && \
tar xzf cloonar-config.tar.gz && \
nixos-rebuild switch \
-I nixpkgs=\$(cat example/channel)/nixexprs.tar.xz \
-I nixos-config=$TARGET_DIR/example/configuration.nix" || error "Build failed"
BUILD_EXIT=$?
if [[ $BUILD_EXIT -eq 0 ]]; then
log "Configuration built and activated successfully!"
if [[ $NO_REBOOT -eq 0 ]]; then
log "Rebooting VM..."
sshpass -p "$SSH_PASS" ssh $SSH_OPTIONS -p $SSH_PORT $SSH_USER@$SSH_HOST "systemctl reboot"
log "Waiting for VM to reboot..."
sleep 30
wait_for_ssh || error "Failed to reconnect after reboot"
log "VM is back online"
fi
else
error "Build failed with exit code $BUILD_EXIT"
fi
if [[ $KEEP_FILES -eq 1 ]]; then
log "Files kept in $TARGET_DIR on VM"
fi