배포, 운영

[배포] Github Actions 활용한 Spring 백엔드 자동배포

Ash_jisu 2024. 12. 28. 12:00

Secrets 및 변수 설정

Secrets 설정 방법

  • .env  방식: properties 파일처럼 선언하고, Secret에 Name(key)와 Secret(Value를 등록
  • secret.properties 방식: 아래와 같이 Repository Secret에 Key-Value형태로 추가 - 이 방법으로 진행)
    • 이후 Workflow에서 secret.properties 파일을 생성하고, Secret의 내용을  echo 명령어로 작성


Workflow 작성

배포 과정 요약

  1. 코드 체크아웃: Github Actions는 매번 새로운 환경에서 실행되므로, 코드 저장소를 가져와야 함
  2. JDK 설정 및 의존성 설치: local에서 작업했던 스프링 버전에 맞추기
  3. mvnw 실행 권한 추가: Jar파일 파일 생성 시 필요한 Maven Wrapper에 실행 권한 부여
  4. secret.properties 생성: Secrets 내용을 properties 파일로 변환해 프로젝트에 추가 
  5. 프로젝트 빌드: -DskipTests 옵션을 사용하여 테스트를 제외하고 JAR 파일을 빌드
  6. EC2에 JAR 업로드: SCP 명령어를 사용해 EC2 서버에 JAR 파일을 업로드
  7. SSH 키 파일 권한 설정: SSH 키의 권한을 낮춰 EC2 접속 문제 방지(400권한 부여)
  8. Spring 서버 재시작: 기존 실행 중인 서버를 종료하고 새로 빌드한 JAR 파일로 애플리케이션을 재실행
  9. Spring 서버 작동 상태 확인: api중 하나를 실제로 요청해서 200ok가 잘 오는지 확인
name: Deploy Backend to EC2

on:
  push:
    branches:
      - dev/be # dev/be 브랜치에 푸시될 때 실행

jobs:
  deploy:
    runs-on: ubuntu-latest

    steps:
      # 1. 코드 체크아웃
      - name: Checkout repository
        uses: actions/checkout@v3

      # 2. JDK 설정 및 의존성 설치
      - name: Set up JDK
        uses: actions/setup-java@v3
        with:
          java-version: '17' # Spring Boot에 적합한 Java 버전
          distribution: 'temurin'

      # 3. mvnw 실행 권한 추가
      - name: Add execute permission to mvnw
        run: chmod +x ./mvnw

      # 4. secret.properties 생성 및 환경 변수 추가
      - name: Update secret.properties
        run: |
          touch ./src/main/resources/secret.properties
          echo "${{ secrets.APPLICATION_SECRETS }}" > ./src/main/resources/secret.properties

      # 5. 프로젝트 빌드
      - name: Install dependencies and build JAR
        run: |
          ./mvnw clean package -DskipTests # 테스트 제외하고 빌드

      # 6. EC2에 JAR 파일 업로드
      - name: Upload JAR to EC2
        uses: appleboy/scp-action@v0.1.2
        with:
          host: ${{ secrets.SERVER_IP }}
          username: ec2-user
          key: ${{ secrets.SSAFYTRIP_KEY }}
          source: target/SpringFrameWorkTrip-0.0.1-SNAPSHOT.jar
          target: /home/ec2-user/backend

      # 7. SSH 키 파일 생성
      - name: Create SSH key file
        run: |
          echo "${{ secrets.SSAFYTRIP_KEY }}" > /tmp/ssafytrip-key.pem
          chmod 400 /tmp/ssafytrip-key.pem

      # 8. EC2에서 JAR 파일 실행
      - name: Restart backend service
        run: |
          ssh -o StrictHostKeyChecking=no -i /tmp/ssafytrip-key.pem ec2-user@${{ secrets.SERVER_IP }} << 'EOF'
          pkill -f 'java -jar' || true # 기존 실행 중인 애플리케이션 종료
          nohup java -Duser.timezone=Asia/Seoul -jar /home/ec2-user/backend/target/SpringFrameWorkTrip-0.0.1-SNAPSHOT.jar > /home/ec2-user/backend/app.log 2>&1 &
          EOF

      # 9. 서버 상태 확인 (헬스 체크)
      - name: Health Check
        run: |
          sleep 35 # 서버 기동 시간 대기
          RESPONSE=$(curl -s -o /dev/null -w "%{http_code}" https://inssaroute.shop/api/attractions/guguns/1)
          if [ "$RESPONSE" -ne 200 ]; then
            echo "Health check failed. HTTP Status: $RESPONSE"
            exit 1
          fi
          echo "Server is healthy! HTTP Status: $RESPONSE"

 

 


수동 배포 참고

  • 이전에 작성한 아래 내용중 백엔드 관련 부분만 자동 배포로 전환했다고 생각하면 됩니다

2024.12.16 - [배포, 운영] - [배포] AWS EC2 생성 및 웹 프로젝트 배포

 

[배포] AWS EC2 생성 및 웹 프로젝트 배포

EC2 인스턴스 생성 및 설정EC2 생성 과정Amaozn Linux 2 vs Linux 2023에서 Linux 2를 선택한 이유아래글과 같은 오류도 있고 Linux2가 2018년 출시 이후 쌓아온 호환성과 풍부한 자료를 무시할 수 없다고 생각

developerjisu.tistory.com

 

 

 

댓글수1