diff --git a/Jenkinsfile b/Jenkinsfile index c4601b9..6ad08ba 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -7,45 +7,73 @@ pipeline { } agent any stages { - stage('🚀 Deploy Dovodi Backend (Background Build)') { + stage('🚀 Trigger Deployment') { when { expression { gitBranch == "origin/master" } } steps { script { withCredentials([usernamePassword(credentialsId: production_server_name, usernameVariable: 'USERNAME', passwordVariable: 'PASSWORD')]) { sh """ - sshpass -p \$PASSWORD ssh -o StrictHostKeyChecking=no -o ServerAliveInterval=30 -o ServerAliveCountMax=120 \$USERNAME@${production_server_ip} << 'EOF' - - cd ${project_path} - - echo "⏳ Starting runner.sh in background to prevent timeout..." - - rm -f /tmp/dovodi_backend_deploy_status.txt - rm -f /tmp/dovodi_backend_runner_deploy.log - - nohup bash -c './runner.sh && echo "SUCCESS" > /tmp/dovodi_backend_deploy_status.txt || echo "FAIL" > /tmp/dovodi_backend_deploy_status.txt' > /tmp/dovodi_backend_runner_deploy.log 2>&1 & - - echo "⏳ Process is running. Waiting for build and deploy to finish..." - - while true; do - if [ -f /tmp/dovodi_backend_deploy_status.txt ]; then - STATUS=\$(cat /tmp/dovodi_backend_deploy_status.txt) - if [ "\$STATUS" = "SUCCESS" ]; then - echo "✅ Deployment completed successfully!" - break - else - echo "❌ ERROR: Deployment failed! Last 20 lines of log:" - tail -n 20 /tmp/dovodi_backend_runner_deploy.log - exit 1 - fi - fi - sleep 10 - done -EOF + sshpass -p \$PASSWORD ssh -o StrictHostKeyChecking=no -o ConnectTimeout=10 \$USERNAME@${production_server_ip} " + cd ${project_path} && \ + rm -f /tmp/dovodi_backend_deploy_status.txt /tmp/dovodi_backend_runner_deploy.log && \ + (nohup ./runner.sh > /tmp/dovodi_backend_runner_deploy.log 2>&1 &) + " """ } } } } + stage('⏳ Live Build & Deploy Monitor') { + when { expression { gitBranch == "origin/master" } } + steps { + timeout(time: 15, unit: 'MINUTES') { + script { + withCredentials([usernamePassword(credentialsId: production_server_name, usernameVariable: 'USERNAME', passwordVariable: 'PASSWORD')]) { + waitUntil { + def output = sh( + script: """ + sshpass -p \$PASSWORD ssh -o StrictHostKeyChecking=no -o ConnectTimeout=10 \$USERNAME@${production_server_ip} ' + if [ -f /tmp/dovodi_backend_deploy_status.txt ]; then + RAW=\$(cat /tmp/dovodi_backend_deploy_status.txt | tr -d "\\r\\n") + echo "DEPLOY_STATE_\${RAW}" + else + echo "DEPLOY_STATE_PENDING" + fi + echo "===LOG_TAIL===" + tail -n 6 /tmp/dovodi_backend_runner_deploy.log 2>/dev/null || true + ' + """, + returnStdout: true + ).trim() + + if (output.contains("DEPLOY_STATE_SUCCESS")) { + echo "==========================================" + echo "✅ Dovodi Backend deployment completed successfully!" + echo "==========================================" + return true + } else if (output.contains("DEPLOY_STATE_FAIL")) { + echo "==========================================" + echo "❌ ERROR: Dovodi Backend deployment failed! Full log:" + echo "==========================================" + sh "sshpass -p \$PASSWORD ssh -o StrictHostKeyChecking=no \$USERNAME@${production_server_ip} 'cat /tmp/dovodi_backend_runner_deploy.log'" + error("Dovodi Backend build failed on server.") + return true + } else { + if (output.contains("===LOG_TAIL===")) { + def parts = output.split("===LOG_TAIL===") + if (parts.length > 1 && parts[1].trim()) { + echo "--- 📋 Live Progress ---" + echo parts[1].trim() + } + } + sleep 10 + return false + } + } + } + } + } + } + } } } - diff --git a/runner.sh b/runner.sh index be7eab0..ab3b7e5 100755 --- a/runner.sh +++ b/runner.sh @@ -1,4 +1,5 @@ #!/bin/bash +set -e # Check if the '--dev' argument is provided if [ "$1" == "--dev" ]; then @@ -7,12 +8,31 @@ if [ "$1" == "--dev" ]; then else echo "Run Production docker" - # 👇 VITAL CHANGES HERE: - # 1. Ensure we are on the master branch + # در صورت بروز هرگونه خطا، وضعیت FAIL ثبت شود + trap 'echo "FAIL" > /tmp/dovodi_backend_deploy_status.txt' ERR + + echo "🧹 [1/4] Pre-build cleanup: freeing up disk space safely..." + # ۱. پاکسازی کامل تمام کش‌های بیلد داکر بدون دست زدن به کانتینرهای فعال + docker builder prune -a -f 2>/dev/null || true + + # ۲. پاکسازی ایمیج‌های قدیمی و معلق (Dangling) + docker image prune -f 2>/dev/null || true + + # ۳. پاکسازی کش پکیج‌های سیستم‌عامل + apt-get clean 2>/dev/null || true + + echo "📥 [2/4] Pulling latest backend changes from master..." git checkout master - - # 2. Pull the latest changes from master (NOT develop) - git pull origin master - + git fetch origin + git reset --hard origin/master + + echo "🚀 [3/4] Building and deploying backend container..." DOCKER_BUILDKIT=1 COMPOSE_DOCKER_CLI_BUILD=1 docker compose -f docker-compose.prod.yml up -d --build + + echo "✨ [4/4] Post-build cleanup..." + # پاکسازی ایمیج قدیمی که بعد از بیلد جدید معلق شده است + docker image prune -f 2>/dev/null || true + + echo "SUCCESS" > /tmp/dovodi_backend_deploy_status.txt + echo "🎉 Dovodi Backend build and deployment finished successfully!" fi