pipeline { agent any environment { DEPLOY_USER = 'hskwon' RELEASE_ID = new Date().format('yyyyMMdd_HHmmss') } stages { stage('Checkout') { steps { checkout scm } } stage('Prepare Env') { steps { script { def envFile = "/var/lib/jenkins/env-files/react/.env.${env.BRANCH_NAME}" sh "cp ${envFile} .env.local" } } } stage('Install') { steps { sh 'npm ci' } } stage('Build') { steps { sh 'npm run build' } } // ── develop → 개발서버 배포 ── stage('Deploy Development') { when { branch 'develop' } steps { sshagent(credentials: ['deploy-ssh-key']) { sh """ rsync -az --delete \ .next/ package.json package-lock.json next.config.ts public/ node_modules/ \ ${DEPLOY_USER}@114.203.209.83:/home/webservice/react/ scp .env.local ${DEPLOY_USER}@114.203.209.83:/home/webservice/react/.env.local ssh ${DEPLOY_USER}@114.203.209.83 'cd /home/webservice/react && pm2 restart sam-front' """ } } } // ── stage → 운영서버 Stage 배포 ── stage('Deploy Stage') { when { branch 'stage' } steps { sshagent(credentials: ['deploy-ssh-key']) { sh """ ssh ${DEPLOY_USER}@211.117.60.189 'mkdir -p /home/webservice/react-stage/releases/${RELEASE_ID}' rsync -az --delete \ .next/ package.json package-lock.json next.config.ts public/ node_modules/ \ ${DEPLOY_USER}@211.117.60.189:/home/webservice/react-stage/releases/${RELEASE_ID}/ scp .env.local ${DEPLOY_USER}@211.117.60.189:/home/webservice/react-stage/releases/${RELEASE_ID}/.env.local ssh ${DEPLOY_USER}@211.117.60.189 ' ln -sfn /home/webservice/react-stage/releases/${RELEASE_ID} /home/webservice/react-stage/current && cd /home/webservice && pm2 reload sam-front-stage 2>/dev/null || pm2 start react-stage/current/node_modules/.bin/next --name sam-front-stage -- start -p 3100 && cd /home/webservice/react-stage/releases && ls -1dt */ | tail -n +4 | xargs rm -rf 2>/dev/null || true ' """ } } } // ── main → 운영서버 Production 배포 ── stage('Deploy Production') { when { branch 'main' } steps { sshagent(credentials: ['deploy-ssh-key']) { sh """ ssh ${DEPLOY_USER}@211.117.60.189 'mkdir -p /home/webservice/react/releases/${RELEASE_ID}' rsync -az --delete \ .next/ package.json package-lock.json next.config.ts public/ node_modules/ \ ${DEPLOY_USER}@211.117.60.189:/home/webservice/react/releases/${RELEASE_ID}/ scp .env.local ${DEPLOY_USER}@211.117.60.189:/home/webservice/react/releases/${RELEASE_ID}/.env.local ssh ${DEPLOY_USER}@211.117.60.189 ' ln -sfn /home/webservice/react/releases/${RELEASE_ID} /home/webservice/react/current && cd /home/webservice && pm2 reload sam-front && cd /home/webservice/react/releases && ls -1dt */ | tail -n +6 | xargs rm -rf 2>/dev/null || true ' """ } } } } post { success { echo "✅ react 배포 완료 (${env.BRANCH_NAME})" } failure { echo "❌ react 배포 실패 (${env.BRANCH_NAME})" } } }