2026 OpenClaw MeshMac 실전: 다중 노드 monorepo 경로 필터로 증분 빌드·Slack 요약 알림까지 최소 재현
공유 MeshMac 풀에서 매 푸시마다 전체 monorepo를 돌리면 시간이 새니, path filter → 큐/락 → 증분 → OpenClaw 요약 → Slack 웹훅(게이트웨이만) → 백오프·멱등 최소 고리를 정리합니다. 서술은 약 800–1500자 분량, 명령·표는 재현용으로 유지했습니다.
클러스터 동기화·웹훅 레이아웃·OpenClaw 허브와 같이 보면 확장이 수월합니다.
변경 감지: monorepo path filter
diff 앵커를 고정하세요. GitHub Actions에서는 dorny/paths-filter 또는 git diff --name-only "$BASE_SHA"...HEAD 한 줄로 1차 버전을 만들 수 있습니다. 변경 파일을 패키지 루트로 접는 규칙은 저장소 루트 YAML에 두어 리뷰어가 오탐·누락을 PR 단계에서 잡게 하세요. 예: apps/ios/** → apps/ios.
산출물은 JSON 한 덩어리로 통일하면 노드마다 같은 빌드 계획을 읽습니다. 필터가 비면 스모크만; Turborepo·Nx·Bazel affected도 같은 계약으로 계획 파일만 갱신하면 됩니다.
main에서 ci/**·.github/** 변경 시 한 번 넓게 빌드한 뒤 증분으로 복귀하세요. 체크아웃은 worktree·lockfile 글과 맞춰 path filter와 Package.resolved 경합을 피합니다.
큐 또는 락: 증분 전에 입장 통제
경로가 달라도 서명·시뮬레이터·Pods 샌드박스는 동시에 건드리면 깨질 수 있어, 패턴 하나를 문서화하세요.
- 중앙 큐 — 다중 노드 배포·태스크 큐 동기화처럼 Redis·RabbitMQ·OpenClaw 태스크 패브릭에서 레인당 소비자를 Xcode 구간에서는 1로 캡합니다.
- 협력적 flock — 공유 NFS·APFS에
/build-locks/ios.signing.lock을 두고 타임아웃 있는flock을 씁니다. 만료·정리는 flock 빌드 큐 FAQ를 참고하세요.
락 범위는 게이트웨이 rate limit·세션 동시성과 맞춰 CI가 서명 슬롯 하나인데 세션만 스무 개 열지 않도록 하세요.
OpenClaw가 빌드 요약을 만든다
CI 로그 전체 대신 게이트웨이 OpenClaw 태스크에 종료 코드·패키지 목록·mesh_node_id·시간·첫 실패 힌트만 넘기고, 짧은 불릿·provider URL로 렌더링합니다.
path filter JSON을 컨텍스트에 넣고, xcresult는 실패 슬라이스만. 녹색 빌드는 정적 템플릿으로 지연을 고정하세요.
요약에 시크릿을 넣지 마세요. 자격 증명은 credential_id나 잡 이름으로만 가리킵니다. 큐 쪽 재시도 규율은 태스크 큐·재시도 단계와 함께 설계하세요.
Slack Incoming Webhook: 실질 최소 권한
Incoming Webhook URL은 베어러 비밀입니다. 0440·커밋 금지·POST는 게이트웨이만, 러너는 큐로 이벤트만.
이그레스는 hooks.slack.com만 허용하고, 자동화 전 게이트웨이에서 curl로 검증합니다.
export SLACK_URL="$(sudo cat /etc/openclaw/secrets.d/slack/build-summary.url)"
curl -sS -X POST -H 'Content-Type: application/json' \
-d '{"text":"MeshMac 프로브 OK ('"$(hostname -s)"')"}' "$SLACK_URL"
노드별 최소 권한·디렉터리 레이아웃은 MeshMac 노드 시크릿·최소 권한과 동일하게 맞추면 로테이션이 단순해집니다. 앱·봇 토큰으로 넘어가도 단일 송신자 원칙은 유지하세요.
실패 백오프(그리고 재시도하지 않을 때)
429·일시 5xx는 지수 백오프·전체 지터·상한(예 2분·5회). Retry-After 준수.
400·404는 수정 후에만 재시도. provider_run_id+결론으로 72h 멱등.
게이트웨이·토큰 로테이션 요약표
| 표면 | 무엇을 돌릴지 | 힌트 |
|---|---|---|
| OpenClaw 게이트웨이 TLS | 인증서·키 또는 ACME | 진행 중 웹훅을 끊지 않게 프록시 리로드. Nginx·Caddy 매트릭스 |
| Slack Incoming Webhook | 전체 URL(새 통합) | 전환기에 이중 URL로 잠깐 병행 후 Slack UI에서 구 URL 폐기 |
| CI → 게이트웨이 HMAC | 공유 서명 비밀 | 버전 교차 기간을 두고 미서명 POST는 엣지에서 거절 |
| Git 읽기 토큰 | PAT 또는 GitHub App 설치 | monorepo에 contents:read만 |
로드밸런서 뒤 게이트웨이면 드레인·헬스를 로드밸런싱·페일오버 단계와 맞춰 Slack 전달이 반쯤만 나가지 않게 하세요.
FAQ
- 이미 증분인데 락을 생략해도 되나요?
- 증분은 컴파일 부하만 줄입니다. 서명·시뮬레이터·전역 캐시 경합은 남으므로 해당 구간만이라도 좁게 잠급니다.
- 녹색 빌드마다 LLM을 돌려야 하나요?
- 아니요. 성공은 이모지·소요·패키지 목록 정적 템플릿으로 충분하고, 실패나 모호한 로그에만 모델 호출을 쓰면 됩니다.
- Incoming Webhook은 곧 없어지나요?
- Slack은 앱 기반을 권장하지만 내부 CI에서는 여전히 흔합니다. 여기서는 최소 파이프라인을 막지 않고, 나중에 앱 토큰으로 이전할 여지만 남기면 됩니다.
한 줄 정리
path filter → 큐 또는 flock → 증분 빌드 → OpenClaw 요약 → 게이트웨이만 Slack → 유한 백오프·멱등. 오후 스프린트 하나로 재현하고 한 주 안에 운영 규율을 다듬기 좋은 최소 루프입니다.