GitHub Actions + Docker + EC2 CD 구축하기

wannabeking·2022년 8월 14일
1

회고

목록 보기
7/18

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



Dockerfile

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 : 이미지를 컨테이너로 띄울 때 항상 실행되어야 하는 명령어



.github/workflows/deploy.yml

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 서버에서 도커 이미지 컨테이너로 띄우기



docker-compose.yaml

version: '3'
services:

  spring:
    container_name: spring
    image: 도커 아이디/도커 레파지토리 명
    expose:
      - 8080
    ports:
      - 8080:8080

EC2 서버에 저장



profile
내일은 개발왕 😎

0개의 댓글