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 파이프라인 다이어그램

[개발자]
↓ 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시간 이내
- 코드 커버리지 및 정적 분석 자동 수행으로 품질 향상