1 changed files with 104 additions and 0 deletions
@ -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() |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
Loading…
Reference in new issue