Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[BE] CI / CD 구축 #155

Merged
merged 12 commits into from
Nov 22, 2024
Merged

[BE] CI / CD 구축 #155

merged 12 commits into from
Nov 22, 2024

Conversation

urinaner
Copy link
Owner

  • 💯 테스트는 잘 통과했나요?
  • 🏗️ 빌드는 성공했나요?
  • 🧹 불필요한 코드는 제거했나요?
  • 💭 이슈는 등록했나요?
  • 🏷️ 라벨은 등록했나요?

작업 내용

main.yml

name: Backend CI/CD using GitHub Actions & Docker

# 워크플로우 실행 조건 설정
on:
  push:
    branches: [ "main" ]
  pull_request:
    branches: [ "main" ]

jobs:
  build:
    runs-on: ubuntu-latest
    permissions:
      contents: read

    steps:
      # 코드 체크아웃
      - uses: actions/checkout@v4

      # 백엔드 빌드 환경 설정 (JDK 21)
      - name: Set up JDK 21
        uses: actions/setup-java@v4
        with:
          java-version: '21'
          distribution: 'temurin'

      # 백엔드 설정 파일 생성
      - name: Create backend configuration files
        run: |
          mkdir -p ./backend/src/main/resources
          cd ./backend/src/main/resources
          echo "${{ secrets.APPLICATION_YML }}" > application.yml
          echo "${{ secrets.APPLICATION_AWS_YML }}" > application-aws.yml

      # Gradle 설정
      - name: Setup Gradle
        uses: gradle/actions/setup-gradle@417ae3ccd767c252f5661f1ace9f835f9654f2b5

      # 백엔드 빌드 실행
      - name: Build Backend
        run: |
          cd backend
          chmod +x ./gradlew
          ./gradlew build -x test

      # 도커 이미지 빌드 및 푸시
      - name: Docker build & push
        run: |
          docker login -u ${{ secrets.DOCKER_USERNAME }} -p ${{ secrets.DOCKER_PASSWORD }}
          cd backend
          docker build -t ${{ secrets.DOCKER_USERNAME }}/backend:latest .
          docker push ${{ secrets.DOCKER_USERNAME }}/backend:latest

      # EC2 인스턴스에 배포
      - name: Deploy to EC2
        uses: appleboy/ssh-action@master
        with:
          host: ${{ secrets.EC2_HOST }}
          username: ubuntu
          key: ${{ secrets.EC2_PRIVATE_KEY }}
          script: |
            # 최신 도커 이미지 받아오기
            sudo docker pull ${{ secrets.DOCKER_USERNAME }}/backend:latest
            
            # 실행 중인 컨테이너 중지 및 제거
            sudo docker stop $(sudo docker ps -a -q) || true
            sudo docker rm $(sudo docker ps -a -q) || true
            
            # 새 컨테이너 실행
            sudo docker run -d -p 8080:8080 ${{ secrets.DOCKER_USERNAME }}/backend:latest
            
            # 사용하지 않는 이미지 정리
            sudo docker image prune -a -f

CI/CD 구축 가이드

개요

Docker를 사용하여 애플리케이션을 컨테이너화하고, EC2 인스턴스에 자동으로 배포.

사전 준비사항

1. Docker Hub 설정

  • Docker Hub 계정 생성
  • 리포지토리 생성 (backend, frontend)

2. EC2 설정

  • EC2 인스턴스 생성
  • Docker 설치:
sudo apt-get update
sudo apt-get install docker.io
sudo systemctl start docker
sudo systemctl enable docker
  • 필요한 포트 개방 (3000, 8080)

3. GitHub Repository 설정

다음 Secrets를 GitHub 레포지토리의 Settings → Secrets and variables → Actions에 설정:

  • DOCKER_USERNAME: Docker Hub 사용자명
  • DOCKER_PASSWORD: Docker Hub 비밀번호
  • EC2_HOST: EC2 인스턴스 IP 주소
  • EC2_PRIVATE_KEY: EC2 접속용 private key
  • APPLICATION_YML: 스프링 부트 application.yml 내용
  • APPLICATION_AWS_YML: AWS 관련 설정 파일 내용

디렉토리 구조

├── backend/
│   ├── Dockerfile
│   ├── gradlew
│   ├── src/
│   └── build.gradle
├── frontend/
│   ├── Dockerfile
│   ├── package.json
│   └── src/
└── .github/
    └── workflows/
        └── main.yml

주의사항

프론트 배포는 ec2 용량부족으로 실패했습니다..ㅜ
Closes #153

@urinaner urinaner requested a review from 2Jin1031 November 22, 2024 11:38
@urinaner urinaner self-assigned this Nov 22, 2024
@urinaner urinaner merged commit 395ce24 into main Nov 22, 2024
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

[BE] CI / CD 구축
1 participant