From 2c0514bd897f378c0e8990c6fc6312fa79198e11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=ED=98=84=EC=9A=B1?= Date: Mon, 15 Dec 2025 16:38:02 +0900 Subject: [PATCH] =?UTF-8?q?Jenkinsfile=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Jenkinsfile | 192 +++++++++++++++++++++++++++++++++++----------------- 1 file changed, 129 insertions(+), 63 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index d8eaabbc..bb7a5f12 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -5,23 +5,11 @@ pipeline { jdk 'JDK17' } - // parameters { - // choice(name: 'ENVIRONMENT', choices: ['dev'], description: '배포할 어플리케이션 profile 선택') - // choice(name: 'DEPLOY_SERVER_IP', choices: ['172.31.14.11'], description: '배포할 WAS 서버 IP 선택') - // string(name: 'GIT_REPO', defaultValue: 'http://172.31.18.11:3000/gcone/gconebo.git', description: 'Git 레파지토리 주소') - // } - - // parameters { - // choice(name: 'ENVIRONMENT', choices: ['stage'], description: '배포할 어플리케이션 profile 선택') - // choice(name: 'DEPLOY_SERVER_IP', choices: ['10.100.51.11','10.100.51.12'], description: '배포할 WAS 서버 IP 선택') - // string(name: 'GIT_REPO', defaultValue: 'http://172.31.18.11:3000/gcone/gconebo.git', description: 'Git 레파지토리 주소') - // } - environment { - SERVER_IP = "${DEPLOY_SERVER_IP}" + SERVER_IP = "${DEPLOY_WAS_SERVER_IP}" SERVER_USER = "tomcat" TOMCAT_HOME = "${ENVIRONMENT == 'dev' ? '/var/lib/tomcat' : '/usr/local/tomcat'}" - APP_NAME = "sakemall" + APP_NAME = "sake" ROOT_NAME = "ROOT" DEPLOY_PATH = "${TOMCAT_HOME}/webapps" PROPERTY_PATH = "${DEPLOY_PATH}/${APP_NAME}/WEB-INF/classes" @@ -31,6 +19,9 @@ pipeline { 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" } @@ -40,33 +31,39 @@ pipeline { steps { script { try { + echo "Setup parameters 출력" + echo "tomcat home here ${env.CATALINA_HOME}" echo "Setup parameters ${ENVIRONMENT}" - echo "tomcat home here ${env.TOMCAT_HOME}" + echo "Setup parameters 출력 종료" if("${ENVIRONMENT}" == "dev" ) { properties([ parameters([ choice(name: 'ENVIRONMENT', choices: ['dev'], description: '배포할 어플리케이션 profile 선택'), - choice(name: 'DEPLOY_SERVER_IP', choices: ['172.31.14.11'], description: '배포할 WAS 서버 IP 선택'), + 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://172.31.18.11:3000/gcone/gconebo.git', description: 'Git 레파지토리 주소') + 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_SERVER_IP', choices: ['10.100.51.11','10.100.51.12'], description: '배포할 WAS 서버 IP 선택'), + 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://172.31.18.11:3000/gcone/gconebo.git', description: 'Git 레파지토리 주소') + 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 "Checkout 실패: ${e.getMessage()}" + error "Setup parameters 실패: ${e.getMessage()}" } } } @@ -87,41 +84,93 @@ pipeline { } } - stage('Deploy only property') { + stage('Prepare and Deploy Static Resources') { when { - expression { params.DEPLOY_TARGET in ['PROPERTY_ONLY'] } + expression { params.DEPLOY_TARGET in ['ALL', 'WEB_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}" + // Static 리소스 준비 (Windows 환경) + sh 'mkdir static_resources' + sh 'cp -rf src/main/resources/static/* static_resources/' - // acutuator 호출 + // Static 리소스 압축 (static_resources 디렉토리 안의 내용만 압축) + sh 'tar -cvf static_resources.tar -C static_resources .' + + // Nginx 서버로 Static 리소스 압축 파일 배포 sshCommand remote: [ name: 'Nginx Server', - host: "${env.SERVER_IP}", - user: "${env.SERVER_USER}", + host: "${env.NGINX_SERVER_IP}", + user: "${env.NGINX_USER}", identityFile: "${env.SSH_KEY_PATH}", allowAnyHosts: true - ], command: "curl -X POST http://${env.SERVER_IP}:18210/actuator/refresh" + ], command: "mkdir -p ${env.NGINX_STATIC_PATH}" - echo "application-${params.ENVIRONMENT}.yml 배포 완료" + 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}" - bat "./gradlew.bat clean build -Pprofile=${params.ENVIRONMENT}" + sh 'chmod +x gradlew' + sh "./gradlew clean war -x test -Pprofile=${params.ENVIRONMENT}" echo "Build 성공" } catch (Exception e) { error "Build 실패: ${e.getMessage()}" @@ -131,11 +180,13 @@ pipeline { } stage('Unit Tests') { + when { + expression { params.DEPLOY_TARGET in ['ALL', 'WAS_ONLY'] } + } steps { script { try { - // sh "./gradlew test" - bat "./gradlew.bat test" + sh "./gradlew test" echo "Unit Tests 성공" } catch (Exception e) { error "Unit Tests 실패: ${e.getMessage()}" @@ -145,6 +196,9 @@ pipeline { } stage('Backup') { + when { + expression { params.DEPLOY_TARGET in ['ALL', 'WAS_ONLY'] } + } steps { script { sshCommand remote: [ @@ -168,6 +222,9 @@ pipeline { } stage('Deploy to Tomcat') { + when { + expression { params.DEPLOY_TARGET in ['ALL', 'WAS_ONLY'] } + } steps { script { sshPut remote: [ @@ -185,13 +242,12 @@ pipeline { identityFile: "${env.SSH_KEY_PATH}", allowAnyHosts: true ], command: """ - if nc -z localhost 8006; then + if nc -z localhost 8005; then echo "Tomcat이 실행 중입니다. 종료 중..." ${env.TOMCAT_HOME}/bin/shutdown.sh - sleep 60 - rm -rf ${env.TOMCAT_HOME}/webapps/${env.APP_NAME} + sleep 5 rm -rf ${env.TOMCAT_HOME}/webapps/${env.ROOT_NAME} - sleep 60 + sleep 5 else echo "Tomcat이 실행 중이지 않습니다." fi @@ -211,32 +267,42 @@ pipeline { failure { script { echo '배포에 실패했습니다. 이전 버전으로 롤백을 시도합니다.' - 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 8006; then - echo "Tomcat이 실행 중입니다. 종료 중..." - ${env.TOMCAT_HOME}/bin/shutdown.sh - sleep 10 + 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 "Tomcat이 실행 중이지 않습니다." + echo "백업 파일이 존재하지 않아 롤백할 수 없습니다." 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' + } } } } \ No newline at end of file