Github actions 활용 자동화 배포 (feat.Docker & AWS)

정석·2024년 9월 21일

TIL

목록 보기
39/40
post-thumbnail

프로젝트에서 Github actions 을 활용해 main 브랜치로 새로운 코드가 push 되거나 병합될 때
설정한 Aws ec2 로 빌드된 jar 파일과 Dockerfile 을 통해 해당 인스턴스에서 도커가 실행되고
Spring 이 실행된다.

0. 진행 전 작업

  • 인스턴스에 docker , jdk 설치
// jdk 버전에 맞게 설치
sudo yum install java-11-openjdk -y 

// docker 설치
sudo yum install docker -y 

sudo service docker start

// docker 권한 설정
sudo usermod -a -G docker ec2-user 


1. 깃허브 액션 workfolw 생성

name: Build and Deploy to AWS EC2

on:
  push:
    branches:
      - main  # main 브랜치로 푸시될 때만 실행

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      # 1. 리포지토리 체크아웃
      - name: Checkout repository
        uses: actions/checkout@v2

      # 2. JDK 설정
      - name: Set up JDK 17
        uses: actions/setup-java@v2
        with:
          java-version: '17'
          distribution: 'zulu'

      # 3. Gradle 빌드 실행 (테스트와 함께)
      - name: Build with Gradle
        run: ./gradlew build -x test --no-daemon

      # 4. SSH 키 설정
      - name: Setup SSH Key
        run: |
          echo "${{ secrets.EC2_SSH_KEY }}" > ec2-key.pem   # SSH 개인 키를 파일로 저장
          chmod 600 ec2-key.pem  # SSH 키에 적절한 권한 설정

      # 5. EC2로 SSH 접속 후 빌드 및 배포
      - name: Deploy to EC2
        run: |
          ssh -i ec2-key.pem -t -o StrictHostKeyChecking=no ubuntu@${{ secrets.EC2_HOST }} << 'EOF'
            cd docker-CICD-test/  # 프로젝트 경로로 이동
            git pull origin main   # 최신 코드 가져오기
            docker build -t my-java-app .  # EC2에서 Docker 빌드
            docker stop my-app || true  # 기존 컨테이너 종료
            docker rm my-app || true  # 기존 컨테이너 제거
            docker run -d -p 8080:8080 \
              --name my-java-app \
              -e "SPRING_PROFILES_ACTIVE=prod" \  # prod 프로파일로 실행
              my-java-app
          EOF

      # 6. SSH 키 파일 삭제 (보안)
      - name: Cleanup SSH Key
        run: rm ec2-key.pem


2. applicaiton.yml

  • 배포를 위한 RDS 접속을 위해 prod 설정을 추가했다.
spring:
  profiles:
    active: local
---

spring:
  application:
    name: fm-delivery

  jpa:
    hibernate:
      ddl-auto: update
    properties:
      hibernate:
        show_sql: true
        format_sql: true
        use_sql_comments: true

jwt:
  secret:
    key: 

---

# local
spring:
  config:
    activate:
      on-profile: local

  datasource:
    url: jdbc:mysql://localhost:3306/fm_server
    username: root
    password: 1234
    driver-class-name: com.mysql.cj.jdbc.Driver

  jpa:
    hibernate:
      ddl-auto: update

---

# prod
spring:
  config:
    activate:
      on-profile: prod

  datasource:
    url: jdbc:mysql://{RDS_END_POINT}/fm_server  # RDS
    username: admin
    password: fm_server
    driver-class-name: com.mysql.cj.jdbc.Driver

  jpa:
    hibernate:
      ddl-auto: update
    properties:
      hibernate:
        dialect: org.hibernate.dialect.MySQLDialect  # MySQL? Dialect


3. 프로젝트 내에 Dockerfile 생성

FROM openjdk:17-jdk-alpine

# JAR 파일을 이미지에 복사
COPY fm-delivery-0.0.1-SNAPSHOT.jar /app/fm-delivery-0.0.1-SNAPSHOT.jar

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

# 애플리케이션 실행 시 prod 프로필 활성화
ENTRYPOINT ["java", "-jar", "fm-delivery-0.0.1-SNAPSHOT.jar", "--spring.profiles.active=prod"]

0개의 댓글