Docker & Github actions로 CI/CD 구축하기
도커와 Github Actions를 사용해 spring boot 샘플 프로젝트를 AWS EC2에 CI/CD하는 과정을 담은 글입니다.
(깃허브를 커밋하면 자동으로 EC2에 반영되도록 하는 CI/CD를 구축합니다.)
CI/CD 란 ?
지속적 통합(Continuous Integration)과 지속적 제공/배포(Continuous Delivery/Deployment)의 약자로, 소프트웨어 개발 프로세스를 자동화하여 더 빠르고 효율적으로 소프트웨어를 제공하는 방법론을 의미합니다.
목차
1. CI 과정 구축하기
1. Github Actions 환경변수 설정
2. Actions gradle.yml 생성
3. gradle.yml 수정
4. Docker 허브 확인 및 EC2 배포
2. CD 과정 구축하기(배포 자동화)
1. Github Actions의 self-hosted 수신 준비
2. gradle.yml 수정
3. 실행 결과 확인
1. CI 구축하기
Spring boot 애플리케이션을 app.jar로 빌드하고 도커 이미지를 도커 허브에 푸시하는 과정까지 단계입니다.
1-1. Github Actions 환경변수 설정
위치 : github repository > settings > Secrets and vaiables > Actions
도커 허브의 username과 password를 등록합니다.
1-2. Actions gradle.yml 생성
위치 : github repository > Actions > New workflow > Java with Gradle를 선택합니다.
CI 과정(도커 이미지 빌드, 도커 허브에 푸쉬) 을 Github Actions가 하도록 gradle.yml을 작성합니다.
1-3. gradle.yml 수정
gradle.yml 파일 내용을 수정합니다.
name: Java CI with Gradle
on:
push:
branches: [ "master" ]
pull_request:
branches: [ "master" ]
permissions:
contents: read
jobs:
# Spring Boot 애플리케이션을 빌드하여 도커허브에 푸시하는 과정
build-docker-image:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
# 1. Java 17 세팅
- name: Set up JDK 17
uses: actions/setup-java@v4
with:
java-version: '17'
distribution: 'temurin'
# 2. Spring Boot 애플리케이션 빌드
- name: Build with Gradle
run: ./gradlew build
# 3. Docker 이미지 빌드
- name: docker image build
run: docker build -t ${{ secrets.DOCKERHUB_USERNAME }}/sample:0.0.2 .
# 4. DockerHub 로그인
- name: docker login
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_PASSWORD }}
# 5. Docker Hub 이미지 푸시
- name: docker Hub push
run: docker push ${{ secrets.DOCKERHUB_USERNAME }}/sample:0.0.2
gradle.yml 파일을 수정한 뒤 Commit Changes를 누르고 Actions 탭에 들어가면 위 과정의 진행 상황을 볼 수 있습니다.
1-4. Docker 허브 확인 및 EC2 배포
Docker 허브에서 gradle.yml 파일에 명시된 sample:0.0.2 이미지가 푸쉬된 것을 확인 할 수 있습니다.
EC2에서 도커 이미지를 pull 받아와서 실행시켜보면 웹에서 접속이 원활하게 됩니다.
2. CD 과정 구축하기(배포 자동화)
도커 허브에 푸쉬된 이미지를 EC2에서 풀 받아와서 서버를 실행하는 부분을 자동화합니다.
self-hosted 방법을 사용하여 진행합니다.
2-1. Github Actions의 self-hosted 수신 준비
위치 : githun repository > Settings > Actions > Runners > New self-hosted runner로 이동합니다.
EC2 운영체제에 맞게 선택한 후 서버 터미널에 해당 명령어를 차례대로 입력합니다.
위와 같은 화면이 나옵니다. 따로 설정하지 않고 enter를 눌러 패스합니다.
$ sudo ./svc.sh install
$ sudo ./svc.sh start
명령어를 입력하여 Github Actions를 수신할 준비를 완료합니다.
2-2. gradle.yml 수정
도커 허브에 push된 이미지를 pull 받아와서 구동되고 있는 컨테이너를 중지하고 새롭게 컨테이너를 구동하는 내용입니다.
run-docker-image-on-ec2:
needs: build-docker-image
runs-on: self-hosted
steps:
# 1. 최신 이미지를 풀받습니다
- name: docker pull
run: sudo docker pull ${{ secrets.DOCKERHUB_USERNAME }}/sample:0.0.2
# 2. 기존의 컨테이너를 중지시킵니다
- name: docker stop container
run: sudo docker stop $(sudo docker ps -q) 2>/dev/null || true
# 3. 최신 이미지를 컨테이너화하여 실행시킵니다
- name: docker run new container
run: sudo docker run --name sample --rm -d -p 80:80 ${{ secrets.DOCKERHUB_USERNAME }}/sample:0.0.2
# 4. 미사용 이미지를 정리합니다
- name: delete old docker image
run: sudo docker system prune -f
기존 gradle.yml 파일에 해당 내용 추가합니다.
2-3. 실행 결과 확인
intelliJ에서 Controller 내용을 변경하고 github에 commit&push 해줍니다.
Gitgub Actions에서 gradle.yml 파일 내용을 순차적으로 실행하는 과정 및 상태를 확인할 수 있습니다.
build-docker-image(CI), run-docker-image-on-ec2(CD)를 성공하였습니다.
[참고 블로그]
https://e-room.tistory.com/171
Docker + Github Actions로 SpringBoot CI/CD 구축하기
목표 : 깃허브 커밋을 하면 자동으로 EC2에 반영되도록 하는 CD/CD를 구축한다. 지난번에는 Docker를 이용하여 Spring boot 애플리케이션을 EC2에 배포를 했습니다. 이번에는 해당 과정을 로컬환경에서
e-room.tistory.com