Jenkins를 통한 CI구축을 완료했으니 CD까지 연결되어서 실제 배포시키는 과정을 진행해보자.
jenkins.plugins.publish_over.BapPublisherException: Failed to connect and initialize SSH connection. Message: [Failed to change to remote directory [/home/ubuntu/jenkins_build]]
에러 발생
...jenkins_build 디렉토리가 없어서 발생한 문제 디렉토리 생성으로 해결
Pipeline Syntax에서 Snippet Generator 기능을 사용
*.jar
로 설정위 순서에 맞게 Exec command 코드를 작성
# jar파일을 저장시킬 디렉토리로 이동
cd /home/ubuntu/jenkins_build
# 실행되고 있던 프로세스를 종료(save_pid.txt 파일 이용)
kill -9 `cat save_pid.txt`
# 파일 삭제
rm save_pid.txt
# jar 파일 실행
nohup java -jar demo-0.0.1-SNAPSHOT.jar > logs/demo.log 2>&1 &
# 마지막으로 실행된 백그라운드 프로세스의 프로세스 ID(PID) 저장
echo $! > save_pid.txt
Genereate Pipeline Script를 통해 코드 생성한 후 Pipeline Script에 추가
pipeline {
agent any
stages {
stage('Clone') {
steps {
sh 'pwd'
git branch: 'dev', credentialsId: 'qkrtprjs', url: 'https://lab.ssafy.com/qkrtprjs456/test.git'
}
post {
failure {
echo 'Repository clone failure !'
}
success {
echo 'Repository clone success !'
}
}
}
stage('Build'){
steps{
sh 'pwd'
sh 'chmod +x gradlew' // 실행 권한 추가
sh './gradlew bootJar'
}
post {
failure {
echo 'Repository build failure !'
}
success {
echo 'Repository build success !'
}
}
}
stage('Deploy'){
steps {
dir('build/libs') {
sshPublisher(
publishers: [sshPublisherDesc(configName: 'test', transfers: [sshTransfer(cleanRemote: false, excludes: '',
execCommand:
'''
cd /home/ubuntu/jenkins_build
kill -9 `cat save_pid.txt`
rm save_pid.txt
nohup java -jar demo-0.0.1-SNAPSHOT.jar > logs/demo.log 2>&1 &
echo $! > save_pid.txt
''',
execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: '*.jar')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)]
)
}
}
post {
failure {
echo 'Repository Deploy failure !'
}
success {
echo 'Repository Deploy success !'
}
}
}
}
}
지금까지 내가 작성한 파이프라인 Script는 dev 브랜치의 코드를 clone 하고 clone한 프로젝트를 기준으로 빌드를 진행해서 jar 파일을 생성한다. 그 후에 만들어진 jar 파일을 기준으로
-jar
명령어를 통해 애플리케이션을 구동시킨다.
CI/CD란 수정된 코드에 대해서 빌드와 테스트를 진행하고 문제가 발생하지 않았을때에 배포과정까지 수행되도록 자동화시키는 것.
하지만, 나의 CI/CD는 이미 merge된 코드를 클론해서 CI/CD를 진행시키는 파이프라인이다.
때문에 CI/CD 파이프라인을 수정하려 한다.
1. 개발하는 브랜치(팀원들 각각의 개인 브랜치)와 운영을 담당하는 브랜치(dev) 사이에 중간 브랜치를 생성(backend, frontend)
2. 팀원들이 각자 개발을 진행한 후에 중간브랜치로 PR을 진행 후 팀원들과 코드리뷰 후 merge
3. merge를 진행했을때에 클론따서 CI 파이프라인을 진행해서 문제가 없는지 확인
4. 문제가 없음을 확인하고 dev 브랜치로 PR 날리고 merge 진행
5. merge된 dev 브랜치를 기준으로 CI/CD 과정을 진행하여 서비스 배포 진행
추가적으로 Jenkins에서 merge가 승인되었을때에 파이프라인이 진행되도록 설정을 하면 merge후에 코드가 합쳐지는 과정에서 push도 인식하기때문에 CI/CD가 두번 반복되는 상황이 발생한다. PR에 Webhook을 걸어서 해당 브랜치가 merge되기 전에 임시로 합쳐보는 과정을 진행하는 것이 아니라면 push Webhook을 통해 진행하는 것을 추천한다.
배포시킨 프로젝트의 코드중 {퍼블릭ipv4}:{포트번호}/test 로 접속하면 HelloWorld를 출력하도록 코드를 작성
해당 과정에서 응답하는 데 시간이 너무 오래 걸립니다.
라는 문구 확인
정상적으로 화면이 뜨는 것을 확인