pipeline { agent any environment { DEPLOY_HOST = "192.168.178.180" // your VM IP or hostname DEPLOY_USER = "deployuser" // user on the VM APP_DIR = "/srv/mitm-webserver" // deploy target directory } stages { stage('Checkout') { steps { echo "📦 Checking out source code from Gitea..." git branch: 'main', url: 'https://gitea.yourdomain.com/youruser/mitm-webserver.git' } } stage('Build Frontend') { steps { dir('frontend') { echo "⚙️ Building frontend..." sh 'npm ci' sh 'npm run build' } } } stage('Prepare Backend') { steps { dir('backend') { echo "🐍 Preparing backend..." sh ''' python3 -m venv venv ./venv/bin/pip install --upgrade pip ./venv/bin/pip install -r requirements.txt ''' } } } stage('Deploy to VM') { steps { echo "🚀 Deploying mitm-webserver to ${DEPLOY_HOST}..." withCredentials([usernamePassword( credentialsId: 'deploy-pass-id', // Jenkins credential ID usernameVariable: 'USER', passwordVariable: 'PASS' )]) { sh ''' # Ensure sshpass is installed if ! command -v sshpass >/dev/null 2>&1; then echo "Installing sshpass..." sudo apt-get update -y && sudo apt-get install -y sshpass fi echo "🔌 Testing SSH connection..." sshpass -p "$PASS" ssh -o StrictHostKeyChecking=no -o ConnectTimeout=10 $USER@$DEPLOY_HOST "echo '✅ Connected to $HOSTNAME'" echo "📤 Uploading frontend build..." sshpass -p "$PASS" rsync -avz --delete \ -e "ssh -o StrictHostKeyChecking=no" \ frontend/dist/ $USER@$DEPLOY_HOST:$APP_DIR/frontend/dist/ echo "📤 Uploading backend..." sshpass -p "$PASS" rsync -avz --delete \ -e "ssh -o StrictHostKeyChecking=no" \ backend/ $USER@$DEPLOY_HOST:$APP_DIR/backend/ echo "🔁 Restarting backend service..." sshpass -p "$PASS" ssh -o StrictHostKeyChecking=no $USER@$DEPLOY_HOST " cd $APP_DIR/backend && source venv/bin/activate && sudo systemctl restart mitm-webserver-backend.service " echo "✅ Deployment finished successfully." ''' } } } } post { success { echo '✅ mitm-webserver deployed successfully!' } failure { echo '❌ Deployment failed. Check Jenkins logs for details.' } } }