Springboot CI/CD With AWS, Jenkins, Docker 배포하기
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로 선택하여 진행합니다.




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
- 정상 가동되었습니다.

댓글을 사용할 수 없습니다.