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 }}