sync: update from workspace (latest ITSM/CICD/DR changes)

This commit is contained in:
DESKTOP-TKLFCPR\ython 2026-06-01 19:59:45 +09:00
parent e768136e5d
commit cb8a99cb8d
15 changed files with 23 additions and 72 deletions

89
Jenkinsfile vendored
View File

@ -1,108 +1,59 @@
pipeline { pipeline {
agent any agent any
environment { environment {
DEPLOY_DIR = '/var/www/zioinfo' SRC = '/opt/zioinfo/src'
APP_DIR = '/opt/zioinfo/app' JAR_DIR = '/opt/zioinfo/app'
JAVA_HOME = '/usr/lib/jvm/java-21-openjdk-amd64' STATIC = '/var/www/zioinfo'
MVN = '/usr/bin/mvn' MVN = '/usr/bin/mvn'
NODE_HOME = '/usr/bin' NOTIFY = "${ITSM_BASE_URL}/api/messenger/webhook"
} }
options { options {
buildDiscarder(logRotator(numToKeepStr: '5')) buildDiscarder(logRotator(numToKeepStr: '5'))
timeout(time: 20, unit: 'MINUTES') timeout(time: 20, unit: 'MINUTES')
timestamps()
} }
stages { stages {
stage('Checkout') { stage('Checkout') {
steps { steps {
echo "브랜치: ${env.GIT_BRANCH ?: 'main'} | 커밋: ${env.GIT_COMMIT?.take(7) ?: '-'}"
checkout([ checkout([
$class: 'GitSCM', $class: 'GitSCM', branches: scm.branches,
branches: scm.branches,
userRemoteConfigs: scm.userRemoteConfigs, userRemoteConfigs: scm.userRemoteConfigs,
extensions: [ extensions: [[$class: 'SparseCheckoutPaths',
// manual/ 폴더 체크아웃 제외 (배포 대상 아님) sparseCheckoutPaths: [[path: 'frontend'], [path: 'backend']]
[$class: 'SparseCheckoutPaths', sparseCheckoutPaths: [
[path: 'frontend'],
[path: 'backend'],
]] ]]
]
]) ])
} }
} }
stage('Frontend Build') { stage('Frontend Build') {
steps { steps {
dir('frontend') { dir('frontend') {
sh ''' sh 'npm ci --legacy-peer-deps --prefer-offline 2>/dev/null || npm install --legacy-peer-deps'
echo "=== [1/3] React 빌드 ===" sh 'npm run build'
npm ci --legacy-peer-deps --prefer-offline 2>/dev/null || npm install --legacy-peer-deps
npm run build
echo "빌드 결과: $(ls ../backend/src/main/resources/static/assets/ | wc -l) 파일"
'''
} }
} }
} }
stage('Backend Build') { stage('Backend Build') {
steps { steps {
dir('backend') { dir('backend') {
sh ''' sh "${MVN} clean package -DskipTests -q"
echo "=== [2/3] Spring Boot 빌드 ==="
${MVN} clean package -DskipTests -q
JAR=$(find target -name "*.jar" ! -name "*sources*" | head -1)
echo "JAR: $JAR ($(du -sh $JAR | cut -f1))"
'''
} }
} }
} }
stage('Deploy') { stage('Deploy') {
when { branch 'main' }
steps { steps {
sh ''' sh """
echo "=== [3/3] 배포 ===" cp backend/target/*.jar ${JAR_DIR}/app.jar
JAR=$(find backend/target -name "*.jar" ! -name "*sources*" | head -1) cp -r backend/src/main/resources/static/. ${STATIC}/
systemctl restart zioinfo
# 앱 디렉터리 확인
mkdir -p ${APP_DIR} ${DEPLOY_DIR}
# JAR 배포
cp "$JAR" ${APP_DIR}/app.jar
# React 정적 파일 배포
cp -r backend/src/main/resources/static/. ${DEPLOY_DIR}/
# Spring Boot 서비스 재시작
systemctl restart zioinfo || true
sleep 4 sleep 4
systemctl is-active zioinfo || exit 1
# 헬스체크 """
for i in 1 2 3 4 5; do
HTTP=$(curl -s -o /dev/null -w "%{http_code}" http://localhost:8080/api/company 2>/dev/null)
if [ "$HTTP" = "200" ]; then
echo "배포 성공 (Spring Boot HTTP $HTTP)"
exit 0
fi
echo "헬스체크 ${i}/5 대기중 (HTTP: $HTTP)..."
sleep 3
done
echo "경고: Spring Boot 응답 없음 — 서비스 상태 확인 필요"
'''
} }
} }
} }
post { post {
success { success { sh "curl -sf -X POST ${NOTIFY} -H 'Content-Type:application/json' -d '{\"event\":\"build_result\",\"room\":\"ops\",\"success\":true,\"result_summary\":\"✅ zioinfo-web 배포 완료 #${BUILD_NUMBER}\"}' 2>/dev/null || true" }
echo "✅ 배포 완료: ${currentBuild.displayName} (${currentBuild.durationString})" failure { sh "curl -sf -X POST ${NOTIFY} -H 'Content-Type:application/json' -d '{\"event\":\"build_result\",\"room\":\"ops\",\"success\":false,\"result_summary\":\"❌ zioinfo-web 빌드 실패 #${BUILD_NUMBER}\"}' 2>/dev/null || true" }
}
failure {
echo "❌ 배포 실패: ${currentBuild.displayName} — 로그 확인 필요"
}
always {
cleanWs(cleanWhenNotBuilt: false, cleanWhenSuccess: false)
}
} }
} }

Binary file not shown.

After

Width:  |  Height:  |  Size: 228 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 228 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 278 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 200 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 203 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 181 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 192 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 188 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 364 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 222 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 170 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 174 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 170 KiB