Cloud 과제 2단계: CI(지속적 통합) 파이프라인 구축 - 100-hours-a-week/5-yeosa-wiki GitHub Wiki

업무 개요

  • 업무 제목: CI 파이프라인 구축
  • 업무 설명:
    서비스 코드의 지속적 통합(Continuous Integration, CI) 환경을 구축하여 개발 단계에서 발생하는 빌드 오류, 테스트 누락, 코드 품질 저하 등을 자동으로 검출하고 피드백합니다.
    이는 DevOps 환경 구축의 **2단계(CI 도입)**이며, 후속 단계인 CD(지속적 배포) 구현의 기반이 되는 핵심 작업입니다.

CI 도입 필요성

실무적 필요성

  • 팀 규모 확장과 병렬 개발 증가
    • 기능별 브랜치에서 동시에 작업하는 인원이 많아짐에 따라 통합 시 충돌 및 오류 발생 가능성이 높아짐
  • 배포 주기 단축
    • 수동 빌드 및 테스트는 시간적 부담이 크고 신뢰도가 낮음
  • 신속한 피드백 필요
    • 코드 커밋 시 자동 테스트 및 품질 점검을 통해 버그 조기 감지 및 대응 가능

정량적 목표

항목 현재 목표
테스트 수행 시간 수동, 평균 20분 이상 자동화, 3~5분 이내
버그 발견 시점 QA 단계 커밋 직후 (CI 단계)
테스트 커버리지 수동 관리 JaCoCo로 자동 측정, 80% 이상 유지

CI 도구 비교 및 선택

주요 도구 비교

항목 GitHub Actions GitLab CI/CD Jenkins CircleCI
설정 간편성 ✅ 매우 쉬움 ✅ 쉬움 ❌ 복잡한 설치 필요 ⭕ 클라우드 기반
GitHub 연동성 ✅ 네이티브 ❌ 별도 연동 필요 ❌ Webhook 필요 ✅ 가능
러닝 커브 ✅ 낮음 ⭕ 중간 ❌ Groovy 필요 ⭕ 중간
유지보수 ✅ 완전 관리형 ✅ GitLab 관리형 ❌ 자체 서버 필요 ✅ SaaS 기반
Marketplace ✅ 매우 풍부 ⭕ 제한적 ⭕ 플러그인 많음 ⭕ 일부 존재
CI/CD 통합 ✅ 통합 가능 ✅ GitLab 내 통합 ✅ 고도화 가능 ⭕ CD 별도 구성 필요

선택 사유: GitHub Actions

  • GitHub 저장소 기반으로 바로 연결 가능
  • 러닝 커브가 낮고 도입 속도가 빠름
  • 풍부한 오픈소스 액션을 통해 재사용성 높음
  • Discord, Slack 등 시각화 및 알림 연동이 쉬움
  • **무료 크레딧(2,000분/월)**로 소규모 팀에게 적합

CI 파이프라인 설계

브랜치 전략

브랜치 역할 트리거 조건
hotfix/* 긴급 버그 수정 push, PR
feature/* 신규 기능 개발 PR 생성 시
dev 테스트 통합용 push, PR
main 운영 환경 배포용 PR 머지 시

파이프라인 구성 단계

단계 작업 내용 도구
Checkout GitHub 저장소 코드 clone actions/checkout
Build Spring Boot + React 빌드 Gradle, Node.js
Lint 코드 스타일 검사 (백: Checkstyle, 프: ESLint) Checkstyle, ESLint
Test 단위/통합 테스트 자동 실행 JUnit5, Jest
Coverage 테스트 커버리지 리포트 생성 및 업로드 JaCoCo, Jest
Notification 결과 알림 (성공/실패 여부) 전송 Discord Webhook

.github/workflows/ci.yml 예시

name: CI Pipeline

on:
  push:
    branches: [ "dev" ]
  pull_request:
    branches: [ "dev", "main" ]

jobs:
  build-and-test:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout code
        uses: actions/checkout@v3

      - name: Setup Java
        uses: actions/setup-java@v3
        with:
          java-version: '17'

      - name: Build with Gradle
        run: ./gradlew clean build

      - name: Run Tests
        run: ./gradlew test

      - name: Generate Coverage Report
        run: ./gradlew jacocoTestReport

      - name: Discord Notification on Failure
        if: failure()
        run: |
          curl -H "Content-Type: application/json" \
            -X POST \
            -d "{\"content\": \"❌ GitHub Actions 빌드 실패: [${{ github.repository }}](${{ github.server_url }}/${{ github.repository }})\n브랜치: ${{ github.ref }}\n커밋: ${{ github.sha }}\"}" \
            ${{ secrets.DISCORD_WEBHOOK_URL }}

CI 도입 성과 요약

항목 도입 전 도입 후 비고
테스트 시간 수동, 평균 20분 자동화, 평균 5분 병렬 처리로 시간 절감 가능
테스트 커버리지 비정기적 수동 측정 JaCoCo로 자동 측정 커버리지 리포트를 시각화하여 공유 가능
피드백 시점 QA 단계 커밋 직후 초기 개발 단계에서 버그 조기 발견 가능
코드 품질 점검 없음 Lint 도구로 자동 검사 일관된 코드 스타일 유지 가능
알림 및 대응 속도 빌드 실패 시 수동 확인 Discord로 즉시 알림 실패 즉시 팀원에게 자동 통보 가능

성능 개선 사례 (Before → After)

  • 도입 전

    • QA 단계에서 오류 다수 발견
    • 버그 수정까지 평균 1~2일 소요
    • 커밋 → 빌드 → 테스트 순서가 느슨하게 연결되어 있었음
  • 도입 후

    • 커밋 직후 즉시 테스트 및 빌드 수행
    • Discord 알림을 통해 팀원 간 빠른 공유
    • 평균 1시간 이내 오류 수정 가능
    • 테스트 커버리지 80% 이상 유지하며 코드 신뢰도 향상

CI 파이프라인 다이어그램

final_1차_ci drawio

[개발자]
   ↓ Push / PR
[GitHub Repository]
   ↓ Trigger
[GitHub Actions Workflow]
   ├── Checkout
   ├── Build (Spring Boot, React)
   ├── Lint (Checkstyle, ESLint)
   ├── Test (JUnit5, Jest)
   ├── Coverage Report (JaCoCo)
   └── Notification (Discord)

CI 설계 문서 요약

CI 도입 효과

항목 도입 전 도입 후 비고
테스트 시간 수동 20분 자동화 5분 병렬 처리 가능
테스트 커버리지 비정기 측정 자동 측정 JaCoCo 기반 시각화 가능
피드백 시점 QA 단계 커밋 직후 개발 초기 단계에서 문제 조기 발견 가능
코드 품질 점검 없음 자동 측정 일관된 코드 스타일 유지 가능

성능 개선 사례 (Before vs After)

  • 도입 전

    • 버그 발견 시점: QA 단계
    • 평균 수정 소요 시간: 1~2일
    • 코드 리뷰 및 테스트 누락 빈번
  • 도입 후

    • 버그 발견 시점: 커밋 직후 (CI 단계)
    • 평균 수정 소요 시간: 1시간 이내
    • 코드 커버리지 및 정적 분석 자동 수행으로 품질 향상