pipeline { agent any environment { APP_NAME = 'Polizia' APP_ENV = 'testing' APP_KEY = 'base64:1YsMWZ+cIDVa5NIePkjsXVheT9rbykHDs/CnGPUQdqU=' APP_DEBUG = 'false' APP_URL = 'https://frascati.dev.webmagistri.biz' LOG_CHANNEL = 'stack' LOG_DEPRECATIONS_CHANNEL = 'null' LOG_LEVEL = 'debug' DB_CONNECTION = 'mysql' DB_HOST = '127.0.0.1' DB_PORT = '3306' DB_DATABASE = 'polizia_online' DB_USERNAME = 'admin' DB_PASSWORD = 'admin' MCTC_URL = 'https://www.ilportaledellautomobilista.it/Info-ws/services' MCTC_USER = 'CMRM001301' MCTC_PASSWORD = '2PMPM*86' STORAGE_PATH = 'app/public/' REMOTE_HOST = '10.2.0.10' REMOTE_USER = 'fratini' REMOTE_DIR = '/var/www/polizia' ADMIN_EMAIL = 'f.fratini@webmagistri.it' } stages { stage('Verify Host') { steps { sh 'hostname' sh 'hostname -I' sh 'whoami' } } stage('Get Code') { steps { checkout scm } } stage('Debug Branch Info') { steps { script { // Store the branch info for later use env.CURRENT_BRANCH = sh(script: 'git rev-parse --abbrev-ref HEAD || echo "HEAD"', returnStdout: true).trim() echo "Current branch detected as: ${env.CURRENT_BRANCH}" } } } stage('Deploy to Server') { when { expression { // Always deploy from develop branch or if we're in a detached HEAD state return env.CURRENT_BRANCH == 'HEAD' || env.CURRENT_BRANCH == 'develop' || env.GIT_BRANCH == 'origin/develop' || env.BRANCH_NAME == 'develop' } } steps { echo "Starting deployment to ${REMOTE_HOST} as user ${REMOTE_USER}" sh ''' # Make sure SSH directory exists with correct permissions mkdir -p ~/.ssh chmod 700 ~/.ssh # First, clean up the target directory to ensure we have permissions ssh -o StrictHostKeyChecking=no ${REMOTE_USER}@${REMOTE_HOST} "if [ -d '${REMOTE_DIR}' ]; then sudo rm -rf ${REMOTE_DIR}/*; else sudo mkdir -p ${REMOTE_DIR}; fi" # Ensure the directory is owned by our user ssh -o StrictHostKeyChecking=no ${REMOTE_USER}@${REMOTE_HOST} "sudo chown -R ${REMOTE_USER}:${REMOTE_USER} ${REMOTE_DIR}" # Create a tar archive excluding unnecessary files tar --exclude='.git' --exclude='node_modules' --exclude='vendor' -czf /tmp/deployment.tar.gz . # Copy the archive to the remote server scp -o StrictHostKeyChecking=no /tmp/deployment.tar.gz ${REMOTE_USER}@${REMOTE_HOST}:/tmp/ # Extract the archive on the remote server with --no-same-owner to avoid permission issues ssh -o StrictHostKeyChecking=no ${REMOTE_USER}@${REMOTE_HOST} "cd ${REMOTE_DIR} && tar -xzf /tmp/deployment.tar.gz --no-same-owner" # Clean up rm -f /tmp/deployment.tar.gz ssh -o StrictHostKeyChecking=no ${REMOTE_USER}@${REMOTE_HOST} "rm -f /tmp/deployment.tar.gz" # Check for PHP ssh -o StrictHostKeyChecking=no ${REMOTE_USER}@${REMOTE_HOST} "php -v || echo 'PHP not available on remote server'" # Check for Composer and install it if missing echo "Checking for Composer..." COMPOSER_INSTALLED=$(ssh -o StrictHostKeyChecking=no ${REMOTE_USER}@${REMOTE_HOST} "command -v composer || echo 'not found'") if [[ "$COMPOSER_INSTALLED" == *"not found"* ]]; then echo "Installing Composer..." ssh -o StrictHostKeyChecking=no ${REMOTE_USER}@${REMOTE_HOST} "cd /tmp && curl -sS https://getcomposer.org/installer | php && sudo mv composer.phar /usr/local/bin/composer && sudo chmod +x /usr/local/bin/composer" else echo "Composer is already installed." fi # Run Composer install echo "Running composer install..." ssh -o StrictHostKeyChecking=no ${REMOTE_USER}@${REMOTE_HOST} "cd ${REMOTE_DIR} && composer install --no-interaction --no-dev --prefer-dist" # Check for Node.js/NPM NODE_INSTALLED=$(ssh -o StrictHostKeyChecking=no ${REMOTE_USER}@${REMOTE_HOST} "command -v node || echo 'not found'") if [[ "$NODE_INSTALLED" == *"not found"* ]]; then echo "Node.js not found - skipping npm steps" else echo "Running npm install and build..." ssh -o StrictHostKeyChecking=no ${REMOTE_USER}@${REMOTE_HOST} "cd ${REMOTE_DIR} && npm install && npm run build" fi # Set proper permissions for Laravel directories that need to be writable echo "Setting directory permissions..." ssh -o StrictHostKeyChecking=no ${REMOTE_USER}@${REMOTE_HOST} "cd ${REMOTE_DIR} && mkdir -p bootstrap/cache storage/framework/sessions storage/framework/views storage/framework/cache storage/logs" ssh -o StrictHostKeyChecking=no ${REMOTE_USER}@${REMOTE_HOST} "cd ${REMOTE_DIR} && chmod -R 775 storage bootstrap/cache" # Run Laravel artisan commands echo "Running Laravel artisan commands..." ssh -o StrictHostKeyChecking=no ${REMOTE_USER}@${REMOTE_HOST} "cd ${REMOTE_DIR} && php artisan migrate --force || echo 'Migration failed, continuing...'" ssh -o StrictHostKeyChecking=no ${REMOTE_USER}@${REMOTE_HOST} "cd ${REMOTE_DIR} && php artisan config:cache || echo 'Config cache failed, continuing...'" ssh -o StrictHostKeyChecking=no ${REMOTE_USER}@${REMOTE_HOST} "cd ${REMOTE_DIR} && php artisan route:cache || echo 'Route cache failed, continuing...'" ssh -o StrictHostKeyChecking=no ${REMOTE_USER}@${REMOTE_HOST} "cd ${REMOTE_DIR} && php artisan view:cache || echo 'View cache failed, continuing...'" ssh -o StrictHostKeyChecking=no ${REMOTE_USER}@${REMOTE_HOST} "cd ${REMOTE_DIR} && php artisan optimize || echo 'Optimize failed, continuing...'" ssh -o StrictHostKeyChecking=no ${REMOTE_USER}@${REMOTE_HOST} "cd ${REMOTE_DIR} && php artisan storage:link || echo 'Storage link failed, continuing...'" # Set final ownership for web server echo "Setting web server ownership..." ssh -o StrictHostKeyChecking=no ${REMOTE_USER}@${REMOTE_HOST} "sudo chown -R www-data:www-data ${REMOTE_DIR}" # Restart services echo "Restarting services..." ssh -o StrictHostKeyChecking=no ${REMOTE_USER}@${REMOTE_HOST} "sudo systemctl restart php8.1-fpm || sudo systemctl restart php-fpm || echo 'PHP service restart failed, may need manual intervention'" ssh -o StrictHostKeyChecking=no ${REMOTE_USER}@${REMOTE_HOST} "sudo systemctl restart nginx || echo 'Nginx restart failed, may need manual intervention'" # Clear cache echo "Clearing cache..." ssh -o StrictHostKeyChecking=no ${REMOTE_USER}@${REMOTE_HOST} "cd ${REMOTE_DIR} && sudo -u www-data php artisan cache:clear || echo 'Cache clear failed, continuing...'" ''' } } } post { always { script { cleanWs() } } success { echo 'Build successful! The Polizia application is now deployed to 10.2.0.10' script { mail to: env.ADMIN_EMAIL, subject: 'Polizia - Build Successful', body: 'The build was successful and the Polizia application has been deployed to the server at 10.2.0.10' } } failure { echo 'Build failed! Please check the console output to fix the issues.' script { mail to: env.ADMIN_EMAIL, subject: 'Polizia - Build Failed', body: 'The build has failed. Please check Jenkins for details.' } } } }