컴퓨터과학/Spring

[Spring]Jenkins로 ec2 서버에 원격 배포하기 (publish over ssh 없이)

waspy 2022. 1. 19. 12:58

Jenkins - github 연동이 완료되었다고 가정합니다!

참고: Jenkins github와 연동하기 : https://goddaehee.tistory.com/258 (갓대희님 블로그)

 

기존 원격으로 ec2 서버에 jenkins로 빌드한 jar 파일을 배포하는 방법인 publish over ssh플러그인이 젠킨스 보안정책상 배포 중단되었습니다. (22.01.12)

https://www.jenkins.io/security/advisory/2022-01-12/

 

Jenkins Security Advisory 2022-01-12

Jenkins Security Advisory 2022-01-12 This advisory announces vulnerabilities in the following Jenkins deliverables: Descriptions CSRF vulnerability in build triggers SECURITY-2558 / CVE-2022-20612 Jenkins 2.329 and earlier, LTS 2.319.1 and earlier does not

www.jenkins.io

 

따라서 젠킨스의 excute shell을 이용해 원격으로 리눅스 서버에 jar 파일을 deploy를 해보겠습니다.

 

전체 프로세스는 다음과 같습니다.

1. ec2 서버에 서버 실행을 위한 deploy.sh 작성

2. Jenkins에서 excute shell 옵션을 통해 scp 명령어로 빌드된 .jar 파일 ec2 서버로 전송

3. excute shell 옵션 통해서 ssh 명령어로 ec2 서버에 있는 deploy.sh 실행

4. deploy.sh 실행이 완료되면 젠킨스 빌드 종료, 서버배포 완료

 

1. ec2 서버에 서버 실행을 위한 deploy.sh 작성

ec2 서버에 jar 파일이 위치하게 될 디렉토리에 다음 코드로 deploy.sh 를 작성합니다.

#deploy.sh
{
  {
      echo "exit existing server"
      kill -9 `ps -ef | grep 'java -jar' | awk '{print $2}'` #(1)
  } && {
      echo "start server"
      java -jar -Duser.timezone=Asia/Seoul 디렉토리/파일명.jar & #(2)
  }
} || {
        echo "start server"
        java -jar -Duser.timezone=Asia/Seoul 디렉토리/파일명.jar & #(3)
}

(1): 서버가 켜져있다면 종료합니다. 서버가 종료되었다면 (2)를 실행, 서버가 종료되지 않았다면 (3)을 실행합니다.

(2), (3): jar 파일을 실행합니다.

 

2. Jenkins에서 excute shell 옵션을 통해 scp 명령어로 빌드된 .jar 파일 ec2 서버로 전송,

3. excute shell 옵션 통해서 ssh 명령어로 ec2 서버에 있는 deploy.sh 실행

등록한 아이템 -> 구성 -> Build - Add build step 에서 Execute shell을 눌러줍니다.

 

 

 

 

 

 

 

 

excute shell 메뉴의 command에 다음과 같이 shell 코드를 작성하였습니다.

echo "transmit .jar file to server"
scp -i 서버접속key.pem 디렉토리/빌드.jar 서버계정@서버주소:저장위치 #1

echo "start deploy.sh"
ssh -i 서버접속key.pem 서버계정@서버주소 저장위치/deploy.sh & #2

#1 빌드된 jar 파일을 scp를 이용하여 서버에 전송합니다

#2 전송이 완료된 이후 서버의 deploy.sh를 실행합니다.

 

다음과 같이 작성하고 저장합니다.

 

4. deploy.sh 실행이 완료되면 젠킨스 빌드 종료, 서버배포 완료

 

저장 후 build now를 눌러서 테스트하면

 

 

 

 

 

console output

 

배포가 완료되었고 서버에 접속하여 정상 실행 되었는지 확인할 수 있습니다!

 

서버 실행 이후 정상 배포까지 확인하는 단계가 생략되어있어 위와같이 빌드가 성공적으로 실행되더라도 배포 과정에서 오류가 나지 않았다는 것을 보장하지 않습니다.

 

제 경우에도 간헐적으로 서버가 정상적으로 배포가 되지 않는 오류가 발생하였습니다

(기존 실행되어있던 서버 종료가 정상적으로 이루어지지 않는경우가 있었음)

정상 배포가 안되는 케이스 로그를 확인하여 알맞게 쉘을 수정하거나 다른 방법으로 배포하는 방법을 찾아봐야할 것 같습니다!

 

감사합니다.

 

반응형