navis

GitHub Actions와 Docker를 이용한 AWS EC2 자동 배포 가이드 본문

AWS

GitHub Actions와 Docker를 이용한 AWS EC2 자동 배포 가이드

menstua 2024. 11. 8. 15:04
728x90

 

이번 글에서는 GitHub Actions를 사용해 Docker 이미지를 빌드하고, 이를 AWS EC2 서버에 자동으로 배포하는 과정을 다루겠습니다. Gradle로 Spring Boot 애플리케이션을 빌드하고, Docker 이미지를 EC2에 배포하여 자동으로 애플리케이션이 업데이트되도록 설정하는 방법을 소개합니다.


목차

  1. 준비사항 
    • 1.1 GitHub Secrets 설정하기
  2. Dockerfile 작성하기
    • 2.1 Dockerfile 생성
  3. GitHub Actions 워크플로우 설정
    • 3.1 GitHub Actions YHAML 파일 작성
  4. 코드 푸시 및 자동 배포 확인
    • 4.1 코드 푸시
    • 4.2 배포 결과 확인
  5. 마무리 및 참고 사항

 


1. 준비사항 ( GitHub  Secrets)

1-1. GitHub 저장소에 Secrets 설정하기

  • GitHub Actions에서 AWS EC2에 접속하고 필요한 환경 변수를 설정하기 위해 GitHub Secrets에 정보를 추가합니다.
  • GitHub 저장소의 Settings > Secrets and variables > Actions로 이동하여 아래 항목을 추가합니다.
    • AWS_EC2_HOST: EC2 인스턴스의 IP 주소
    • AWS_EC2_USER: EC2 인스턴스의 사용자 이름 (예: ubuntu)
    • AWS_EC2_SSH_KEY: EC2에 접속하기 위한 개인 SSH 키
    • 그 외 데이터베이스 정보, 이메일 정보 등 필요한 환경 변수 추가

 


2. Dockerfile 작성하기

2-1. Dockerfile 생성

  • 프로젝트의 루트 디렉토리에 Dockerfile을 생성합니다. 아래와 같은 내용을 포함합니다.
# Step 1: 베이스 이미지 선택 (Java 17 JDK)
FROM openjdk:17-jdk-alpine

# Step 2: 작업 디렉토리 설정
WORKDIR /app

# Step 3: 빌드된 Spring Boot JAR 파일을 복사
COPY ./build/libs/auth-0.0.1-SNAPSHOT.jar /app/portfolio.jar

# Step 4: 포트 설정 (Spring Boot 기본 포트 8080)
EXPOSE 8001

# Step 5: JAR 파일 실행 명령어 설정
ENTRYPOINT ["java", "-jar", "/app/portfolio.jar"]

 


3. GitHub Actions 워크플로우 설정

3-1. GitHub Actions YAML 파일 작성

  • .github/workflows/deploy.yml 파일을 생성하고, 아래와 같이 CI/CD 워크플로우 설정을 추가합니다.
name: CI/CD Pipeline

on:
  push:
    branches:
      - master

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout code
        uses: actions/checkout@v2

      - name: Set up JDK 17
        uses: actions/setup-java@v3
        with:
          java-version: '17'
          distribution: 'temurin'

      - name: Grant execute permission for Gradle
        run: chmod +x ./gradlew

      - name: Build with Gradle (Skip Tests)
        run: ./gradlew clean build -x test

      - name: Log in to Docker Hub
        uses: docker/login-action@v2
        with:
          username: ${{ secrets.DOCKER_USERNAME }}
          password: ${{ secrets.DOCKER_PASSWORD }}

      - name: Build and Push Docker Image
        run: |
          docker build -t junuyang/portfolio:latest .
          docker push junuyang/portfolio:latest

  deploy:
    runs-on: ubuntu-latest
    needs: build
    steps:
      - name: SSH to EC2 and deploy
        uses: appleboy/ssh-action@v0.1.9
        with:
          host: ${{ secrets.AWS_EC2_HOST }}
          username: ${{ secrets.AWS_EC2_USER }}
          key: ${{ secrets.AWS_EC2_SSH_KEY }}
          script: |
            # 최신 Docker 이미지 가져오기
            docker pull junuyang/portfolio:latest

            # 기존 컨테이너가 있으면 중지하고 제거
            if [ "$(docker ps -aq -f name=portfolio)" ]; then
              docker stop portfolio
              docker rm portfolio
            fi

            # 환경 변수를 사용하여 새 컨테이너 실행 및 네트워크 연결
            docker run -d --name portfolio -p 8001:8001 --network my_network \
              -e DB_URL="${{ secrets.DB_URL }}" \
              -e DB_USERNAME="${{ secrets.DB_USERNAME }}" \
              -e DB_PASSWORD="${{ secrets.DB_PASSWORD }}" \
              -e MAIL_USERNAME="${{ secrets.MAIL_USERNAME }}" \
              -e MAIL_PASSWORD="${{ secrets.MAIL_PASSWORD }}" \
              -e JWT_SECRET="${{ secrets.JWT_SECRET }}" \
              -e KAKAO_CLIENT_ID="${{ secrets.KAKAO_CLIENT_ID }}" \
              -e KAKAO_CLIENT_SECRET="${{ secrets.KAKAO_CLIENT_SECRET }}" \
              -e KAKAO_JAVASCRIPT_KEY="${{ secrets.KAKAO_JAVASCRIPT_KEY }}" \
              -e GOOGLE_CLIENT_ID="${{ secrets.GOOGLE_CLIENT_ID }}" \
              -e GOOGLE_CLIENT_SECRET="${{ secrets.GOOGLE_CLIENT_SECRET }}" \
              -e NAVER_CLIENT_ID="${{ secrets.NAVER_CLIENT_ID }}" \
              -e NAVER_CLIENT_SECRET="${{ secrets.NAVER_CLIENT_SECRET }}" \
              -e DISCORD_CLIENT_ID="${{ secrets.DISCORD_CLIENT_ID }}" \
              -e DISCORD_CLIENT_SECRET="${{ secrets.DISCORD_CLIENT_SECRET }}" \
              -e KAKAOPAY_ADMIN_KEY="${{ secrets.KAKAOPAY_ADMIN_KEY }}" \
              -e KAKAOPAY_CID="${{ secrets.KAKAOPAY_CID }}" \
              -e NAVERPAY_CLIENT_SECRET="${{ secrets.NAVERPAY_CLIENT_SECRET }}" \
              -e NAVERPAY_CLIENT_ID="${{ secrets.NAVERPAY_CLIENT_ID }}" \
              -e NAVERPAY_CHAIN_ID="${{ secrets.NAVERPAY_CHAIN_ID }}" \
              -e NAVERPAY_PARTNER_ID="${{ secrets.NAVERPAY_PARTNER_ID }}" \
              -e AWS_S3_BUCKET_NAME="${{ secrets.AWS_S3_BUCKET_NAME }}" \
              -e AWS_S3_REGION="${{ secrets.AWS_S3_REGION }}" \
              junuyang/portfolio:latest

            echo "Portfolio application has been deployed successfully and connected to my_network."

4. GitHub에 코드 푸시 및 자동 배포 확인

4-1. 코드 푸시

  • 모든 설정을 완료한 후, master 브랜치에 코드를 푸시합니다. GitHub Actions가 자동으로 빌드와 배포 프로세스를 시작합니다.

5-2. 배포 결과 확인

  • GitHub Actions에서 빌드와 배포 상태를 확인하고, EC2에 접속하여 docker ps 명령어로 애플리케이션이 정상적으로 실행 중인지 확인합니다.


5. 마무리 및 참고사항

이로써 GitHub Actions와 Docker를 이용한 EC2 자동 배포가 완료되었습니다! GitHub에 코드만 푸시하면 자동으로 빌드와 배포가 진행되어 편리하게 애플리케이션을 업데이트할 수 있습니다.