Git에 Push 이벤트 발생시 자동으로 Jenkins 빌드까지 했으니 이번 포스팅에서는 Jenkins에서 EC2 서버 자동배포까지 해보겠습니다.
1. Jenkins SSH 설치
EC2 서버 배포를 위해 Jenkins 관리 -> 플러그인 관리에서 Publish Over SSH를 설치합니다.
2. SSH 연결 서버 정보 입력
Name | Job에서 표시할 이름 |
Hostname | 서버 IP |
Username | SSH 접근 계정 이름 |
Remote Directory | 업로드될 디렉토리 |
Jenkins 관리 -> 시스템 설정에서 배포할 서버 정보를 입력해 줍니다.
정보를 모두 입력했다면 Use password authentication, or use a different key 를 체크해줍니다.
그리고 고급을 눌러서 EC2를 생성할 때 받은 pem 키를 열어서 해당 값을 Key 부분에 전부 넣어줍니다.
마지막으로 Test Configuration을 눌러서 Success 가 나오는 것을 확인하고 저장합니다.
만약 Success가 나오지 않는다면 위에 입력한 정보가 맞는지, 배포할 EC2 서버에 SSH(22) 포트가 열려있는지 확인해야합니다.
2. Build 스크립트 작성
Jenkins 프로젝트 -> 구성에 들어가서 빌드 스크립트를 작성해줍니다.
저는 배포 후 수행할 스크립트를 프로젝트에서 관리하도록 했기 때문에 deploy 폴더를 생성해 jar, 스크립트 파일을 SSH로 전송하도록 작성했습니다.
Sources files | 배포할 폴더의 위치 |
Remove prefix | 배포할 파일만 전송할 수 있도록 prefix는 제외하는 역할을 합니다. A/B/*를 배포할 때 B/*만 배포하고 싶다면 A/를 넣어주면 됩니다. |
Remote directory | 업로드될 경로 |
Exec command | 전송이 끝난 후 실행할 명령어 |
3. 배포 후 실행할 스크립트 작성
위에 언급한 것처럼 프로젝트에서 scripts 폴더 생성 및 delpoy.sh 이라는 스크립트를 작성했습니다.
#!/bin/bash
REPOSITORY=/home/ubuntu/test
PROJECT_NAME=jenkins-springboot
echo ">>> Build 파일 복사"
cp $REPOSITORY/deploy/*.jar $REPOSITORY/
echo ">>> 현재 구동중인 애플리케이션 pid 확인"
CURRENT_PID=$(pgrep -fl jenkins-springboot | grep java | awk '{print $1}')
echo ">> PID : " $CURRENT_PID
if [ -z "$CURRENT_PID" ]; then
echo "구동중인 애플리케이션 없음."
else
echo ">>> kill -15 $CURRENT_PID"
kill -15 $CURRENT_PID
sleep 10
fi
echo ">>> 애플리케이션 배포"
JAR_NAME=$(ls -tr $REPOSITORY/*.jar | tail -n 1)
echo ">>> JAR NAME : $JAR_NAME"
chmod +x $JAR_NAME
echo ">>> $JAR_NAME 실행"
nohup java -jar \
-Dspring.config.location=classpath:/application.properties \
$JAR_NAME > $REPOSITORY/nohup.out 2>&1 &
배포가 완료되면 자동으로 deploy.sh 이 실행되어 스프링부트가 실행되는 것을 확인할 수 있습니다.
참고 :
https://wellbell.tistory.com/9?category=976634
'CI CD' 카테고리의 다른 글
Jenkins + SpringBoot + AWS EC2 배포 (2) (0) | 2021.11.28 |
---|---|
Jenkins + SpringBoot + AWS EC2 배포 (1) (0) | 2021.10.28 |
어플리케이션 배포 전략 (0) | 2021.10.23 |