[ NHN Cloud ] 파이프라인 배포 문제 해결

2024. 8. 8. 13:54·🌥️Cloud Study🌥️/TroubleShooting

결론 : 파일 경로, Timestamp 포맷이 맞지 않아 발생했던 문제

사진엔 한글로 되어있는데 Jenkins item명은 영어로 하는 게 낫다 ...

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
'🌥️Cloud Study🌥️/TroubleShooting' 카테고리의 다른 글
  • [ Jenkins ] 파이프라인 배포 : No such file or directory
  • [ Prometheus ] active failed 오류 해결
  • [ NHN Cloud ] 파이프라인 배포 문제 해결 - 2 (502 Bad Gateway)
  • 오류 : Web server failed to start. Port 8080 was already in use.
L_Chae
L_Chae
🎮😻🤓🖥✨
  • L_Chae
    Cherish
    L_Chae
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 🌥️Cloud Study🌥️
        • AWS
        • NHN
        • KT
        • Microsoft (Azure 900)
        • TroubleShooting
        • IaC
        • Etc
      • STUDY
        • English
        • Japanese
        • 개인정보보호 관련
      • 초등학교 AI 교육 진행
        • 2024학년도 1학년-2학년
        • 2025학년도 4학년
      • 2024 KDT 📕
        • Lecture
        • Study 📗
        • Study-JAVA
        • Project
        • etc
      • INTERLUDE ✦
        • 2022 SYSTEM STUDY
        • 2022 Winter Study
        • 2023 AutoMobility STUDY
        • 2023 Summer Study (CPPG)
        • 2023 Reversing STUDY
        • etc
      • Private🔒
        • MacBook 💻
        • Screenshot 🩷
        • Photo 🖼️
        • FFXIV - Backup 🎮
        • Tistory
      • PBL 📗
        • 논문 스터디
        • Backup
      • Project 🖤
        • 2022-2) 개인정보보호 소학회
        • 2022-2) winter GURU2 - iOS
        • 2023-1) PBL 3
        • 2023-2) PBL 4
        • 2024-1) SW-AI교육 실습 일지
      • CTF 🚩
        • 2022
        • 2023
      • News scrap 📰
        • 2022
        • 2023
      • 2022 공부 로그 🐯
      • 2023 공부 로그🐰
  • 블로그 메뉴

    • 글쓰기
    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    ansible galaxy
    N1
    JLPT N1
    deprecation warning
    jlpt n1 도전기
    멱등성
    ansible
    JLPT
    content collection
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
L_Chae
[ NHN Cloud ] 파이프라인 배포 문제 해결
상단으로

티스토리툴바