AWS EC2 + Jenkins + Github 활용한 Spring Boot CI/CD 구축
이번 포스팅에서는 AWS EC2서버에 젠킨스와 Github를 연동하여 Spring Boot 프로젝트가 자동 배포되도록 CI/CD를 구축해 보려고 합니다. 전 회사에서는 gitlab에 push후에 젠킨스에 들어가서 배포 버튼을 눌러서 배포하였지만, 자동으로 배포되는 환경을 가진 회사들도 많은 것 같아 공부하게 되었습니다.
AWS EC2는 만들어져 있다는 가정하에 글을 작성하도록 하겠습니다.
- Jenkins 설치 및 시작
- Jenkins & GitHub 연동
- Jenkins & Spring Boot CI/CD 구축
Jenkins 설치 및 시작
1. 젠킨스를 실행하기 위해서는 java도 필요하기 때문에 명령어를 통해 자바를 설치하도록 하겠습니다.
sudo yum install java-11-amazon-corretto.x86_64
2. yum 저장소 등록 및 import
sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key
// 만약 안되면
sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io-2023.key
3. jenkins 설치
sudo yum install jenkins
4. jenkins 실행
설치가 완료 되었으면, 아래 명령어로 젠킨스를 활성화하고 실행시켜 보도록 하겠습니다.
-- 젠킨스 서비스 활성화
sudo systemctl enable jenkins
-- 젠킨스 서비스 실행
sudo systemctl start jenkins
-- 젠킨스 상태 확인
sudo systemctl status jenkins
Active의 상태가 running으로 나온것을 보면 정상적으로 돌고 있음을 확인 할 수 있습니다.
젠킨스의 실행 포트를 보면 8080으로 되어있는 것을 볼 수 있는데, 젠킨스의 default 포트가 8080으로 설정파일에 입력되어서 그렇습니다. 하지만, 저는 8080포트는 다른곳에서 사용할 예정이라서 8081포트로 변경하려고 합니다.
sudo vi /usr/lib/systemd/system/jenkins.service
이 명령어를 사용하여 jenkins.service파일을 보면 포트를 기존 8080에서 8081로 변경하였습니다.
설정 후, 변경사항을 저장하기 위해서 아래 명령어로 데몬 재시작과 서비스를 재시작 합니다.
sudo systemctl daemon-reload
sudo systemctl restart jenkins
재시작하고 젠킨스 상태를 확인하는 명령어로 다시 확인해보면 포트가 8081로 변경됨을 확인 할 수 있습니다.
5. jenkins 접속
퍼블릭 IPv4:[설정한 포트 or 기본 포트 8080]으로 접속을 합니다.
8080 혹은 설정한 포트로 접근이 안되시면 ec2의 보안설정에서 인바운드규칙을 설정해주셔야 합니다.
아래 명령어로 password를 복사하여 입력합니다.
sudo cat /var/lib/jenkins/secrets/initialAdminPassword
Install suggested plugins을 클릭합니다.
모두 설치가 되면 계정 생성하는 화면이 나오게 됩니다.
계정을 만들면 젠킨스가 실행된 것을 볼 수 있습니다.
Jenkins & GitHub 연동
1. GitHub 토큰 발급
GitHub -> Settings -> Developer settings(왼쪽아래) -> Personal access tokens 해당 페이지에서 Generate new token을 클릭하면 아래와 같은 화면이 뜨게 됩니다.
Note(토큰이름)를 적고, repo, admin_hook 을 체크하고 토큰을 생성합니다.
빨간 부분을 복사하여 저장해둡니다.
2. Jenkins Credentials 등록
Jenkins 홈 -> Jenkins 관리 -> System Configuration(System) 클릭하고 쭉 내려오게되면 Name을 적고 Credentials를 추가하기위해 Add를 클릭합니다.
Kind를 Secret Text로 변경하고 Secret에 위에서 저장한 토큰(위에 빨간 부분)을 넣어줍니다.
Add Credentials도 완료하였다면, Test connection버튼을 클릭하고, 아래와 같이 나온다면 성공입니다.
Credentials verified for user "your ID", rate limit: 4999
3. 젠킨스 프로젝트 생성
젠킨스에 프로젝트 추가를 위해 Jenkins 홈 -> 새로운 Item 클릭!
Freestyle project 클릭후 진행!!
General에서 GitHub Project 클릭 후, Project Url을 적습니다.
소스코드 관리에서 Git을 클릭후 Repository URL, Credentials를 추가해줍니다.
Repository URL아래 빨갛게 나타나는 것은 해당 EC2에 git이 설치되어 있지 않아서 나오게 되는 현상이기 때문에 EC2서버에 깃을 아래 명령어로 설치하면 사라지게 됩니다.
sudo yum install git
Credentials항목에 Add를 클릭하면, 아래와 같은 창이 나오게 됩니다.
Username : GitHub ID
Password : access Token(아까 저장한 빨간 부분)
ID : 구분할 수 있는 ID
저장을 누르게되면, 젠킨스 홈에 프로젝트가 추가 된 것을 볼 수 있습니다.
해당 프로젝트로 들어가서 지금 빌드를 클릭하면 아래와 같이 빌드가 성공했음을 볼 수 있습니다.
Jenkins & Spring Boot CI/CD 구축
1. Jenkins, GitHub 웹훅 설정
빌드 버튼을 누르지 않아도, 깃허브에 푸시되면 자동으로 빌드가 되도록 Jenkins와 GitHub 웹훅을 설정하려고 합니다.
GitHub에 해당 프로젝트에 들어가서 Settings에 webhook버튼을 클릭하고 Add webhook버튼을 클릭합니다.
웹훅 설정
- Payload URL - http://[퍼블릭 Ipv4 주소]:[포트]/github-webhook/ (뒤에 github-webhook은 필수로 붙여줍니다)
- Content Type - application/json으로 변경해 줍니다.
젠킨스에서도 해당 프로젝트에 들어가서 구성을 클릭합니다.
빌드유발에서 아래와 같이 클릭합니다.
2. Build를 하여 *.jar파일 생성
Build Steps에서 Execute shell을 선택하고 아래와 같은 스크립트를 적어줍니다.
chmod +x ./gradlew
./gradlew clean build
chmod +x ./gradlew를 적은 이유는 ./gradlew clean build를 실행할때, bash: ./gradlew: Permission denied와 같이 권한이 없다는 에러가 발생하여 권한 변경을 위해 적어두었습니다.
만약 EC2 프리티어를 사용하고 계신분들은 ./gradlew clean build시 EC2 사양문제로 멈추는 현상이 발생하는데, 이러한 현상을 만나신다면 https://supern0va.tistory.com/24 를 참고하여 해결하시면 됩니다.
설정을 완료하고 깃허브에서 코드를 수정 후, push를 해보면 빌드가 정상적으로 진행되는 것을 볼 수 있습니다.
그리고 EC2 서버로 접속하여 /var/lib/jenkins/workspace/marcket/build/libs 경로로 진입하면, 아래와 같은 *.jar파일이 생성된 것을 볼 수 있습니다.
3. 생성된 *.jar파일 실행
빌드 후 조치에서 Post build task를 선택하고 *.jar파일을 실행시킬 스크립트를 작성합니다.
JAR_NAME=marcket-0.0.1-SNAPSHOT.jar
if [ -z "`ps -eaf | grep $JAR_NAME | grep -v grep`" ]; then
echo "not found $JAR_NAME"
else
ps -eaf | grep $JAR_NAME | grep -v grep | awk '{print $2}' |
while read PID
do
echo "Killing $PID ..."
kill -9 $PID
echo "$PID is shutdown!"
done
fi
nohup java -jar "/var/lib/jenkins/workspace/marcket/build/libs/$JAR_NAME" /dev/null 2>&1 &
스크립트 작성 후, 저장을 누르면 *.jar파일을 실행시킬 준비는 되었습니다.
다시 프로젝트를 수정 후 푸시, 커밋을 하게되면 아래와 같이 젠킨스에 빌드된 로그를 확인 할 수 있습니다.
정상적으로 프로젝트가 실행 되었고, 배포한 프로젝트를 확인 할 수 있습니다.
이번 포스팅에서는 AWS EC2 + Jenkins + Github 활용한 Spring Boot CI/CD 구축하는 법을 공부해보았습니다.
다음 포스팅에서는 NGINX를 설치하고, 어플리케이션의 port만 변경하여 실행시키는 무중단 Spring Boot CI/CD를 구축해보려고 합니다.