You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

104 lines
3.2 KiB

// 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()
}
}
}