Internal Infra Analysis · send-grid-test

ReportPortal 기반 E2E 자동QA 인프라 분석

2026-04 도입 · Playwright + ReportPortal + GitHub Actions 파이프라인 전수 분석

📅 분석일 2026-06-10 🌿 branch: alpha 🧪 249 spec ⚙️ workflow_dispatch (수동)
249
E2E spec (smoke 7 / critical 209 / db 6)
3
파이프라인 job (detect→e2e→notify)
5
defect 자동분류 (PB/AB/SI/ND/TI)
~1주
풀세팅 → 자동화 철수까지

1 전체 아키텍처

Playwright는 GitHub Actions 러너에서 실행되고, 결과는 alpha에 셀프호스팅된 ReportPortal로 업로드됩니다. RP 컨테이너는 외부 포트 노출 없이 nginx(rp.rinda.ai)만 유일 진입점입니다.

┌─ GitHub Actions (e2e-on-alpha.yml) ─────────────────────────┐
│  detect → e2e (matrix shard) → notify                       │
└──────────────┬──────────────────────────────────────────────┘
               │ npx playwright test  (https://alpha.rinda.ai 대상)
               ▼
   @reportportal/agent-js-playwright (reporter)
               │ launch 업로드 (RP_API_KEY)
               ▼
┌─ alpha 호스트 (docker) ─────────────────────────────────────┐
│  nginx(rp.rinda.ai) ──[reportportal external net]── rp-gateway:8080
│                                    (docker-compose.rp.yml 스택)
└─────────────────────────────────────────────────────────────┘
               │
               ▼ rp-defect-classifier.mjs  (PUT /item · defect 자동분류)
               ▼ notify job → Slack 배포알림 채널 집계 카드

2 단계별 동작 과정 (3-job)

Job 1 — detect · 영향 범위 산정

HEAD~1..HEAD diff(squash merge 전제)로 변경 파일을 분석해 실행 범위를 결정합니다.

변경 유형mode실행 paths
*.md / docs/skip실행 안 함
DB schema · drizzle · e2e/ · package.json · vite · routes · workflows · docker-compose.*.yml · nginxfullsmoke critical tests/db 전량
도메인 경로 (sequences / leads / email / dashboard)partialtests/smoke tests/db + 해당 도메인 critical

smoke + db는 항상 포함(빠른 sanity). FE·BE 경로를 동시 매칭하는 4개 도메인 레인 구성.

Job 2 — e2e · Playwright 실행 (matrix 샤딩)

#스텝내용
1Checkoutworkflow_run.head_sha 기준
2Infisical CLIv0.43.60 설치 + .deb 매직바이트(!<arch>) 무결성 검증
3시크릿 fetchuniversal-auth → /reportportal(RP_API_KEY) + /e2e(E2E_EMAIL/PW). E2E_EMAIL 없으면 skip
4Playwright 설치chromium · browser 캐시 키 = package-lock 해시
5테스트 실행E2E_BASE_URL=alpha.rinda.ai · playwright test $PATHS --shard=N/TOTAL
6아티팩트test-results + playwright-report 업로드 (7일, if: always())

timeout-minutes: 15 · fail-fast: false · 동시성 cancel-in-progress: true → 고빈도 배포 시 최신 1건만 실행, 이전 run 자동 취소.

Job 3 — notify · 집계 + Slack

전 shard 아티팩트의 report.jsonstats.{expected/unexpected/skipped/flaky} 합산 후 단일 Slack 카드 발송.

[Rinda - alpha] RP E2E full
• 자동QA 기능 테스트 · 최신 배포 1건만 실행
• 통과: N/M · 실패: X · 스킵: Y · flaky: Z
• PR: #NNNN · 리포트: Report Portal(rp.rinda.ai)

3 Playwright 설정 핵심

항목local 모드alpha 모드
workers20 (M4 Pro sweet spot)12
retries10
RP 업로드OFFON (RP_API_KEY 있을 때)
trace/video/screenshoton (FAST_MODE 시 on-failure 다운그레이드)

4개 Playwright project

setup(auth) → chromium(인증 의존) · chromium-noauth(*.noauth.spec.ts) · db(drizzle 직접, UI·auth 불필요). RP reporter는 includeTestSteps:false로 한국어 test 제목을 TEST로, spec 파일을 SUITE로 노출.

4 인증 흐름 (auth.setup.ts)

storageState 이중 캐시 검증으로 로그인 비용 제거:

  • 파일 TTL 30분 + JWT exp 만료 60초 전 아님 → 캐시 재사용 (실질 0초)
  • 무효화 시 uiLogin() 단일 경로(10초) — 과거 apiLogin/jwtLogin은 alpha dual-auth 구조에 재튕겨 폐기
  • 로그인 후 기본 워크스페이스 "린다세일즈"(id 고정) 주입 → 모든 spec이 동일 시드 데이터 기준 동작

5 RP 메타·후처리 스크립트

스크립트역할
rp-meta.mjslaunch 이름 <env>-<mode>-<shortSha> + attributes(env/mode/branch/commit/owner/risk/pr) 동적 생성
rp-defect-classifier.mjs실패 테스트를 PB·AB·SI·ND·TI 5종으로 자동분류 → RP API PUT /item. 5xx→PB, 셀렉터/타이밍→AB, DB다운/타임아웃→SI
rp-merge.mjs도메인별 분할 launch(leads/sequences/billing)를 1개로 병합
rp-cleanup.mjs오래된 launch 정리
analyze-report.mjsreport.json 로컬 분석

6 라이프사이클 타임라인

  • 2026-04-19 17:03 · #4819
    ReportPortal QA 플랫폼 alpha 도입 (compose external net + nginx + rp.yml)
  • 2026-04-19 17:34 · #4822
    alpha 배포에 RP .env.rp 생성 + reconcile
  • 2026-04-19 18:09 · #4830
    배포 후 E2E 스모크 + RP 자동 업로드
  • 2026-04-19 18:31 · #4833
    E2E 커버리지 확장 + nightly 풀 스위트
  • 2026-04-19 18:34 · #4834
    deploy/E2E 워크플로우 분리 + Slack 포맷 통일
  • 2026-04-21 · #5054
    ⬇️ alpha CI에서 RP reconcile/시크릿 export 제거 · docker-compose.rp.yml 삭제
  • 2026-04-26 · #5867
    ⬇️ Nightly E2E 워크플로우 제거

7 현재 상태 & 판정

측면상태
설계 완성도높음 detect→shard→RP 업로드→defect 분류→Slack 풀 파이프라인
운영 상태반쪽 workflow_dispatch 수동만 · RP 본체 compose 제거됨
잔존물nginx rp.rinda.ai 블록 + compose external network + 249 spec + 전체 RP 스크립트
이탈 사유full 모드 15분 timeout 히트 + nightly/CI reconcile 운영 부담
판정 — 2026-04-19 ReportPortal 자동QA를 하루 만에 풀스택으로 구축한 뒤, 1주 내 자동 트리거·nightly·RP reconcile을 걷어내고 테스트 코드(249 spec)와 수동 실행 골격만 살아있는 상태입니다. RP 본체가 alpha에서 실제 도는지는 ssh alpha "docker ps | grep -iE 'rp-|reportportal'"로만 확정 가능합니다.