서식 수정 및 유지 보수가 많이 들어와 배포할 프로젝트가 매 주 있었다.
그래서 Jenkins에서 배포를 매우 자주 했었는데 문득 그런 생각이 들었다.
혹시 프로젝트가 무슨 문제가 생겨 잘 되고있던 서비스가 작동하지 않으면 어쩌지..?
그래서 Rollback job을 만들기로 했다.
Rollback Job 만들기
먼저 원래 있던 Job을 복사해서 만드려고 봤었다.
그래서 여기 저기 만져보니 빌드 후 스크립트가 실행되는게 아닌가..
나의 계획은 빌드를 진행할 때 backup 폴더에 현재 서비스의 war파일을 복사한 뒤
새 war 파일로 실행을 하는 것이다.
그래서 Rollback job을 실행할 경우 backup 폴더에 war 파일이 존재하면 현재 서비스의 war 파일을
backup 폴더에 war 파일로 대체 후 재실행
만약 war 폴더가 없을 경우 백업된 war 파일이 없다는 메세지 출력 이었다.
하지만 원래 job을 복사하니 빌드 진행 된 후에 스크립트가 실행되어 큰 의미가 없었다.
여기 저기 찾아본 뒤 Pipeline으로 job을 만들면 된다는 정보를 얻어 Pipeline을 만들었다.
pipeline {
agent any
stages {
stage('exist test') {
steps {
script {
def scriptResult = sh(returnStdout: true, script: 'ls /usr/test').trim()
if (scriptResult) {
echo "WAR 파일이 발견되었습니다."
} else {
error "WAR 파일이 발견되지 않았습니다. 파이프라인을 종료합니다."
}
}
}
}
stage('backup test') {
steps {
echo 'backup start'
}
}
stage('rollback test') {
steps {
echo 'rollback start!!'
}
}
}
}
테스트로 작성한 Pipeline이다.
여기서 위 적어준 경로에 들어가 war 파일이 있는지 확인 후 있으면 진행, 없으면 종료하는 로직을 만들고 싶었다.
테스트를 위해 빌드를 진행해보니 오류가 발생했다..
그래서 확인해 본 결과 /usr 폴더의 접근 권한은 root지만
Pipeline에서 접근을 시도하면 root 계정이 아니라 접근이 되지 않으면서 오류가 발생했었다.
나는 자꾸 'No such file or directory' 라고 뜨길래 왜 있는 폴더가 없다고 나오는지 몰랐지..
sudo 명령어도 시도해보고 chat gpt도 활용해봤지만 여전히 Pipeline에서는 접근이 불가능했다.
그래서 원래의 방법을 생각해보니 Jenkins에서 빌드 완료 시 실행되는 쉘 스크립트처럼
쉘 스크립트에서 실행을 하면 될 것 같았다.
그래서 접근 가능한 폴더에 쉘 스크립트를 만들고 Pipeline으로 그 쉘 스크립트를 실행을 하니까..!
성공했다...ㅎ
쉘 스크립트에는 접근이 가능하니까 쉘 스크립트에서 파일의 존재 여부를 판단한 후에 Rollback을 진행하면 되겠다.
Rollback 로직은 다음 기회에 정리해야겠다!