2026 OpenClaw 프론트 실전:
Sentry 릴리스 diff·오류 클러스터링 → 스모크 체크리스트
프론트 번들을 올리는 것만으로는 부족합니다. 새 Sentry 릴리스가 직전 안정 배포 대비 얼마나 새 오류 덩어리를 만들었는지 알아야 배포를 승인할 수 있습니다. 원격 Mac에서 그 비교를 스크립트로 고정하고, 이슈를 테마별로 묶어 OpenClaw에 사람이 돌리던 스모크와 같은 짧은 체크리스트로 넘기면 배포 전 자동화가 한결 단순해집니다. 이 글은 최소 자격 증명·curl+jq 템플릿·규칙 표·산출물·FAQ까지 같은 순서로 재현할 수 있게 정리했으며, 같은 흐름을 브라우저 스모크나 E2E 로그 트리아지 옆에서 돌릴 수 있습니다.
01 OpenClaw 게이트웨이와 API 자격 증명 최소 구성
신뢰 경계를 가장 작게 유지하세요. 원격 Mac에 OpenClaw를 설치하고 저장소 워크스페이스를 가리키며, 에이전트 사용자가 소스는 읽고 .openclaw/reports/<git-sha>/에는 쓸 수 있게 합니다(이 트리는 버전 관리에서 제외). Sentry에는 조직·프로젝트·이슈 메타데이터 조회에 필요한 읽기 전용 내부 연동 토큰만 발급하고, 배포 레코드 쓰기나 멤버 관리 권한은 별도 자동화가 담당할 때만 분리해 주세요.
SENTRY_AUTH_TOKEN, SENTRY_ORG, SENTRY_PROJECT, 선택적 SENTRY_HOST까지 export합니다(SaaS에서는 기본값 https://sentry.io). 자체 호스트면 리버스 프록시 URL과 맞춥니다. Markdown 요약에 토큰을 절대 넣지 말고, 건수·fingerprint·공개 이슈 식별자만 기록하세요. GitHub Actions 등 오케스트레이터에도 동일한 변수명을 써서 OpenClaw와 CI가 같은 산출물을 파싱하게 합니다.
- 파일 시스템: 예를 들어
scripts/sentry-release-gate.sh한 개의 래퍼를 OpenClaw 스케줄·웹훅에서 호출합니다. - 비밀: macOS 키체인,
op inject, CI 시크릿에서만 주입하고 토큰이 들어간.env는 커밋하지 않습니다. - 타임아웃:
curl --max-time으로 API가 멈춰도 전체 배포 전 단계가 블록되지 않게 합니다.
02 Sentry 릴리스 diff를 가져오는 스크립트 템플릿
이슈 목록 API의 쿼리 문자열에 release: 필터를 넣으면 릴리스별 슬라이스를 받을 수 있습니다. 실무적인 diff는 RELEASE_CANDIDATE에서 본 fingerprint 집합에서 RELEASE_BASE에 없던 항목을 빼는 방식입니다. 아래 템플릿은 첫 페이지만 받습니다. 공정한 속도 제한을 위해 Link 헤더의 next 커서로 확장하거나 MAX_PAGES 상한을 두세요.
#!/usr/bin/env bash
set -euo pipefail
: "${SENTRY_AUTH_TOKEN:?}" "${SENTRY_ORG:?}" "${SENTRY_PROJECT:?}"
RELEASE_BASE="${RELEASE_BASE:?}" # 예: [email protected]
RELEASE_CANDIDATE="${RELEASE_CANDIDATE:?}"
HOST="${SENTRY_HOST:-https://sentry.io}"
API="$HOST/api/0/projects/$SENTRY_ORG/$SENTRY_PROJECT/issues/"
REPORT_DIR=".openclaw/reports/$(git rev-parse HEAD)"
mkdir -p "$REPORT_DIR"
fetch_release_page () {
local rel="$1" raw="$2"
code=$(curl -sS -L -o "$raw" -w "%{http_code}" -G "$API" \
--data-urlencode "query=release:${rel}" \
--data-urlencode "statsPeriod=14d" \
--data-urlencode "limit=100" \
-H "Authorization: Bearer ${SENTRY_AUTH_TOKEN}")
[[ "$code" =~ ^2 ]] || { echo "Sentry HTTP $code"; exit 1; }
}
fetch_release_page "$RELEASE_BASE" "$REPORT_DIR/sentry_base.json"
fetch_release_page "$RELEASE_CANDIDATE" "$REPORT_DIR/sentry_candidate.json"
jq -r '.[] | (.fingerprint // ["unknown"]) | join("|")' "$REPORT_DIR/sentry_base.json" | sort -u > "$REPORT_DIR/fp_base.txt"
jq -r '.[] | (.fingerprint // ["unknown"]) | join("|")' "$REPORT_DIR/sentry_candidate.json" | sort -u > "$REPORT_DIR/fp_cand.txt"
comm -13 "$REPORT_DIR/fp_base.txt" "$REPORT_DIR/fp_cand.txt" > "$REPORT_DIR/fp_new.txt"
wc -l "$REPORT_DIR/fp_new.txt" | awk '{print "{\"new_fingerprints\":" $1 "}"}' \
> "$REPORT_DIR/sentry_release_diff.counts.json"
응답에 fingerprint가 없으면 jq 투영을 .metadata.value나 title + culprit 해시로 대체하세요. 이후 OpenClaw는 sentry_release_diff.counts.json과 슬라이스 원본으로 알림 문장을 풍성하게 만들 수 있습니다.
03 오류 클러스터링 규칙 표
날것의 이슈 목록은 잡음이 많습니다. 위에서 아래로 규칙을 적용하면 첫 매칭이 우선이 되게 할 수 있고, 누적 집계만 필요한 규칙은 대시보드용으로 별도 표시할 수 있습니다.
| 우선순위 | 매칭 신호 | 클러스터 라벨 | 전형적 스모크 대응 |
|---|---|---|---|
| P1 | 기준 릴리스 대비 신규 fingerprint이면서 팀 임계 count > N |
new_mass |
승격 보류, Sentry에서 샘플 확대 트리아지 |
| P2 | 제목·culprit에 ChunkLoadError, 동적 import 실패 등 |
bundle_split |
강력 새로고침, CDN 경로, 버전된 자산 URL |
| P2 | 트랜잭션에 checkout·payment 또는 태그 feature:payments |
revenue |
스테이징에서 구매 E2E 스모크 |
| P3 | 태그 browser.name이 Safari 또는 WebKit 전용 스택 |
webkit |
원격 Mac 호스트에서 Safari 경로 |
| P3 | culprit이 인증 콜백·세션 갱신 모듈 | session |
로그인·로그아웃·토큰 갱신 플로우 |
| P4 | 그 외 신규이나 저볼륨 | misc_new |
스팟 체크 + 백로그 티켓 |
clusters.json 배열만 보면 됩니다.04 스모크 검사 항목 체크리스트 출력
클러스터를 사람과 에이전트가 함께 읽을 행으로 바꿉니다. 각 항목에는 플로우 이름, 클러스터 코드, 차단 여부가 있어야 합니다. sentry_smoke_checklist.json(기계용)과 sentry_smoke_checklist.md(리뷰어용)을 쓰고, OpenClaw 파서는 JSON만 가리켜 알림을 짧게 유지합니다.
- 차단: P1
new_mass또는 오류 예산을 넘긴 P2revenue. - 비차단: 담당자·수용 기준이 문서화된 P4
misc_new. - 추적:
RELEASE_CANDIDATE, git SHA, 릴리스로 필터된 Sentry 이슈 스트림 링크 템플릿을 포함합니다.
{
"release": "[email protected]",
"commit": "abc1234",
"items": [
{ "id": 1, "cluster": "bundle_split", "blocking": true,
"action": "홈 로드 후 지연 라우트 이동, 청크 오류 없음 확인" },
{ "id": 2, "cluster": "webkit", "blocking": false,
"action": "Safari 스모크: 설정 모달 열고 저장" }
]
}
05 권한 및 속도 제한 FAQ
토큰 범위는 어디까지? 릴리스별 이슈 목록만 보려면 읽기 전용 조직·프로젝트 범위로 충분합니다. 이벤트 메타데이터가 잘리면 플랜상 조회 가능 여부를 확인하고, “혹시 몰라” 관리자 범위는 올리지 마세요.
429가 나오면? Retry-After를 따르고 요청을 직렬화하며 파이프라인 실행당 NDJSON을 캐시합니다. 야간 볼륨이 크면 diff를 두 개의 예약 작업으로 나눕니다.
자체 호스트 차이? SENTRY_HOST를 내부 도메인으로 맞추고 내부 CA 신뢰가 필요하면 설정하며, 리버스 프록시 타임아웃이 curl --max-time보다 길게 잡혀 있는지 확인합니다.
왜 원격 Mac인가? 같은 OpenClaw 에이전트가 Safari 검증이나 macOS 전용 도구를 이미 돌린다면 Sentry 게이트도 그 호스트에 두어 산출물을 러너 간에 옮기지 않고 감사 타임라인을 하나로 유지할 수 있습니다.
최소 OpenClaw·Sentry 읽기 토큰, fetch 템플릿, 클러스터 표, 체크리스트 JSON으로 릴리스 게이트를 고정합니다. 속도 제한·최소 권한이 배포 직전에 무난한 통과를 만듭니다.