카테고리 없음

[Spring] 최종: Docker 컨테이너화 및 CI/CD 파이프라인 구축

초코chip 2024. 11. 12. 09:06

운영 환경을 위한 도커 파일 작성(Dockerfile)

  1. 빌드 단계: 빌드 파일 생성 (.jar)
  2. 실행 단계: 빌드 파일 실행

./Dockerfile

# 1단계: 빌드 단계
FROM gradle:8.3-jdk17 AS builder

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

# Gradle 캐시를 활용하기 위해 필요한 파일만 먼저 복사
COPY build.gradle settings.gradle ./
COPY gradle gradle

# 의존성 미리 다운로드 (테스트 제외)
RUN gradle build --no-daemon -x test || return 0

# 전체 소스 코드 복사
COPY . .

# 프로젝트 빌드 (Spring Boot 프로젝트의 jar 파일 생성)
RUN ./gradlew bootJar --no-daemon -x test

# 2단계: 실행 단계
FROM openjdk:17-slim

# 환경 변수 설정 (필요 시 PORT 환경 변수 설정)
ENV PORT=8080

# app.jar로 jar 파일 복사
COPY --from=builder /app/build/libs/*.jar /app/app.jar

# 컨테이너 시작 시 실행할 명령어 설정
ENTRYPOINT ["java", "-jar", "/app/app.jar"]

# Spring Boot 기본 포트 (8080) 노출
EXPOSE 8080

 

 

 

깃헙 액션 파일 작성(deploy.yml)

.github/workflows/deploy.yml

name: Build, Push, and Deploy to EC2

on:
  push:
    branches:
      - main

jobs:
  build-and-push:
    runs-on: ubuntu-latest

    steps:
      - name: Check out the code
        uses: actions/checkout@v2

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v1

      - 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 ${{ secrets.DOCKER_USERNAME }}/spring-app:latest .
          docker push ${{ secrets.DOCKER_USERNAME }}/spring-app:latest

  deploy:
    needs: build-and-push
    runs-on: ubuntu-latest

    steps:
      - name: Deploy to EC2 with Docker Compose
        uses: appleboy/ssh-action@v0.1.8
        with:
          host: ${{ secrets.EC2_HOST }}
          username: ${{ secrets.EC2_USER }}
          key: ${{ secrets.EC2_SSH_KEY }}
          script: |
            cd /home/${{ secrets.EC2_USER }}
            docker-compose pull
            docker-compose down
            docker-compose up -d

 

Github Secrects 설정

 GitHub Actions에서 사용하는 민감한 정보나 환경 변수를 저장 

 

도커 관련 설정

  • 도커 아이디
  • 도커 패스워드 or 토큰(권장)

AWS EC2 관련 설정

  • {EC2유저}@{EC2주소}
  • EC2 접속 .pem 키

 

 

application.yml파일 처리는 어떻게..?

1. 환경변수 처리

2. .gitignore 처리

 

나는 1번 방식을 사용해서 진행

spring:
  datasource:
    url: ${SPRING_DATASOURCE_URL}
    username: ${SPRING_DATASOURCE_USERNAME}
    password: ${SPRING_DATASOURCE_PASSWORD}
    driver-class-name: com.mysql.cj.jdbc.Driver
  jpa:
    hibernate:
      ddl-auto: update
    show-sql: true
    properties:
      hibernate:
        format_sql: true
  sql:
    init:
      mode: always

server:
  port: ${PORT}

logging:
  level:
    root: info
    org.springframework.web: debug

jwt:
  secret: ${JWT_SECRET}
  expiration: ${JWT_EXPIRATION}

 

 

1번 방식으로 진행을 하면 github action을 사용히려면 환경 변수 처리한게 깃헙 시크릿 변수로 지정을 해야 빌드를 할 수 있음

 

그리고 ec2에 환경 변수 파일을 .env를 올려야 실행 가능함