diff --git a/Jenkinsfile b/Jenkinsfile index 1da6021..6027661 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -1,81 +1,86 @@ pipeline { - agent any + agent any - tools { - nodejs 'Node' // Name of your NodeJS installation in Jenkins - } - - environment { - WEB_IP = '13.49.223.142' // EC2 Web server IP - SSH_CRED = 'deploy-ec2-key' // Jenkins credential ID for SSH key - NODE_OPTIONS = "--max_old_space_size=512" // Limit Node memory - } - - options { - ansiColor('xterm') // Colorized console logs - timestamps() // Show timestamps in console - timeout(time: 30, unit: 'MINUTES') // Fail build if it hangs - } - - stages { - stage('Checkout') { - steps { - echo "🔄 Checking out code..." - checkout scm - } + tools { + nodejs 'Node' // Make sure NodeJS installation in Jenkins Global Tool Config is named "Node" } - stage('Install Dependencies') { - steps { - echo "📦 Installing npm dependencies..." - sh 'npm ci' - } + environment { + WEB_IP = '13.49.223.142' // EC2 web server IP + SSH_CRED = 'deploy-ec2-key' // Jenkins SSH key credential ID + NODE_OPTIONS = "--max_old_space_size=512" // Prevent Node from consuming all memory } - stage('Build') { - steps { - echo "🏗️ Building project..." - sh 'npm run build' - } - } - - stage('Package Build') { - steps { - script { - def outDir = fileExists('dist') ? 'dist' : 'build' - if (!fileExists(outDir)) { - error "❌ Build output not found in 'build/' or 'dist/'!" - } - echo "📦 Packaging build output..." - sh "tar -czf build.tar.gz -C ${outDir} ." - archiveArtifacts artifacts: 'build.tar.gz' + stages { + stage('Checkout') { + steps { + checkout scm + } } - } - } - stage('Deploy') { - steps { - script { - sshagent(credentials: [env.SSH_CRED]) { - echo "🚀 Deploying build to ${WEB_IP}..." - sh """ - scp -o StrictHostKeyChecking=no build.tar.gz deploy@${WEB_IP}:/tmp/build.tar.gz - ssh -o StrictHostKeyChecking=no deploy@${WEB_IP} ' - sudo rm -rf /var/www/reactapp/* - sudo mkdir -p /var/www/reactapp - sudo tar -xzf /tmp/build.tar.gz -C /var/www/reactapp - sudo systemctl reload nginx - ' - """ - echo "✅ Deployment finished!" - } + stage('Install') { + steps { + sh ''' + echo "📦 Installing dependencies..." + npm ci + ''' + } } - } - } - } - post { - success { echo "🎉 Pipeline completed successfully!" } - failure { echo "❌ Pipeline failed — check console log" } - } + stage('Build') { + steps { + sh ''' + echo "🏗️ Building project..." + npm run build + ''' + } + } + + stage('Package') { + steps { + sh ''' + OUT_DIR="build" + [ -d dist ] && OUT_DIR="dist" + + if [ ! -d "$OUT_DIR" ]; then + echo "❌ ERROR: No build output found (build/ or dist/)" + ls -la + exit 1 + fi + + echo "📦 Packaging build output..." + tar -czf build.tar.gz -C "$OUT_DIR" . + ''' + archiveArtifacts artifacts: 'build.tar.gz' + } + } + + stage('Deploy') { + steps { + script { + // Use sshagent in a script block + sshagent([env.SSH_CRED]) { + sh """ + echo "🚀 Deploying to ${WEB_IP}..." + scp -o StrictHostKeyChecking=no build.tar.gz deploy@${WEB_IP}:/tmp/build.tar.gz + + ssh -o StrictHostKeyChecking=no deploy@${WEB_IP} ' + sudo rm -rf /var/www/reactapp/* + sudo mkdir -p /var/www/reactapp + sudo tar -xzf /tmp/build.tar.gz -C /var/www/reactapp + sudo systemctl reload nginx + ' + + echo "✅ Deployment finished" + """ + } + } + } + } + } + + post { + success { echo "✅ Pipeline completed successfully" } + failure { echo "❌ Pipeline failed — check console log" } + } }