Backend CI 설계 문서 - 100-hours-a-week/20-real-wiki GitHub Wiki

개요

  • 레포지토리: 100-hours-a-week/20-real-be
  • CI 도구: GitHub Actions
  • 트리거: Pull Request (main, develop 브랜치)
  • 파이프라인 구성: Lint → Unit Test → Integration Test → Build → JAR 산출물 저장 → Discord 알림 + Coverage Report 업로드

CI 설정 파일 (.github/workflows/ci.yml)

name: Backend CI Pipeline

on:
  pull_request:
    branches: [main, develop]

jobs:
  backend:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3

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

      - name: Lint (Prettier)
        run: prettier --check "src/**/*.java"

      - name: Unit Test (JUnit)
        run: ./gradlew test

      - name: Integration Test (Spring)
        if: github.ref == 'refs/heads/main' || github.ref == 'refs/heads/develop'
        run: ./gradlew integrationTest

      - name: Build (main only)
        if: github.ref == 'refs/heads/main'
        run: ./gradlew build

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

      - name: Upload JAR (main only)
        if: github.ref == 'refs/heads/main'
        uses: actions/upload-artifact@v3
        with:
          name: backend-jar
          path: build/libs/*.jar

      - name: Upload Coverage Report
        uses: actions/upload-artifact@v3
        with:
          name: backend-coverage
          path: build/reports/jacoco/test/html/

      - name: Discord Notify
        if: always()
        env:
          DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }}
        run: |
          STATUS=${{ job.status }}
          RUN_URL="https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}"

          MESSAGE="🔔 CI 결과: **${STATUS}**\n📦 Repo: \`${{ github.repository }}\`\n🔁 Branch: \`${{ github.ref_name }}\`"

          if [ "$STATUS" != "success" ]; then
            MESSAGE="${MESSAGE}\n❌ [실패 로그 보러 가기](${RUN_URL})"
          fi

          curl -H "Content-Type: application/json" \
               -X POST \
               -d "{\"content\": \"${MESSAGE}\"}" \
               $DISCORD_WEBHOOK

파이프라인 단계 요약

단계 역할 성공/실패 기준 산출물 위치
Lint Prettier로 자바 스타일 검사 규칙 위반 시 실패 -
Unit Test JUnit + Mockito 기반 단위 테스트 테스트 실패 시 실패 build/test-results/
Integration Test Spring 기반 통합 테스트 실패 시 실패 -
Build Gradle 빌드 및 jar 생성 빌드 실패 시 실패 build/libs/*.jar
Coverage Jacoco를 통한 커버리지 측정 리포트 생성 실패 시 중단 build/reports/jacoco/test/html/index.html
Artifact 저장 빌드된 JAR 저장 빌드 성공 시 저장 GitHub Artifacts: backend-jar
Coverage 저장 커버리지 리포트 저장 성공 시 업로드 GitHub Artifacts: backend-coverage
Discord 알림 CI 결과를 Discord로 전송 항상 실행 -

Secrets 설정

이름 용도
DISCORD_WEBHOOK Discord 알림 전송용 Webhook URL

실행 결과 확인 방법

  • GitHub의 Actions 탭에서 워크플로우 실행 이력을 확인할 수 있음
  • 실패한 경우에는 ❌ 아이콘이 표시되며, 해당 Step에서 로그 확인 가능

산출물 (Artifact) 다운로드 방법

  • main 브랜치에서 CI 성공 시, 다음 경로에서 결과물이 생성되어 GitHub Artifacts로 업로드됨:
    • build/libs/*.jar → backend-jar
    • build/reports/jacoco/test/html/ → backend-coverage
  • GitHub Actions 실행 내역의 하단 Artifacts 섹션에서 .zip 파일로 다운로드 가능

테스트 커버리지 (Jacoco)

  • JUnit으로 테스트를 실행한 후, JaCoCo로 커버리지 리포트를 생성함
  • 명령어: ./gradlew jacocoTestReport
  • 결과 위치: Artifacts 섹션의 backend-coverage