CHIP THRONE

GitHub Actions 기반 빌드 파이프라인

문제

  • 코드를 변경할 때마다 테스트와 빌드, Docker 이미지 생성을 직접 확인해야 함
  • 기능을 다 만든 뒤 처음 배포하면 빌드와 배포 오류가 한꺼번에 나와 원인을 가리기 어려움

해결 전략

  • 헬스체크 하나만 있는 최소 버전으로 프론트와 백엔드, 배포 환경을 먼저 연결
  • PR과 main 반영 시 백엔드 테스트와 빌드, 프론트 빌드를 실행하고 백엔드 변경이 main에 반영되면 Docker 이미지를 GHCR에 저장

기술 선택 이유

  • Docker

    • JAR와 JRE를 이미지로 묶어 로컬과 CI, EC2의 실행 환경 통일
  • GitHub Actions

    • 빌드는 GitHub Actions가 맡고 EC2는 완성된 이미지만 실행
  • GitHub Container Registry (GHCR)

    • 코드와 이미지를 같은 GitHub 저장소 아래에서 관리

구현

CI 설정

name: CI

on:
  pull_request:
  push:
    branches: [main]

jobs:
  backend:
    name: 백엔드 빌드와 테스트
    runs-on: ubuntu-latest
    defaults:
      run:
        working-directory: backend
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-java@v4
        with:
          distribution: temurin
          java-version: '21'
          cache: gradle
      - run: chmod +x gradlew
      # 단위 테스트와 bootJar 생성을 한 단계에서 검증
      - run: ./gradlew build

  frontend:
    name: 프론트엔드 빌드
    runs-on: ubuntu-latest
    defaults:
      run:
        working-directory: frontend
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: '22'
          cache: npm
          cache-dependency-path: frontend/package-lock.json
      # lock 파일과 정확히 일치하는 의존성 설치
      - run: npm ci
      # TypeScript 검사와 프로덕션 번들 생성
      - run: npm run build

배포 설정

name: Deploy Backend

on:
  push:
    branches: [main]
    paths:
      - 'backend/**'
      - '.github/workflows/deploy-backend.yml'
  workflow_dispatch:

permissions:
  contents: read
  # GHCR에 Docker 이미지를 저장하기 위한 최소 쓰기 권한
  packages: write

jobs:
  build-image:
    name: Docker 이미지 빌드와 푸시(GHCR)
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: docker/login-action@v3
        with:
          registry: ghcr.io
          username: ${{ github.actor }}
          # 별도 PAT 대신 워크플로 기본 토큰 사용
          password: ${{ secrets.GITHUB_TOKEN }}
      - uses: docker/build-push-action@v6
        with:
          context: backend
          push: true
          # latest는 EC2 pull 배포용, SHA 태그는 버전 추적과 롤백용
          tags: |
            ghcr.io/${{ github.repository_owner }}/chipthrone-api:latest
            ghcr.io/${{ github.repository_owner }}/chipthrone-api:${{ github.sha }}

결과

  • 첫 기능을 만들기 전에 코드 변경부터 Docker 이미지 생성까지 이어지는 자동 경로 확보
  • 이후 기능도 같은 경로를 거치며 빌드와 배포 오류를 바로 확인

첫 CI 실행에서 백엔드 빌드와 테스트, 프론트 빌드가 모두 성공한 GitHub Actions 화면