Files
sake/Jenkinsfile
2025-12-15 16:38:02 +09:00

308 lines
13 KiB
Groovy

pipeline {
agent any
tools {
jdk 'JDK17'
}
environment {
SERVER_IP = "${DEPLOY_WAS_SERVER_IP}"
SERVER_USER = "tomcat"
TOMCAT_HOME = "${ENVIRONMENT == 'dev' ? '/var/lib/tomcat' : '/usr/local/tomcat'}"
APP_NAME = "sake"
ROOT_NAME = "ROOT"
DEPLOY_PATH = "${TOMCAT_HOME}/webapps"
PROPERTY_PATH = "${DEPLOY_PATH}/${APP_NAME}/WEB-INF/classes"
BACKUP_PATH = "${DEPLOY_PATH}/backup"
WAR_FILE = "${APP_NAME}.war"
DEPLOY_FILE = "${DEPLOY_PATH}/${WAR_FILE}"
BACKUP_FILE = "${BACKUP_PATH}/${WAR_FILE}.bak"
PROPERTY_FILE = "${PROPERTY_PATH}/application-${ENVIRONMENT}.yml"
GIT_BRANCH = "${ENVIRONMENT == 'dev' ? 'develop' : 'master'}"
NGINX_STATIC_PATH = "/var/www/sopmall"
NGINX_SERVER_IP = "${DEPLOY_WEB_SERVER_IP}"
NGINX_USER = "${ENVIRONMENT == 'dev' ? 'dev1' : 'ubuntu'}"
// SSH_KEY_PATH = "C:/Users/CHAMDAHAN-41/.ssh/id_rsa"
}
stages {
stage('Setup parameters') {
steps {
script {
try {
echo "Setup parameters 출력"
echo "tomcat home here ${env.CATALINA_HOME}"
echo "Setup parameters ${ENVIRONMENT}"
echo "Setup parameters 출력 종료"
if("${ENVIRONMENT}" == "dev" ) {
properties([
parameters([
choice(name: 'ENVIRONMENT', choices: ['dev'], description: '배포할 어플리케이션 profile 선택'),
choice(name: 'DEPLOY_WAS_SERVER_IP', choices: ['00.00.00.00'], description: 'WAR 배포할 서버IP 선택'),
choice(name: 'DEPLOY_WEB_SERVER_IP', choices: ['00.00.00.00'], description: 'STATIC RESOURCE 배포할 서버IP 선택'),
choice(name: 'DEPLOY_TARGET', choices: ['ALL', 'WEB_ONLY', 'WAS_ONLY', 'PROPERTY_ONLY'], description: '배포 대상 선택'),
string(name: 'GIT_REPO', defaultValue: 'http://115.68.207.90:3000/itfirst/sake.git', description: 'Git 레파지토리 URL'),
choice(name: 'DEPLOY_TARGET', choices: ['ALL', 'WEB_ONLY', 'WAS_ONLY'], description: '배포 대상 선택')
])
])
}else{
properties([
parameters([
choice(name: 'ENVIRONMENT', choices: ['stage'], description: '배포할 어플리케이션 profile 선택'),
choice(name: 'DEPLOY_WAS_SERVER_IP', choices: ['115.68.207.7'], description: 'WAR 배포할 서버IP 선택'),
choice(name: 'DEPLOY_WEB_SERVER_IP', choices: ['115.68.208.66'], description: 'STATIC RESOURCE 배포할 서버IP 선택'),
choice(name: 'DEPLOY_TARGET', choices: ['ALL', 'WEB_ONLY', 'WAS_ONLY', 'PROPERTY_ONLY'], description: '배포 대상 선택'),
string(name: 'GIT_REPO', defaultValue: 'http://115.68.207.90:3000/itfirst/sake.git', description: 'Git 레파지토리 URL'),
choice(name: 'DEPLOY_TARGET', choices: ['ALL', 'WEB_ONLY', 'WAS_ONLY'], description: '배포 대상 선택')
])
])
}
} catch (Exception e) {
error "Setup parameters 실패: ${e.getMessage()}"
}
}
}
}
stage('Checkout') {
steps {
script {
try {
echo "Checking out ${env.GIT_BRANCH} branch for ${params.ENVIRONMENT} environment"
git branch: "${env.GIT_BRANCH}", url: "${params.GIT_REPO}"
echo "Checkout 성공: 브랜치 ${env.GIT_BRANCH}, 저장소 ${params.GIT_REPO}"
} catch (Exception e) {
error "Checkout 실패: ${e.getMessage()}"
}
}
}
}
stage('Prepare and Deploy Static Resources') {
when {
expression { params.DEPLOY_TARGET in ['ALL', 'WEB_ONLY'] }
}
steps {
script {
// Static 리소스 준비 (Windows 환경)
sh 'mkdir static_resources'
sh 'cp -rf src/main/resources/static/* static_resources/'
// Static 리소스 압축 (static_resources 디렉토리 안의 내용만 압축)
sh 'tar -cvf static_resources.tar -C static_resources .'
// Nginx 서버로 Static 리소스 압축 파일 배포
sshCommand remote: [
name: 'Nginx Server',
host: "${env.NGINX_SERVER_IP}",
user: "${env.NGINX_USER}",
identityFile: "${env.SSH_KEY_PATH}",
allowAnyHosts: true
], command: "mkdir -p ${env.NGINX_STATIC_PATH}"
sshPut remote: [
name: 'Nginx Server',
host: "${env.NGINX_SERVER_IP}",
user: "${env.NGINX_USER}",
identityFile: "${env.SSH_KEY_PATH}",
allowAnyHosts: true
], from: 'static_resources.tar', into: "${env.NGINX_STATIC_PATH}"
// Nginx 서버에서 압축 해제
sshCommand remote: [
name: 'Nginx Server',
host: "${env.NGINX_SERVER_IP}",
user: "${env.NGINX_USER}",
identityFile: "${env.SSH_KEY_PATH}",
allowAnyHosts: true
], command: """
cd ${env.NGINX_STATIC_PATH}
tar -xvf static_resources.tar
rm static_resources.tar
"""
echo "Static 리소스가 압축되어 Nginx 서버로 배포 및 압축 해제 완료"
}
}
}
// stage('Deploy only property') {
// when {
// expression { params.DEPLOY_TARGET in ['PROPERTY_ONLY'] }
// }
// steps {
// script {
// sshPut remote: [
// name: 'WAS Server',
// host: "${env.SERVER_IP}",
// user: "${env.SERVER_USER}",
// identityFile: "${env.SSH_KEY_PATH}",
// allowAnyHosts: true
// ], from: "src/main/resources/application-${params.ENVIRONMENT}.yml", into: "${env.PROPERTY_FILE}"
//
// // acutuator 호출
// sshCommand remote: [
// name: 'Nginx Server',
// host: "${env.SERVER_IP}",
// user: "${env.SERVER_USER}",
// identityFile: "${env.SSH_KEY_PATH}",
// allowAnyHosts: true
// ], command: "curl -X POST http://${env.SERVER_IP}:18210/actuator/refresh"
//
// echo "application-${params.ENVIRONMENT}.yml 배포 완료"
// }
// }
// }
stage('Build') {
when {
expression { params.DEPLOY_TARGET in ['ALL', 'WAS_ONLY'] }
}
steps {
script {
try {
sh 'chmod +x gradlew'
sh "./gradlew clean war -x test -Pprofile=${params.ENVIRONMENT}"
echo "Build 성공"
} catch (Exception e) {
error "Build 실패: ${e.getMessage()}"
}
}
}
}
stage('Unit Tests') {
when {
expression { params.DEPLOY_TARGET in ['ALL', 'WAS_ONLY'] }
}
steps {
script {
try {
sh "./gradlew test"
echo "Unit Tests 성공"
} catch (Exception e) {
error "Unit Tests 실패: ${e.getMessage()}"
}
}
}
}
stage('Backup') {
when {
expression { params.DEPLOY_TARGET in ['ALL', 'WAS_ONLY'] }
}
steps {
script {
sshCommand remote: [
name: 'WAS Server',
host: "${env.SERVER_IP}",
user: "${env.SERVER_USER}",
identityFile: "${env.SSH_KEY_PATH}",
allowAnyHosts: true
], command: """
if [ -f ${env.DEPLOY_FILE} ]; then
mkdir -p ${env.BACKUP_PATH}
cp ${env.DEPLOY_FILE} ${env.BACKUP_FILE}
rm -rf ${env.TOMCAT_HOME}/webapps/${env.WAR_FILE}
echo "기존 WAR 파일 백업 완료"
else
echo "백업할 WAR 파일이 없습니다"
fi
"""
}
}
}
stage('Deploy to Tomcat') {
when {
expression { params.DEPLOY_TARGET in ['ALL', 'WAS_ONLY'] }
}
steps {
script {
sshPut remote: [
name: 'WAS Server',
host: "${env.SERVER_IP}",
user: "${env.SERVER_USER}",
identityFile: "${env.SSH_KEY_PATH}",
allowAnyHosts: true
], from: "build/libs/${env.WAR_FILE}", into: "${env.DEPLOY_FILE}"
sshCommand remote: [
name: 'WAS Server',
host: "${env.SERVER_IP}",
user: "${env.SERVER_USER}",
identityFile: "${env.SSH_KEY_PATH}",
allowAnyHosts: true
], command: """
if nc -z localhost 8005; then
echo "Tomcat이 실행 중입니다. 종료 중..."
${env.TOMCAT_HOME}/bin/shutdown.sh
sleep 5
rm -rf ${env.TOMCAT_HOME}/webapps/${env.ROOT_NAME}
sleep 5
else
echo "Tomcat이 실행 중이지 않습니다."
fi
${env.TOMCAT_HOME}/bin/startup.sh
"""
echo "Deploy 완료 (${params.ENVIRONMENT} 환경, ${env.GIT_BRANCH} 브랜치)"
}
}
}
}
post {
success {
echo '배포가 성공적으로 완료되었습니다.'
}
failure {
script {
echo '배포에 실패했습니다. 이전 버전으로 롤백을 시도합니다.'
if (params.DEPLOY_TARGET in ['ALL', 'WAS_ONLY']) {
// WAR 파일 롤백
sshCommand remote: [
name: 'WAS Server',
host: "${env.SERVER_IP}",
user: "${env.SERVER_USER}",
identityFile: "${env.SSH_KEY_PATH}",
allowAnyHosts: true
], command: """
if [ -f ${env.BACKUP_FILE} ]; then
cp ${env.BACKUP_FILE} ${env.DEPLOY_FILE}
if nc -z localhost 8005; then
echo "Tomcat이 실행 중입니다. 종료 중..."
${env.TOMCAT_HOME}/bin/shutdown.sh
sleep 5
else
echo "Tomcat이 실행 중이지 않습니다."
fi
${env.TOMCAT_HOME}/bin/startup.sh
echo "롤백 완료"
else
echo "백업 파일이 존재하지 않아 롤백할 수 없습니다."
fi
"""
}
if (params.DEPLOY_TARGET in ['ALL', 'WEB_ONLY']) {
echo "Static 리소스 롤백이 필요합니다. 수동으로 진행해 주세요."
}
}
}
always {
echo '파이프라인 실행이 종료되었습니다.'
if (params.DEPLOY_TARGET in ['ALL', 'WEB_ONLY']) {
// 임시 디렉토리 정리
sh 'rm -rf static_resources'
}
}
}
}