프로젝트를 하다보면 서버에 배포를 하게 된다. 계속 프로젝트를 업데이트 하면서 배포를 하게 될텐데 번거로운 작업들이 많기 때문에 CI/CD를 먼저 적용해놓기로 했다.
CI/CD를 하는 이유가 배포가 번거롭기 때문만은 아니다.
우선 CI/CD가 뭔지? 어떤 점이 좋은지 간단하게 정리를 해보자면 이렇다.
CI/CD는 자동화 기능을 사용하여 코드 개발 및 제공을 획기적으로 간소화할 수 있는 2단계의 프로세스다. 먼저 CI는 소스 코드 통합 및 버전 관리 등의 개발자 작업을 보다 효율적으로 수행할 수 있도록 함으로써 소프트웨어를 보다 신속하게 운영환경에 배치할 수 있도록 해주는 사전 단계다. 여러 개발자가 동시에 애플리케이션 개발 관련 코딩을 하더라도, 새로운 코드 변경 사항들이 빌드(컴파일) 및 테스트되어 정기적으로 공유 리포지토리(정보 저장소)에 통합된다. 따라서 모든 개발이 종료된 시점부터 코드 품질 관리를 시작했던 기존 방식의 단점(테스트 시 예상치 못한 충돌 발생)이 해소된다.
CI의 다음 작업으로 CD는 소프트웨어 테스트 및 배포를 자동화한다. 엄밀히 구분하면 이 CD는 2가지로 나뉜다. 먼저 지속적인 제공(Continuous Delivery)을 통해 CI에서 유효성 검증이 끝난 코드들을 저장소에 자동으로 릴리스 한다. 이를 통해 운영팀은 변경된 코드들을 저장소에서 가져와서 애플리케이션(프로덕션 환경)에 수동으로 배포할 수 있게 된다. 개발팀과 운영팀 사이에 의사소통이 좀 더 원활해지는 것이 장점이다.
최종 단계는 지속적인 배포(Continuous Deployment)다. 즉, 소프트웨어의 변경 사항이 테스트를 통과하자마자 자동으로 최종 사용자에게 배포된다. 따라서 사용자의 피드백도 즉각 반영하기 쉬워진다.
목표 : Github Actions과 Docker를 사용한 CI/CD 과정의 정리
시작 전
- Spring-boot 프로젝트
- AWS EC2 Instance 생성
- Docker Hub 셋팅
- 로컬 , EC2 Docker 설치
https://docs.docker.com/engine/install/ubuntu/
Install Docker Engine on Ubuntu
Jumpstart your client-side server applications with Docker Engine on Ubuntu. This guide details prerequisites and multiple methods to install Docker Engine on Ubuntu.
docs.docker.com
환경
- Java 17
- gradle
- M1 , ubuntu
- Spring boot 3.2.4
Github Actions + EC2 + Docker를 사용한 CI/CD의 대략적인 과정
- Spring 프로젝트 빌드 + 도커 이미지 생성
- Docker 로그인
- DockerHub에 이미지 Push
- EC2의 DockerHub에서 이미지 Pull
- 실행중인 Docker container 종료 및 새로 Pull 받은 이미지 실행
1. String-boot 프로젝트는
위의 페이지에서 필요한 버전과 기능들로 만들면 된다.
https://goddaehee.tistory.com/238
[스프링부트 (1)] 스프링부트 시작하기 (SpringBoot 프로젝트 설정 방법)
[스프링부트 (1)] 스프링부트 시작하기 (SpringBoot 프로젝트 설정 방법) 안녕하세요. 갓대희 입니다. 이번 포스팅은 [ 스프링 부트 기초. 스프링 부트란? 그리고 스프링 부트 프로젝트 생성 방법 ] 입
goddaehee.tistory.com
2. EC2 생성
https://sinclairstudio.tistory.com/474
[AWS] EC2 인스턴스 생성하기 (인스턴스 시작)
인스턴스란 EC2에서 사용하는 가상화 서버이다. 인스턴스는 1개에서 수천개로 확장할 수 있으며, 모든 region에서 사용할 수 있다. 또한 EC2 인스턴스에서 사용하는 블록기반 스토리지를 EBS(Elastic Bl
minjiwoo.kr
EC2까지 준비하고 Docker를 로컬과 EC2에 설치했다면 준비 완료
1. 로컬 Docker 설정
프로젝트 최상단에 Dockerfile을 생성
Dockerfile
# Dockerfile
# jdk17 Image Start
FROM openjdk:17
# 인자 설정 - JAR_File
ARG JAR_FILE=build/libs/*.jar
# jar 파일 복제
COPY ${JAR_FILE} app.jar
# 인자 설정 부분과 jar 파일 복제 부분 합쳐서 진행해도 무방
#COPY build/libs/*.jar app.jar
# 실행 명령어
ENTRYPOINT ["java", "-jar", "app.jar"]
Jar 파일 Build
./gradlew clean bootJar
Docker 로그인
$docker login -u [username]
# 이후 password 입력
Docker 이미지 생성
# 기본 커맨드
# (태그 생략가능:latest로 지정됨)
docker build -t [dockerHub ID]/[이미지명]:[태그명] [DockerFile위치]
# 입력 예시(마지막 . 포함해야함 현위치라는 뜻)
docker build -t dockerid123/test .
생성된 이미지를 확인하기 위해서는 docker images 명령어를 입력하면 확인 할 수 있다.
Docker 허브에 이미지 업로드
# docker push [DockerHub Id]/[image 파일명]
docker push dockerid123/test
2. EC2 Docker 설정
aws의 *.pem을 이용해서 ec2에 접속을 하고
Docker 이미지 pull
# 도커 이미지를 다운로드 해줍니다.
sudo docker pull [dockerHub Id]/[이미지명]
로컬에서 업로드한 이미지를 다운 받는다.
Docker 컨테이너 실행
# 명령어
# docker run -d -p [로컬 port]:[도커 port] [dockerHub ID]/[이미지명]
sudo docker run -d -p 8080:8080 dockerid123/test
여기까지 하게 되면 이미지를 통해서 프로젝트가 빌드되고 EC2에 접속하게 되면 프로젝트에 접속할 수 있게 된다.
이렇게 하면 기본적인 Docker를 활용한 배포까지 성공이다.
프로젝트를 진행하다보면 배포 할 일이 많은데 다음에는 배포를 자동으로 하는 방법을 해 볼 생각이다.