결론 : 파일 경로, Timestamp 포맷이 맞지 않아 발생했던 문제
AWS에서 사용했었던 롤링 배포 파이프라인 코드를 사용했는데, Deploy 부분에서 계속 오류가 나서
로그를 확인해보니 `No such file or directroy`가 확인되었다.
DB연동 없이도 작동하는 .jar파일을 옮겨야 하고, 해당 .jar파일은 `/build/custom-libs/`에 존재하는데 서로 경로가 맞지 않아 에러가 발생했던 것이다.
def getLatestJarFileName() {
def date = new Date()
def formattedTime = new SimpleDateFormat("yyMMdd_HHmm").format(date)
return "${env.WORKSPACE}/build/custom-libs/logging-sample-prj-${formattedTime}-no_db.jar" // 수정된 JAR 파일 경로
}
`getLatestJarFileName()`을 만들어주어 해당 경로를 지정하도록 선언해주었다.
`SimpleDateFormat("yyMMdd_HHmm")` : 타임스탬프 포맷을 240808_1343과 같은 형식으로 변경한다.
`yy`는 연도의 마지막 두 자리, `MMdd`는 월과 일, `HHmm`은 시와 분을 나타낸다.
`getLatestJarFildName()` : 현재 시간을 기반으로 빌드된 파일의 경로를 생성한다.
요번 spring 프로젝트 파일은 빌드하면 빌드 된 시간을 기점으로 파일명이 변경되는데, 이를 timestamping 또는 timestamp-based naming 이라고 하고, 각 빌드가 고유한 이름을 가지게 해서 버전 관리와 빌드 파일들이 덮어씌워지는것을 방지하는 기능을 한다.
Jenkins에서 파이프라인을 이용하여 Spring 애플리케이션을 클론, 빌드, 테스트, 배포하는 작업을 자동화 하는 코드를 첨부한다.
import java.text.SimpleDateFormat
import java.util.Date
def deployApp(targetServerIp, targetServerPort, jarFileName) {
def deployPath = '/home/ubuntu'
def runAppCommand = "nohup java -jar $deployPath/$jarFileName > nohup.log 2>&1 &"
// 서버에 파일을 SCP로 전송
sshagent(['KDT_Project3_NHN']) { // NHN Cloud에서 발급한 키 페어의 Jenkins Credential ID
// 기존 애플리케이션 프로세스 종료
sh "ssh -o StrictHostKeyChecking=no -p $targetServerPort ubuntu@$targetServerIp 'ps -ef | grep java | grep -v grep | awk \'{print \$2}\' | sudo xargs kill -9 || echo \"No process found\"'"
// 새로운 JAR 파일 배포 및 애플리케이션 시작
sh "scp -o StrictHostKeyChecking=no -P $targetServerPort $jarFileName ubuntu@$targetServerIp:$deployPath/"
sh "ssh -o StrictHostKeyChecking=no -p $targetServerPort ubuntu@$targetServerIp '$runAppCommand'"
}
}
def rollbackApp(targetServerIp, targetServerPort) {
def previousJarPath = 'libs/previous-log-tracking-app.jar'
def deployPath = '/home/ubuntu'
def runAppCommand = "nohup java -jar $deployPath/previous-log-tracking-app.jar > nohup.log 2>&1 &"
// 이전 버전의 JAR 파일을 배포하고 애플리케이션을 시작
sshagent(['KDT_Project3_NHN']) { // NHN Cloud에서 발급한 키 페어의 Jenkins Credential ID
// 기존 애플리케이션 프로세스 종료
sh "ssh -o StrictHostKeyChecking=no -p $targetServerPort ubuntu@$targetServerIp 'ps -ef | grep java | grep -v grep | awk \'{print \$2}\' | sudo xargs kill -9 || echo \"No process found\"'"
// 이전 버전 JAR 파일 배포 및 애플리케이션 시작
sh "scp -o StrictHostKeyChecking=no -P $targetServerPort $previousJarPath ubuntu@$targetServerIp:$deployPath/"
sh "ssh -o StrictHostKeyChecking=no -p $targetServerPort ubuntu@$targetServerIp '$runAppCommand'"
}
}
pipeline {
tools {
gradle "GRADLE" // Jenkins의 Gradle ID
}
agent any
environment {
CLONE_DIR = "${env.WORKSPACE}"
}
stages {
stage('Clone') {
steps {
echo "저장소를 클론 중입니다..."
git branch: 'main', url: 'https://github.com/lcl1380/log-tracking-app.git'
echo "저장소 클론 완료. 클론된 파일 경로: ${CLONE_DIR}"
}
}
stage('Build') {
steps {
echo "빌드 프로세스를 시작합니다..."
sh 'chmod +x ./gradlew'
sh './gradlew clean build'
echo "빌드 프로세스 완료."
script {
def jarFileName = getLatestJarFileName()
echo "빌드된 파일의 경로: ${jarFileName}"
}
}
}
stage('Test') {
steps {
echo "테스트 프로세스를 시작합니다..."
sh './gradlew test'
echo "테스트 프로세스 완료."
}
}
stage('Deploy A-Private Instance') {
steps {
script {
try {
echo "A-Private Instance에 애플리케이션을 배포 중입니다..."
def jarFileName = getLatestJarFileName()
deployApp('192.168.2.31', 22, jarFileName)
deployApp('192.168.2.83', 22, jarFileName)
echo "A-Private Instance에 애플리케이션 배포 성공."
} catch (Exception e) {
echo "배포 실패, 롤백을 수행합니다..."
rollbackApp('192.168.2.31', 22)
rollbackApp('192.168.2.83', 22)
echo "롤백 완료."
throw e
}
}
}
}
}
post {
success {
echo "배포가 성공적으로 완료되었습니다."
}
failure {
echo "배포에 실패했습니다. 롤백을 수행했습니다."
}
}
}
def getLatestJarFileName() {
def date = new Date()
def formattedTime = new SimpleDateFormat("yyMMdd_HHmm").format(date)
return "${env.WORKSPACE}/build/custom-libs/logging-sample-prj-${formattedTime}-no_db.jar" // 수정된 JAR 파일 경로
}
'🌥️Cloud Study🌥️ > TroubleShooting' 카테고리의 다른 글
[ Ansible ] DEPRECATION WARNING 해결 방법 (0) | 2024.08.22 |
---|---|
[ Jenkins ] 파이프라인 배포 : No such file or directory (0) | 2024.08.21 |
[ Prometheus ] active failed 오류 해결 (0) | 2024.08.09 |
[ NHN Cloud ] 파이프라인 배포 문제 해결 - 2 (502 Bad Gateway) (0) | 2024.08.08 |
오류 : Web server failed to start. Port 8080 was already in use. (0) | 2024.07.24 |