[Docker] Docker + Git Action을 활용하여 Spring Boot Project CI/CD 구축

박진우·2023년 10월 29일
0

시작하기에 앞서...

프로젝트의 전반적인 필수 기능들은 구현이 마무리되어가는 상태에서, 프로젝트의 깔끔한 마무리를 위해 여유가 있는 시점에 CI/CD를 학습하여 직접 적용해보고 싶었습니다. 학습한 내용이 비교적 부실하여 적용하는 데 힘들었지만, 많은 시행착오끝에 성공하여 후기글을 올려볼까 합니다.👏


1. CI/CD가 무슨 뜻이지?

CI/CD

1-1. CI (Continuous Integration) : "지속적인 통합"

어플리케이션의 새로운 코드 변경 사항이 지속적으로 Build & Test되어 공유 레포지토리(Git, SVN 등)에 통합하는 것

[CI의 핵심 목표]

  • 버그를 신속하게 찾아 해결
  • 새로운 업데이트의 검증 및 릴리즈 시간 단축

이와 같이 CI의 핵심 목표를 바탕으로 개발자는 온전히 애플리케이션 개발에만 집중할 수 있는 환경을 조성해준다는 것에 가장 큰 의미를 갖고 있습니다.

1-2. CD (Continuous Delivery & Deployment) : "지속적인 서비스 제공 & 배포"

  • Continuous Delivery : 공유 레포지토리(Git, SVN 등)에 자동으로 Release
  • Continuous Deployment : Production 레벨까지 자동으로 Deploy

결과적으로, CI는 새로운 소스코드의 빌드, 테스트, 병합까지를 의미하고,
CD는 개발자의 변경사항이 레포지토리를 넘어 클라이언트에게 제공되는 프로덕션(Production) 환경까지 릴리즈 되는 것을 의미합니다.


2. Docker, Git Action은 어떤 것들일까?

2-1. Docker

애플리케이션을 신속하게 구축, 테스트, 배포할 수 있는 소프트웨어 플랫폼

도커(Docker)는 '컨테이너(Container)' 라는 표준화된 유닛으로 패키징하며, 컨테이너에는 라이브러리, 시스템 도구, 코드, 런타임 등 소프트웨어 실행에 필요한 모든 것이 담겨져 있습니다.

[Docker를 왜 사용할까?]

  • 모듈성
    전체 애플리케이션을 분해하지 않고도 변경 또는 복구를 위해 애플리케이션의 일부를 분해하는 기능에 중점을 둡니다.

  • 계층 및 이미지 버전 제어
    Docker의 이미지 파일은 사용자의 실행 또는 복사와 같은 작업으로 인해 생성되는 '계층' 으로 구성되며, 계층들이 모여 단일 이미지로 결합됩니다.
    Docker는 이러한 계층을 재사용하여 새 컨테이너를 구축하는데, 중간 변경사항은 이미지 간에 공유되므로 속도, 크기 및 효율성이 향상됩니다.
    또한, 버전 제어를 통해 변경에 대한 제어도 완벽하게 수행할 수 있습니다.

  • 롤백
    모든 이미지에 내재된 계층을 활용하여 이전 버전으로 롤백이 편리합니다.

  • 신속한 배포
    각 프로세스에 대한 컨테이너를 생성하면 해당 프로세스를 새 애플리케이션과 빠르게 공유할 수 있으며, 컨테이너를 추가 또는 이동하기 위해 운영 체제를 부팅할 필요가 없으므로 배포 시간이 상당히 단축됩니다. 이를 바탕으로 컨테이너에서 생성한 데이터를 쉽고 비용 효율적으로 생성하고 제거할 수 있습니다.

2-2. Git Actions

Github에서 제공하는 CI/CD를 위한 서비스

Git Actions는 코드 저장소에서 커밋(commit) 또는 PR(Pull Request) 등 어떤 작업(event)이 발생하였을 때, 추가적인 특정 작업이 일어나게 해주거나 주기적으로 반복하여 실행시킬 수 있습니다.

Docker와 Git Actions에 대한 대략적인 개념을 알아보았으니, 이제 어떻게 적용하였는지 알아보도록 합시다!🙌


3. 프로젝트 CI/CD 환경 구축 실습

3-1. DockerFile 작성

프로젝트 root 디렉토리에 DockerFile 파일을 생성하여 넣어줍니다.
DockerFile은 도커 이미지 빌드를 위한 파일이며, 이 파일을 바탕으로 컨테이너가 실행되는 구조입니다.
내용을 잠시 확인해보면, base이미지를 openjdk:11로 JAR_FILE변소에 파일 경로를 등록하고, 해당 경로의 파일을 app.jar로 옮겨 컨테이너에서 java -jar /app.jar를 실행하겠다는 의미입니다.
즉, 코드 수정 직후 빌드파일이 만들어지면 컨테이너에서 실행되는 구조가 이루어지는 것입니다. 만약 jdk 버전이 다른 프로젝트라면, 알맞은 jdk 버전으로 맞춰주시면 됩니다.

3-2. Git Actions 환경 변수 설정

Repository의 Settings 메뉴에 들어가 좌측 하단의 Secrets and variables 메뉴의 Actions에 접근하여, 프로젝트의 환경변수로써 필요한 민감정보들을 생성해줍니다.

3-3. gradle.yml 생성 및 수정

Actions 메뉴에 접근하여 gradle.yml파일을 만들어줍니다.
프로젝트 현재 환경에 맞게 Java with Gradle을 선택하여 gradle.yml 파일을 생성해줍니다.

[steps 확인]

  1. Java 11 버전을 세팅합니다.

  2. Spring boot를 Gradle을 이용하여 빌드합니다.

  3. Docker 이미지를 빌드합니다.

  4. DockerHub에 로그인합니다.

  5. DockerHub에 PUSH 합니다.

  6. EC2에 원격접속하여 배포합니다.
    6-1. Docker 이미지를 pull합니다.
    6-2. 기존에 실행되었던 Docker 이미지를 stop합니다.
    6-3. 기존에 실행되었던 Docker 이미지를 rm명령어로 지워 깨끗한 상태로 만듭니다.
    6-4. 빌드한 Docker 이미지를 백그라운드로 실행합니다.

이제 Git Actions에 들어가 동작을 확인합니다!

3-4. Git Actions 동작 확인

✅Git Commit 메시지와 함께 정상 동작함을 확인할 수 있습니다.


해당 내역을 찍고 들어가보면 동작 과정을 세밀하게 확인할 수 있습니다.
이를 바탕으로 만약 에러가 발생한다면 해당 에러 로그를 확인하여 원인을 파악하고 수정할 수 있습니다. 😃


글을 마치며...

프로그래밍 적인 부분으로 볼 때 하나의 기능을 추가하는 것은 여러가지 참고 자료가 바탕이 된다면 쉽게 진행할 수 있었지만, CI/CD 환경 구축은 Docker와 Git Actions 활용 방법을 익히기 위해 기초적인 공부가 많이 필요해보였습니다. 따라서 구축하는데 버벅거리는 점이 너무 많았습니다.🥺

결과적으로 성공하였지만, Docker의 폭넓은 활용을 위해서라면 Docker 동작 과정 및 명령어에 대한 깊은 공부가 필요해 보입니다. 앞으로도 꾸준히 학습해야겠습니다.😎

profile
꾸준히 한 발씩 발전해나가는 모습을 기록합니다.

1개의 댓글

comment-user-thumbnail
2024년 5월 17일

너무 친절하고 사장님이 맛있어요

답글 달기