// PAL Networks 홈페이지 (pal-hom-2026) CI/CD 파이프라인 // 빌드: npm ci -> npm run build (결과물: docs/) // 배포: docs/ 정적 파일을 웹서버로 전달 (아래 Deploy 스테이지에서 환경에 맞게 설정) pipeline { agent any // Jenkins > Manage Jenkins > Tools > NodeJS 에 'node24' 라는 이름으로 // Node 24.16.0(.node-version과 동일)을 등록해 두어야 함. // (대안: agent { docker { image 'node:24.16.0' } } 로 교체 가능) tools { nodejs 'node24' } options { timestamps() disableConcurrentBuilds() timeout(time: 15, unit: 'MINUTES') buildDiscarder(logRotator(numToKeepStr: '20')) } environment { // 빌드 산출물 디렉터리 (vite.config.js의 outDir와 일치) BUILD_DIR = 'docs' // ── 배포 대상 ── 실제 환경에 맞게 수정 ────────────────────────── DEPLOY_HOST = '3.37.30.218' // 배포 대상 서버 IP (또는 호스트명) DEPLOY_USER = 'ec2-user' // SSH 접속 계정 (Amazon Linux 2) DEPLOY_PATH = '/data/app/hom' // 서버 내 배포 경로 (nginx root) DEPLOY_SSH_CRED = 'pal-hom-ssh' // Jenkins 크리덴셜 ID (EC2 pem 키) // ──────────────────────────────────────────────────────────── } stages { stage('Checkout') { steps { checkout scm } } stage('Environment') { steps { sh ''' echo "Node: $(node -v)" echo "npm: $(npm -v)" ''' } } stage('Install') { steps { // lockfile 기반 클린 설치 (재현성 보장) sh 'npm ci' } } stage('Lint') { steps { sh 'npm run lint' } } stage('Build') { steps { sh 'npm run build' } } stage('Deploy') { steps { // [방식 B] 원격 웹서버로 SSH/rsync 배포 // - SSH Agent Plugin 설치 필요 // - DEPLOY_SSH_CRED 에 해당 서버 접속용 SSH 개인키를 등록해 둘 것 // - 최초 1회 known_hosts 등록을 위해 StrictHostKeyChecking=no 사용 sshagent([env.DEPLOY_SSH_CRED]) { sh ''' rsync -avz --delete \ -e "ssh -o StrictHostKeyChecking=no" \ "${BUILD_DIR}/" \ "${DEPLOY_USER}@${DEPLOY_HOST}:${DEPLOY_PATH}/" ''' } echo "Deployed ${BUILD_DIR}/ -> ${DEPLOY_USER}@${DEPLOY_HOST}:${DEPLOY_PATH}" // [방식 A] Jenkins와 같은 서버에 배포한다면 위 sshagent 블록 대신: // sh 'mkdir -p "${DEPLOY_PATH}" && rsync -av --delete "${BUILD_DIR}/" "${DEPLOY_PATH}/"' // [방식 C] 산출물 아카이브만 보관(외부 배포 도구가 수거): // archiveArtifacts artifacts: "${BUILD_DIR}/**", fingerprint: true } } } post { success { echo "✅ 빌드/배포 성공: ${env.JOB_NAME} #${env.BUILD_NUMBER}" } failure { echo "❌ 빌드/배포 실패: ${env.JOB_NAME} #${env.BUILD_NUMBER}" } cleanup { cleanWs() } } }