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