Rinda E2E · Infrastructure Analysis
로컬·CI 양쪽에서 Playwright E2E 결과가 rp.rinda.ai 로 업로드되는 전체 경로를
코드 근거(파일:라인)와 함께 규명한 분석. 패키지 → 활성화 조건 → 토큰 발급 → 실시간 업로드까지.
@reportportal/agent-js-playwright ^5.4.1 — Playwright 공식 RP reporter가
업로드를 전담한다. package.json:53 (devDependencies), 등록은
playwright.config.ts:100 의 reporter 배열.
보조 스크립트(rp-merge.mjs·rp-cleanup.mjs·rp-defect-classifier.mjs)는
별도 패키지 없이 native fetch 로 RP REST 를 직접 호출한다. ioredis/pg 는 DB·Redis 테스트용으로 RP 와 무관.
playwright.config.ts:97 에서 reporter 가 배열에 추가되는 조건:
(CFG.rp || process.env.E2E_FORCE_RP) && process.env.RP_API_KEY
↓ true 일 때만
[ "@reportportal/agent-js-playwright", { …옵션… } ]
| 모드 | CFG.rp | RP_API_KEY | 결과 |
|---|---|---|---|
| local (기본) | false | — | 업로드 OFF → html/json 로컬 리포터만 |
local + E2E_FORCE_RP=1 | override | 있음 | 업로드 ON |
| alpha | true | 있음 | 업로드 ON |
| alpha | true | 없음 | 침묵 폴백 → 업로드 안 됨 |
모드는 E2E_MODE 또는 BASE_URL 의 localhost 여부로 결정 (config:33–37, 51–52).
조건 미충족 시 list/html/json 리포터는 항상 유지된다 (config:93–95).
npm run test:rp:localpackage.json:18 →
sh scripts/rp-run.sh --workers=4 (BASE_URL=localhost:5173)
rp-run.sh
├─ .env.local 로드 RP_ENDPOINT · RP_PROJECT · RP_SUPERADMIN_* [16–20]
├─ 기본값 세팅 endpoint=rp.rinda.ai/api/v1, project=rinda-alpha [22–25]
├─ RP_SUPERADMIN_PW 없으면 exit 1 [27–30]
├─ POST {RP_BASE}/uat/sso/oauth/token (-u ui:uiman)
│ grant_type=password → access_token 발급 [34–44]
├─ export RP_API_KEY=$access_token + E2E_FORCE_RP=1 E2E_MODE=local [46–48]
└─ exec npx playwright test "$@" → reporter 조건 충족 → 실시간 업로드 [54]
--reporter 를 인자로 주면 config 의 RP reporter 가 덮어써져 업로드가 안 된다 (rp-run.sh:53). 절대 금지.RP 5.15 의 영구 api-key REST(/api/v1/api-keys)가 gateway 404 라, 매 실행 직전 OAuth 토큰을 발급해 우회한다 (rp-run.sh:4–6).
POST {RP_BASE}/uat/sso/oauth/token
-H 'Content-Type: application/x-www-form-urlencoded'
-u 'ui:uiman'
-d grant_type=password&username=$RP_SUPERADMIN_USER&password=$RP_SUPERADMIN_PW
| jq -r '.access_token' # → RP_API_KEY [34–46]
토큰 수명 1h 이지만 매 실행 재발급하므로 사실상 영구. superadmin 비번은 .env.local(gitignore)에 보관.
agent-js-playwright 는 Playwright reporter 라이프사이클 훅으로 동작한다 — 사후 일괄이 아닌 실시간.
launch 생성 (이름·attributes·description = rp-meta.mjs 의 collectMeta())
결과 push — test()=RP TEST(한국어 제목), spec 파일=SUITE
launch finish + UUID 를 STDOUT 출력 (launchUuidPrint:true)
endpoint /api/v1, restClientConfig.timeout 60s, includeTestSteps:false
reporter 옵션: config:101–116
| 구분 | 로컬 test:rp:local | CI/alpha run-e2e.sh |
|---|---|---|
| RP_API_KEY 출처 | superadmin 비번 → OAuth 토큰 매 실행 발급 | Infisical /reportportal export → docker --env-file 주입 |
| superadmin 발급 로직 | 있음 (rp-run.sh) | 없음 — npx playwright test 직접 |
| 실행 격리 | 호스트 playwright | docker playwright:v1.60 컨테이너 |
| 활성 트리거 | E2E_FORCE_RP=1 E2E_MODE=local | BASE_URL=alpha → MODE=alpha → CFG.rp=true |
| launch 메타 | env=alpha | + PR · SHA (yml:184–186) |
| 시크릿 수명 | 토큰 1h 재발급 | env파일 실행 후 shred (run-e2e.sh:87) |
| 결과 통지 | 로컬 콘솔 | report.json + Slack |
grep 결과 package.json · rp-run.sh · run-e2e.sh · GHA 워크플로 어디에도 자동 호출이 없다. collectMeta() 만 업로드 시 동기 호출된다.
| 스크립트 | 역할 | 호출 |
|---|---|---|
rp-meta.mjs | launch 이름·attributes·description 생성 | 업로드 시 항상 (config import) |
rp-defect-classifier.mjs | 실패 test 를 PB/SI/AB/TI 분류 후 PUT /item | 수동 후처리 |
rp-cleanup.mjs | 1회성 launch(verify-/sanity-/debug-) 삭제, 정규 naming 보호 | 수동 |
rp-merge.mjs | 병렬 독립 launch 를 POST /launch/merge 통합 | 수동 CLI |
rp-dashboard-probe.mjs | rp.rinda.ai/ui 스크린샷 검증 | 수동 디버깅 |
"로컬에서 테스트→결과 업로드" 에 필요한 변수가 Infisical 에 반영됐는지 대조한 결과.
| 변수 (rp-run.sh) | 필수 | .env.local | Infisical /reportportal | 판정 |
|---|---|---|---|---|
RP_ENDPOINT | 기본값 有 | ✓ | ✓ | OK |
RP_PROJECT | 기본값 有 | ✓ | ✓ | OK |
RP_SUPERADMIN_USER | 기본 superadmin | — | — | 기본값 |
RP_SUPERADMIN_PW | 필수 (없으면 exit 1) | ✗ | ✗ | 누락 |
RP_API_KEY (CI 주입) | CI 전용 | ✓ | ✓ | CI OK |
완전 반영됨. /reportportal 에 RP_API_KEY 직접 존재 → run-e2e.sh 가 주입. superadmin 발급 불필요.
키 이름 기준 미반영. 같은 값이 RP_INITIAL_ADMIN_PASSWORD 로만 존재(토큰 발급으로 동일 검증). RP_SUPERADMIN_PW 키가 빠져 현재 test:rp:local 은 exit 1.
.env.local 에 RP_SUPERADMIN_PW 추가(로컬 즉시) · B. Infisical /reportportal 에 RP_SUPERADMIN_PW alias 추가(팀 공유).업로드는 @reportportal/agent-js-playwright reporter 가 전담하며,
(rp 활성 모드 ∨ E2E_FORCE_RP) ∧ RP_API_KEY 일 때만 켜진다.
로컬은 superadmin 비번으로 매번 토큰을 발급, CI 는 Infisical 키를 주입 — meta 는 항상 쓰이지만
classify·cleanup·merge·probe 는 모두 수동 운영 도구다.