2026 OpenClaw 프론트 실전:
원격 Mac에서 JUnit·trace 색인·stderr를 단일 PR 게이트 요약으로 묶어 돌려보내기
프론트 E2E에서 Playwright가 남긴 JUnit XML·trace zip·stderr를 PR 본문에 그대로 붙이면 토큰과 가독성이 무너집니다. 원격 Mac 러너가 경로를 고정하고 병합한 뒤 OpenClaw 게이트웨이 템플릿에 표·색인 머리·꼬리만 실으면 단일 PR 요약으로 재현됩니다. 연관 글 샤드 병합·토큰 E2E 요약·공개 블로그.
통증 첫째 샤드마다 JUnit 행이 흩어져 리뷰가 느리고 둘째 trace URL 나열로 코멘트가 비대해지며 셋째 병합 전 stderr가 중복됩니다. 경계는 병합 후 파일만 게이트에 넘기고 긴 로그는 아티팩트 URL에 남깁니다.
01 대조 PR에 실을 것과 아티팩트에 둘 것
| 구분 | 게이트웨이 입력 | 스토리지만 |
|---|---|---|
| JUnit | 병합 건수·실패 케이스 표 | 샤드 원본 XML |
| trace | 색인 상단 키와 총개수 | zip과 스토리지 경로 |
| stderr | 꼬리 몇 줄과 바이트 상한 | 전체 콘솔 |
02 보고서 경로 약속
루트는 artifacts/e2e/${RUN_ID}/ 샤드는 shard-${INDEX}/results.xml 병합은 merged/junit.xml 색인은 merged/trace-index.json 꼬리는 merged/stderr-tails.json입니다. RUN_ID는 PR 번호와 짧은 SHA 키는 testCaseId 우선 없으면 파일명으로 맞춥니다.
03 임계 전략
판정은 merged/junit.xml 실패 수만 사용합니다. flake 재시도는 실패 F에 대해 R=min(3,max(1,ceil(0.12×F)))로 샤드별 상한과 전체 덮개를 동시에 겁니다. stderr는 끝 2KB 여덟 줄 trace 색인은 본문에 세 키까지 노출합니다.
04 게이트웨이 측 템플릿
Markdown에는 표 한 장 실패 표본 세 줄 색인 머리 stderr 꼬리 블록만 둡니다. OpenClaw는 JSON 세 줄과 템플릿 슬롯을 채워 동일 커밋이면 코멘트를 갱신하고 비밀은 마스킹합니다. 브라우저 실행은 원격 Mac 셸에만 둡니다.
05 실패 재시도
네트워크 5xx나 runner detach는 지수 백오프 두 번 PR 코멘트는 직전 해시와 다를 때만 업로드합니다. 동일 실패가 R를 넘기면 쿼런틴 라벨을 JSON에 넣고 게이트를 빨강으로 고정합니다.
06 재현 단계 다섯
- RUN_ID 폴더를 만들고 샤드 산출물을 격리한다
- 단일 잡에서 JUnit을 병합하고 trace-index를 생성한다
- 케이스별 stderr 꼬리를 잘라 JSON으로 묶는다
- 임계와 재시도 상한을 적용해 gate 불리언을 만든다
- 게이트웨이가 템플릿을 채워 PR에 upsert한다
07 실행 스크립트 골격
node scripts/merge-junit.mjs --glob 'artifacts/e2e/$RUN_ID/shard-*/results.xml' --out merged/junit.xml
node scripts/build-trace-index.mjs --root artifacts/e2e/$RUN_ID --out merged/trace-index.json
node scripts/tail-stderr.mjs --cases merged/junit.xml --out merged/stderr-tails.json --bytes 2048 --lines 8
openclaw pr-summary --inputs merged/*.json merged/junit.xml --template templates/e2e-gate.md
로컬에서도 동일 명령으로 경로만 바꿔 재현할 수 있습니다.
병합 JUnit만으로 색을 정하고 trace·stderr는 요약만 PR에 남긴다 재시도는 실패 수 비례 상한으로 묶고 게이트웨이는 Markdown만 보낸다
WebKit·Chromium 고정이 필요하면 홈과 구매·대여에서 노드를 고르고 이 HowTo를 그대로 붙여 넣으면 됩니다.