DEVELOPMENT NOTE / CHIP THRONE

GitHub Actions 기반 빌드 파이프라인

문제

  • 기능을 모두 만든 뒤 통합하면 빌드·배포 오류의 원인을 분리하기 어려움
  • 기능을 얹기 전에 코드가 운영 환경까지 도달하는 최소 경로부터 검증

해결 전략

  • 헬스체크 하나만 가진 워킹 스켈레톤으로 프론트·백엔드·배포 환경을 먼저 연결
  • 백엔드는 GET /api/health, 프론트는 백엔드 연결 상태만 표시
  • 푸시마다 백엔드 테스트·빌드와 프론트 빌드를 실행하고 main 반영 시 Docker 이미지를 GHCR에 저장

기술 선택 이유

  • JAR와 JRE를 Docker 이미지로 묶어 로컬·CI·EC2의 실행 환경 통일
  • 빌드는 GitHub Actions가 맡고 EC2는 완성된 이미지만 실행해 1GB 인스턴스의 빌드 부담 제거
  • GHCR은 GITHUB_TOKEN으로 인증할 수 있어 코드와 이미지를 GitHub에서 함께 관리

결과

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

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는 Watchtower 배포용, SHA 태그는 버전 추적·롤백용
          tags: |
            ghcr.io/${{ github.repository_owner }}/chipthrone-api:latest
            ghcr.io/${{ github.repository_owner }}/chipthrone-api:${{ github.sha }}