GitHub Actions와 Docker를 사용하여 Spring Boot 코드를 수정 후 main에 push 하면 자동으로 EC2 서버에 자동으로 도커 이미지가 실행되는 CD를 구축하고자 한다.
EC2 서버는 Ubuntu 20.04 프리티어를 사용했다.
CD 흐름은 다음과 같다.
Spring Boot 프로젝트 최상단에 Dockerfile 작성 ->
GitHub Actions 수행 시 (main에 push) Dockerfile 참고하여 도커 이미지 빌드 후 도커 허브 레파지토리에 push ->
EC2 서버에서 도커 이미지 pull 후 docker-compose.yaml 참고하여 docker-compose up
FROM openjdk:11
ARG JAR_FILE=build/libs/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
FROM : 베이스 이미지
ARG : 이미지 빌드 시 --build-arg로 넘길 인자
COPY : 이미지나 파일을 도커 이미지의 파일 시스템으로 복사
ENTRYPOINT : 이미지를 컨테이너로 띄울 때 항상 실행되어야 하는 명령어
name: Spring Boot & Gradle & Docker & EC2 CD
on:
push:
branches:
- main
permissions:
contents: read
jobs:
build:
runs-on: ubuntu-latest #ubuntu-20.04
steps:
# 기본 체크아웃
- name: Checkout
uses: actions/checkout@v3
# JDK version 설정
- name: Set up JDK 11
uses: actions/setup-java@v3
with:
java-version: '11'
distribution: 'temurin'
# 그래들 캐싱
- name: Gradle Caching
uses: actions/cache@v3
with:
path: |
~/.gradle/caches
~/.gradle/wrapper
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
restore-keys: |
${{ runner.os }}-gradle-
# main 설정 파일 생성 및 write
- name: Set .yml for main
run: |
# main 설정 파일 디렉토리로 이동
cd ./src/main/resources
touch ./application-database.yaml
echo "${{ secrets.MAIN_DATABASE_YML }}" >> ./application-database.yml
shell: bash
# Gradle build
- name: Build with Gradle
run: ./gradlew bootJar
# Spring 어플리케이션 Docker Image 빌드
- name: Build Docker Image For Spring
run: |
docker login -u ${{ secrets.DOCKER_USERNAME }} -p ${{ secrets.DOCKER_PASSWORD }}
docker build -t ${{ secrets.DOCKER_USERNAME }}/도커 레파지토리 이름 .
docker push ${{ secrets.DOCKER_USERNAME }}/도커 레파지토리 이름
# 서버에서 Docker 이미지 실행
- name: EC2 Docker Run
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.EC2_HOST }}
username: ubuntu
key: ${{ secrets.EC2_KEY }}
script: |
docker rm -f $(docker ps -qa)
docker rmi ${{ secrets.DOCKER_USERNAME }}/도커 레파지토리 이름
docker pull ${{ secrets.DOCKER_USERNAME }}/도커 레파지토리 이름
docker-compose up -d
체크아웃 -> JDK 버전 설정 -> 그래들 캐싱(속도 20~30% 정도 향상) -> secret에 저장한 yaml 파일 디렉토리에 쓰기 -> 그래들 빌드 -> 도커 이미지 빌드 후 레파지토리에 푸시 -> EC2 서버에서 도커 이미지 컨테이너로 띄우기
version: '3'
services:
spring:
container_name: spring
image: 도커 아이디/도커 레파지토리 명
expose:
- 8080
ports:
- 8080:8080
EC2 서버에 저장