chore(dev): track dev-start.sh

This commit is contained in:
Chris Christiansen 2026-07-05 08:22:52 +00:00
parent 99eaaad3ca
commit e88881be19

190
dev-start.sh Executable file
View File

@ -0,0 +1,190 @@
#!/bin/bash
set -e # Exit immediately if a command exits with a non-zero status.
set -u # Treat unset variables as an error.
# --- Configuration ---
# VM and Project Details
CPU_VM_NAME="osvauco-cpu-vm"
CPU_VM_ZONE="us-central1-b"
CPU_IP_NAME="osvauco-cpu-ip"
CPU_REGION="us-central1"
GPU_VM_NAME="osvauco-gpu-vm"
GPU_VM_ZONE="europe-west4-c"
GPU_IP_NAME="osvauco-gpu-ip"
GPU_REGION="europe-west4"
PROJECT_ID="propane-will-491900-m5"
VM_USER="chris_christiansen"
# Local SSH Configuration (for WSL/Git Bash on Windows)
# IMPORTANT: This path assumes you are running this script from WSL or a similar environment.
SSH_CONFIG_PATH="/mnt/c/Users/Cvias/.ssh/config"
SSH_KEY_PATH="C:\Users\Cvias\.ssh\google_compute_engine"
# Git Remotes for Verification on GPU VM
GITEA_REMOTE="http://34.158.137.245:3000/chris/osvauco.git"
GITHUB_REMOTE="git@github.com:vauco/osvauco.git"
# --- Helper Functions ---
# Function to print messages
log() {
echo "--- $1 ---"
}
# Pre-flight check to ensure a static IP has been reserved.
preflight_check_ip() {
local ip_name="$1"
local region="$2"
log "Pre-flight check for static IP: $ip_name"
if gcloud compute addresses describe "$ip_name" --project="$PROJECT_ID" --region="$region" --format="value(name)" >/dev/null 2>&1; then
echo "✅ Static IP '$ip_name' exists."
else
echo "❌ ERROR: Static IP '$ip_name' not found in region '$region'."
echo "This script requires a reserved static IP to function reliably."
echo ""
echo "To fix this, please run the following command:"
echo "gcloud compute addresses create \"$ip_name\" --project=\"$PROJECT_ID\" --region=\"$region\" --network-tier=STANDARD"
echo ""
echo "After creating the IP, ensure it is assigned to the correct VM, then re-run this script."
exit 1
fi
}
# Function to start a VM if it's not running
start_vm() {
local vm_name="$1"
local zone="$2"
log "Checking status of $vm_name"
# Get the current status of the VM.
# The `|| echo "TERMINATED"` part handles cases where gcloud might fail if the VM is in a weird state.
local status=$(gcloud compute instances describe "$vm_name" --project="$PROJECT_ID" --zone="$zone" --format="get(status)" || echo "TERMINATED")
if [ "$status" == "RUNNING" ]; then
echo "$vm_name is already running."
else
echo "VM is $status. Starting $vm_name..."
gcloud compute instances start "$vm_name" --project="$PROJECT_ID" --zone="$zone"
echo "$vm_name started."
fi
}
# Function to get a reserved static IP address
get_static_ip() {
local ip_name="$1"
local region="$2"
gcloud compute addresses describe "$ip_name" --project="$PROJECT_ID" --region="$region" --format="get(address)"
}
# --- Main Script ---
# 0. Pre-flight checks for required infrastructure
preflight_check_ip "$CPU_IP_NAME" "$CPU_REGION"
preflight_check_ip "$GPU_IP_NAME" "$GPU_REGION"
# 1. Start VMs
start_vm "$CPU_VM_NAME" "$CPU_VM_ZONE"
start_vm "$GPU_VM_NAME" "$GPU_VM_ZONE"
# 2. Get Static IPs
log "Fetching static IP addresses"
CPU_IP=$(get_static_ip "$CPU_IP_NAME" "$CPU_REGION")
GPU_IP=$(get_static_ip "$GPU_IP_NAME" "$GPU_REGION")
echo " - CPU VM IP: $CPU_IP"
echo " - GPU VM IP: $GPU_IP"
# 3. Update SSH Config on Windows
log "Updating SSH config file at $SSH_CONFIG_PATH"
if [ ! -f "$SSH_CONFIG_PATH" ]; then
echo "⚠️ SSH config file not found. Creating it."
touch "$SSH_CONFIG_PATH"
fi
# We use a marker block to safely update the SSH config.
# This is safer than trying to edit lines in place.
MARKER_BEGIN="# BEGIN OSVAUCO-MANAGED-BLOCK"
MARKER_END="# END OSVAUCO-MANAGED-BLOCK"
# Create a temporary file to build the new config
temp_config=$(mktemp)
# Copy the config content, excluding the old managed block
awk -v begin="$MARKER_BEGIN" -v end="$MARKER_END" '
$0 == begin {in_block=1}
!in_block {print}
$0 == end {in_block=0}
' "$SSH_CONFIG_PATH" > "$temp_config"
# Append the new, updated block to the temporary file
cat <<EOT >> "$temp_config"
$MARKER_BEGIN
# This block is automatically managed by dev-start.sh
# Do not edit manually!
Host osvauco-cpu
HostName $CPU_IP
User $VM_USER
IdentityFile $SSH_KEY_PATH
Host osvauco-gpu
HostName $GPU_IP
User $VM_USER
IdentityFile $SSH_KEY_PATH
$MARKER_END
EOT
# Overwrite the original config file with the updated one
mv "$temp_config" "$SSH_CONFIG_PATH"
echo "✅ SSH config updated successfully."
# 4. Print Connect Commands
log "Setup Complete! You can now connect using:"
echo ""
echo " ssh osvauco-cpu"
echo " ssh osvauco-gpu"
echo ""
# 5. Verify Git Remotes on the GPU VM
log "Verifying Git remotes on $GPU_VM_NAME"
# This command runs non-interactively on the remote VM.
gcloud compute ssh "${VM_USER}@${GPU_VM_NAME}" --zone="${GPU_VM_ZONE}" --project="${PROJECT_ID}" --command="
set -e
echo '--- Running remote verification ---'
cd ~/OSVauco || { echo 'Error: ~/OSVauco directory not found.'; exit 1; }
# Check and fix 'origin' remote
ORIGIN_URL=\$(git remote get-url origin 2>/dev/null || echo '')
if [ "\$ORIGIN_URL" == "${GITEA_REMOTE}" ]; then
echo '✅ Git remote "origin" is correct.'
else
echo '⚠️ Git remote "origin" is incorrect or missing. Setting it...'
if [ -n "\$ORIGIN_URL" ]; then
git remote set-url origin "${GITEA_REMOTE}"
else
git remote add origin "${GITEA_REMOTE}"
fi
echo '✅ Remote "origin" set to: ${GITEA_REMOTE}'
fi
# Check and fix 'github' remote
GITHUB_URL=\$(git remote get-url github 2>/dev/null || echo '')
if [ "\$GITHUB_URL" == "${GITHUB_REMOTE}" ]; then
echo '✅ Git remote "github" is correct.'
else
echo '⚠️ Git remote "github" is incorrect or missing. Setting it...'
if [ -n "\$GITHUB_URL" ]; then
git remote set-url github "${GITHUB_REMOTE}"
else
git remote add github "${GITHUB_REMOTE}"
fi
echo '✅ Remote "github" set to: ${GITHUB_REMOTE}'
fi
echo '--- Remote verification complete ---'
"
log "All tasks finished."