pipeline { agent { docker { image 'node:20' // ✅ Node.js 20 with npm included } } environment { IMAGE = "pedw-app" } stages { stage('Install & Build') { steps { sh 'npm ci' sh 'npm run build' } } stage('Build Docker Image') { steps { sh "docker build -t $REGISTRY/$IMAGE:latest ." } } stage('Push Docker Image') { steps { withCredentials([usernamePassword(credentialsId: 'dockerhub-credentials', usernameVariable: 'DOCKER_USER', passwordVariable: 'DOCKER_PASS')]) { sh "echo $DOCKER_PASS | docker login -u $DOCKER_USER --password-stdin" sh "docker push $REGISTRY/$IMAGE:latest" } } } stage('Deploy to Plesk') { steps { sshagent(['plesk-ssh-key']) { sh """ ssh root@your-plesk-domain.com ' docker pull $REGISTRY/$IMAGE:latest && docker stop nextjs-app || true && docker rm nextjs-app || true && docker run -d --restart=always --name nextjs-app -p 3000:3000 $REGISTRY/$IMAGE:latest ' """ } } } } }