Jenkins 에서 빌드한 Jar 파일 EC2 Instance 에 배포해서 실행시키기 본문
사용자가 Github에 변경사항을 저장하기 위해 Push 를 하면 Jenkins가 변경을 감지한다.
변경사항을 감지한 Jenkins는 Github의 프로젝트 내용을 clone하여 Jenkins 가 위치한 EC2 내부로 복사한 뒤 ./gradlew clean bootJar 을 실행하여 app.jar 파일을 생성한다.
이후 Jenkins의 Publish Over SSH 를 통해 생성된 jar 파일을 app을 배포하고자 하는 EC2로 이동시키고, 쉘 스크립트 혹은 java -jar app.jar 명령어로 실행시키면 된다.
진행 과정
Github의 Webhook 설정 및 Token, Credential 설정은 이미 완료한 상태로 가정하고 과정을 진행한다.
Publish Over SSH는 Jenkins를 실행시킬 때 자동으로 설치할 수 있는 플러그인이 아니기 때문에 수동으로 설치해야 한다. 해당 플러그인 설치 후 Jenkins 관리 -> System 설정의 Publish Over SSH 항목의 내용을 채워준다.
AWS를 사용할 경우, 인스턴스를 시작하기 위해 발급받은 Key를 이용해 진행시키면 된다. Passphrase와 Path to key를 빈칸으로 두고 Key 내부에 AWS 인스턴스를 실행시킬 때 설정한 .pem 키 값을 복사해서 넣어주면 된다.
이후 SSH Servers 추가 버튼을 클릭하여 내부 설정을 채워줘야 한다.
Name 칸에는 해당 서버의 명칭을 설정해두면 되고 Hostname 에는 EC2의 public IP 주소 Username에는 해당 EC2의 OS에 맞는 사용자명을 작성한다. Ubuntu로 OS를 설정했을 경우, ubuntu로 설정해주는 식.
Remote Directory에는 해당 사용자의 home directory 경로를 작성한다. 빈 칸을 전부 작성한 뒤 Test Configuration을 눌렀을 때 Success! 라고 표시되면 성공적으로 연결된 것이다.
연결이 성공적으로 진행되면 Pipeline Syntax 를 작성해야 한다.
Publish Over SSH 플러그인을 설치했을 경우 sshPublisher 항목을 Sample Step에서 선택할 수 있다. 만약 존재하지 않는다면 Jenkins를 재실행 해보자.
Name 칸에는 아까 전 설정했던 SSH Server의 이름을 선택해주고 Source files 에는 jar 파일이 위치한 경로와 jar 파일의 명칭을 작성해주면 된다. ex_) build/libs/*SNAPSHOT.jar
Remove Prefix에는 jar 파일의 경로인 build/libs/ 를 삭제해준다. Remove Prefix는 SSH Server로 전달할 파일의 명칭을 확정시키기 위해 설정하는 것이기 때문에 jar 파일의 이름만 정확하게 나와있도록 잘 설정해주자.
Remote Directory는 앱을 배포하고자 하는 EC2 서버의 폴더 경로를 설정해주면 된다. 이번 시간에는 deploy 폴더 내부로 jar 파일을 옮길 것이기에 /deploy 라고 작성해둔다.
Exec command는 jar 파일을 해당 EC2 서버에 옮긴 이후 실행시킬 명령어를 설정해줘야 하는데, jar 파일을 옮긴 뒤 바로 실행시키기 위해 미리 작성해둔 앱 실행 명령어가 적힌 쉘 스크립트 파일을 실행시킬 예정이기 때문에 쉘 스크립트를 실행하는 명령어를 작성해둔다.
sudo chmod +x /home/ubuntu/deploy/appstart.sh && /home/ubuntu/deploy/appstart.sh
이렇게 작성한 Pipeline Script를 동작시키고자 하는 Pipeline에 넣어주고 저장하면, Jenkins의 세팅은 모두 완료가 된 것이다.
Jenkins 서버와 App 배포용 서버를 모두 실행시킨 상태에서 Github에 변경사항을 Push하면
성공적으로 Jenkins가 동작하는 것을 확인할 수 있다.
만약 Jenkins Logs에서 App이 실행되는 것을 확인하고 싶다면 Pipeline Script의 verbose 옵션을 true로 설정해주면 된다.
'Public Cloud' 카테고리의 다른 글
[AWS] Elastic Block Storage (EBS) (0) | 2024.07.16 |
---|---|
[AWS] Slack을 사용해서 EC2 인스턴스 조작하기 (1) | 2024.07.15 |
[AWS] Elastic Network Interface (ENI) (0) | 2024.07.13 |
[AWS] Elastic Load Balancer (0) | 2024.07.11 |
AWS EC2 프리티어 환경에서 Jenkins 실행시키기 (0) | 2024.02.21 |