diff --git a/Jenkinsfile b/Jenkinsfile new file mode 100644 index 0000000..d0bcd39 --- /dev/null +++ b/Jenkinsfile @@ -0,0 +1,104 @@ +// 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() + } + } +}