SpringBoot 프로젝트에 CI/CD를 적용합니다. 아래 아키텍처로 진행합니다.

  • SpringBoot (gradle)
  • Ec2 2대 (Ubuntu)
  • S3 Bucket
  • Jenkins(CI)
  • CodeDeploy
  • Github Hook
  • Docker

사용될 SpringBoot Project: https://github.com/rlaehdals/blogProject

 

GitHub - rlaehdals/blogProject

Contribute to rlaehdals/blogProject development by creating an account on GitHub.

github.com

1. Ec2 인스턴스 2대 생성하기

Jenkins로 사용할 서버는 메모리가 작을 경우 오류가 뜨니 16GiB로 선택하여 진행합니다.

30GiB까지는 프리티어로도 사용가능하므로 해줍니다.
인스턴스 구별을 위해 Tag를 설정해줍니다. Tag 설정은 자유입니다.

48155는 내IP가 아닌 모두가 접근 가능하도록 변경해줍니다.(위의 사진으로 구성하면 오류가 발생합니다.)

 

키 페어 생성 및 사용법은 제 블로그에 있습니다. 확인해주세요.

위와 같은 방법으로 이제 배포가 될 Ec2를 하나 만들어주세요. (이것은 프리티어 사양으로 진행해도 무방합니다.)
저는 Blog-Project를 만들며, 이미 만들어져 있는 Ec2를 사용하겠습니다. 
두개 모두 탄력적 IP를 부여해줍니다. 해당 사항은 비용이 발생합니다.


2. IAM(사용자, 역할), S3, CodeDeploy 생성

  • IAM 사용자 생성 

 

 

csv 파일을 다운로드하셔도 되고 액세스 키 ID와 비밀 액세스 키를 복사하고 다른 곳에 적어주셔도 됩니다. 단 비밀 액세스 키는 외부로 유출하면 안 됩니다. 전 다운로드하여서 파일을 저장시키겠습니다.
  • S3 생성

 

  • 버킷 이름과 밑에 Tag에 Name:BlogProject로 하고 생성합니다.

  • IAM 역할 생성

 

  • ec2 인스턴스로 가서 역할을 등록해줍니다.

 

  • CodeDeploy역할 생성 

 

 

 

  • CodeDeploy 생성

 

  • 배포할 ec2를 선택합니다. 저는 Name:CREATE_AWS에 배포합니다.

  • 모든 설정은 끝났습니다. 이제 배포 준비를 하겠습니다.

3. Jenkins Ec2 설정 (접속 방법은 생략하겠습니다.)

sudo su
apt-get update -y
apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg-agent \
software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"
apt-get install docker-ce docker-ce-cli containerd.io
service docker start
docker run -d --name jenkins -p 48155:8080 jenkins/jenkins:jdk11
차례대로 입력해줍니다.
docker ps
  • 위의 명령어를 이용하여 컨테이너가 잘 실행됐는지 확인합니다.

  • 아래 명령어를 실행하고 나오는 것을 따로 복사해둡니다.
sudo docker exec -it jenkins bash // jenkins bash 쉘 접속
cat /var/jenkins_home/secrets/initialAdminPassword

  • Ec2:48155로 접속하고 복사해둔 것을 입력합니다.

약간의 시간이 소요됩니다.

  • 설치가 끝나면 앞으로 사용할 계정을 입력해줍니다. 

 

 

  • CI/CD할 프로젝트의 git을 적어줍니다.
  • ./gradlew clean build를 하여 jar가 생성되게 합니다. 

  • 순서대로 CodeDeploy Application이름, 배포 그룹, AWS Region, S3 이름, EC2에 배포할 파일입니다.
  • 그리고 Use Access/Secret keys를 누르고 사용자를 만들었을 때 얻은 키값들을 넣어줍니다.

4. Github WebHook 추가

  • 배포하려는 Repository -> Settings -> Webhooks -> add Webhook

  • 아래처럼 초록색 체크가 떠야 합니다.

5. 배포할 Ec2 설정

apt install -y awscli
cd /home/ubuntu/
sudo aws configure // 사용자 하면서 획득했던 key값들을 입력합니다.
wget https://aws-codedeploy-ap-northeast-2.s3.amazonaws.com/latest/install
chmod +x ./install
sudo yum install ruby
apt-get install -y -q gdebi-core
./install deb
sudo service codedeploy-agent status
  • 아래와 같이 뜬다면 성공입니다.

6. 배포 스크립트 만들기 (패키지 구성을 아래와 같이 해줍니다.)

  • deploy.sh
#!/bin/bash
BUILD_JAR=$(ls /home/ubuntu/app/build/libs/*.jar) # 실행될 jar가 위치한 곳
JAR_NAME=$(basename $BUILD_JAR)
echo "> build 파일명: $JAR_NAME" >> /home/ubuntu/deploy.log
echo "> build 파일 복사" >> /home/ubuntu/deploy.log
DEPLOY_PATH=/home/ubuntu/
cp $BUILD_JAR $DEPLOY_PATH
echo "> 현재 실행중인 애플리케이션 pid 확인" >> /home/ubuntu/deploy.log
CURRENT_PID=$(pgrep -f $JAR_NAME)
if [ -z $CURRENT_PID ]
then
echo "> 현재 구동중인 애플리케이션이 없으므로 종료하지 않습니다." >> /home/ubuntu/deploy.log
else
echo "> kill -15 $CURRENT_PID"
kill -15 $CURRENT_PID
sleep 5
fi
DEPLOY_JAR=$DEPLOY_PATH$JAR_NAME
echo "> DEPLOY_JAR 배포" >> /home/ubuntu/deploy.log
nohup java -jar -Dspring.config.location=classpath:/application.yml,/home/ubuntu/app/application-real-db.yml $DEPLOY_JAR >> /home/ubuntu/deploy.log 2>/home/ubuntu/deploy_err.log &
  • appspec.yml (codedeploy로 인하여 배포에 대한 설정을 가진 yml입니다.)
version: 0.0
os: linux
files:
- source: /
destination: /home/ubuntu/app # EC2 내부 배포 할 위치
overwrite: yes
permissions:
- object: /
pattern: "**"
owner: ubuntu
group: ubuntu
hooks:
ApplicationStart:
- location: scripts/deploy.sh # ApplicationStart 단계에서 해당 파일을 실행
timeout: 60
runas: ubuntu

 

7. CI/CD 확인하기 

  • 젠킨스로 접속하여 Build Now 누르기 or Webhook이 걸려있는 Repository에 push 하기

  • Build Now or push를 하게 된다면 아래에 Build가 성공한다면 초록색 실패한다면 빨간색이 뜹니다. (초반에 설정이 꼬여서 실패했네요..)

  • AWS CodeDeploy Application으로 가보면 배포가 성공했는지, 실패했는지 확인이 가능합니다.

 

  • Project가 정상적으로 돌아가나 확인해보겠습니다. {ec2-ip}:8080/으로 접속하여 정상적인 접속이 되는지 확인합니다. (아래는 페이지를 만들지 않아 뜨는 것이므로 정상입니다.)

  • 마지막으로 배포된 ec2의 log를 확인해보겠습니다.
cd /home/ubuntu
vim deploy.log
  • 정상 가동되었습니다. 

 

지금까지 Jenkins와 AWS를 이용한 CI/CD를 실습해봤습니다. 다음은 무중단 배포에 대한 실습을 진행해보겠습니다. 감사합니다.