Rinda E2E · Infrastructure Analysis

ReportPortal 연동 동작 원리

로컬·CI 양쪽에서 Playwright E2E 결과가 rp.rinda.ai 로 업로드되는 전체 경로를 코드 근거(파일:라인)와 함께 규명한 분석. 패키지 → 활성화 조건 → 토큰 발급 → 실시간 업로드까지.

패키지 @reportportal/agent-js-playwright ^5.4.1 엔드포인트 rp.rinda.ai/api/v1 프로젝트 rinda-alpha 2026-06-16

01업로드를 담당하는 패키지

@reportportal/agent-js-playwright ^5.4.1 — Playwright 공식 RP reporter가 업로드를 전담한다. package.json:53 (devDependencies), 등록은 playwright.config.ts:100reporter 배열.

보조 스크립트(rp-merge.mjs·rp-cleanup.mjs·rp-defect-classifier.mjs)는 별도 패키지 없이 native fetch 로 RP REST 를 직접 호출한다. ioredis/pg 는 DB·Redis 테스트용으로 RP 와 무관.

02활성화 조건 — AND 분기

playwright.config.ts:97 에서 reporter 가 배열에 추가되는 조건:

(CFG.rp || process.env.E2E_FORCE_RP) && process.env.RP_API_KEY
        ↓ true 일 때만
[ "@reportportal/agent-js-playwright", { …옵션… } ]
모드CFG.rpRP_API_KEY결과
local (기본)false업로드 OFF → html/json 로컬 리포터만
local + E2E_FORCE_RP=1override있음업로드 ON
alphatrue있음업로드 ON
alphatrue없음침묵 폴백 → 업로드 안 됨

모드는 E2E_MODE 또는 BASE_URL 의 localhost 여부로 결정 (config:33–37, 51–52). 조건 미충족 시 list/html/json 리포터는 항상 유지된다 (config:93–95).

03로컬 실행 흐름 — npm run test:rp:local

package.json:18sh 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). 절대 금지.

04인증 — superadmin 비번 → access_token → RP_API_KEY

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)에 보관.

05업로드 시점 — 실시간 스트리밍

agent-js-playwright 는 Playwright reporter 라이프사이클 훅으로 동작한다 — 사후 일괄이 아닌 실시간.

onBegin

launch 생성 (이름·attributes·description = rp-meta.mjscollectMeta())

각 test 종료

결과 push — test()=RP TEST(한국어 제목), spec 파일=SUITE

onEnd

launch finish + UUID 를 STDOUT 출력 (launchUuidPrint:true)

옵션

endpoint /api/v1, restClientConfig.timeout 60s, includeTestSteps:false

reporter 옵션: config:101–116

06로컬 vs CI(alpha) — 근본 차이는 키 획득 방식

구분로컬 test:rp:localCI/alpha run-e2e.sh
RP_API_KEY 출처superadmin 비번 → OAuth 토큰 매 실행 발급Infisical /reportportal export → docker --env-file 주입
superadmin 발급 로직있음 (rp-run.sh)없음npx playwright test 직접
실행 격리호스트 playwrightdocker playwright:v1.60 컨테이너
활성 트리거E2E_FORCE_RP=1 E2E_MODE=localBASE_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
핵심: 로컬은 superadmin 비번으로 매번 OAuth 토큰을 발급해 키를 얻고, CI 는 Infisical 에 저장된 키를 주입한다 — 이것이 두 경로의 유일·근본적 차이다. CI 경로엔 토큰 발급 로직 자체가 없다.

07부가 스크립트 — 전부 수동, 자동 체인 없음

grep 결과 package.json · rp-run.sh · run-e2e.sh · GHA 워크플로 어디에도 자동 호출이 없다. collectMeta() 만 업로드 시 동기 호출된다.

스크립트역할호출
rp-meta.mjslaunch 이름·attributes·description 생성업로드 시 항상 (config import)
rp-defect-classifier.mjs실패 test 를 PB/SI/AB/TI 분류 후 PUT /item수동 후처리
rp-cleanup.mjs1회성 launch(verify-/sanity-/debug-) 삭제, 정규 naming 보호수동
rp-merge.mjs병렬 독립 launch 를 POST /launch/merge 통합수동 CLI
rp-dashboard-probe.mjsrp.rinda.ai/ui 스크린샷 검증수동 디버깅

08Infisical 환경변수 반영 상태 (로컬 업로드 기준)

"로컬에서 테스트→결과 업로드" 에 필요한 변수가 Infisical 에 반영됐는지 대조한 결과.

변수 (rp-run.sh)필수.env.localInfisical /reportportal판정
RP_ENDPOINT기본값 有OK
RP_PROJECT기본값 有OK
RP_SUPERADMIN_USER기본 superadmin기본값
RP_SUPERADMIN_PW필수 (없으면 exit 1)누락
RP_API_KEY (CI 주입)CI 전용CI OK

CI(alpha) 경로

완전 반영됨. /reportportalRP_API_KEY 직접 존재 → run-e2e.sh 가 주입. superadmin 발급 불필요.

로컬 rp-run.sh 경로

키 이름 기준 미반영. 같은 값이 RP_INITIAL_ADMIN_PASSWORD 로만 존재(토큰 발급으로 동일 검증). RP_SUPERADMIN_PW 키가 빠져 현재 test:rp:localexit 1.

해결: A. .env.localRP_SUPERADMIN_PW 추가(로컬 즉시) · B. Infisical /reportportalRP_SUPERADMIN_PW alias 추가(팀 공유).

09한 줄 요약

업로드는 @reportportal/agent-js-playwright reporter 가 전담하며, (rp 활성 모드 ∨ E2E_FORCE_RP) ∧ RP_API_KEY 일 때만 켜진다. 로컬은 superadmin 비번으로 매번 토큰을 발급, CI 는 Infisical 키를 주입 — meta 는 항상 쓰이지만 classify·cleanup·merge·probe 는 모두 수동 운영 도구다.