CLAUDE.md: directory structure updated (itsm/->workspace/guardia-itsm/, etc.) repo-splitter.md: subtree split prefixes updated to workspace/ paths repo-split-orchestrator/SKILL.md: split target paths updated Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
186 lines
6.2 KiB
Markdown
186 lines
6.2 KiB
Markdown
---
|
||
name: repo-split-orchestrator
|
||
description: "GUARDiA 모노레포를 4개 독립 Gitea 저장소로 분리하는 오케스트레이터. 로컬 소스 분리 → Gitea repo 생성/push → CI/CD webhook 연결 → 매뉴얼 업데이트의 전체 파이프라인을 실행한다. 다음 상황에서 반드시 사용: (1) '레파지토리 분리', '저장소 분리', 'repo 분리'; (2) 'GitHub 제거', 'Gitea만 사용'; (3) '각 시스템 독립 repo'; (4) 분리 후 webhook/CI/CD 연결; (5) 다시 실행, 업데이트, 보완."
|
||
---
|
||
|
||
# GUARDiA 레파지토리 분리 오케스트레이터
|
||
|
||
**실행 모드:** 파이프라인 (순차 서브 에이전트)
|
||
`repo-splitter` → `gitea-publisher` → `cicd-wirer` → `doc-updater`
|
||
|
||
---
|
||
|
||
## 분리 목표
|
||
|
||
```
|
||
현재 (모노레포) 목표 (독립 repo × 5)
|
||
C:\GUARDiA\workspace\ C:\GUARDiA\repos\
|
||
├── zioinfo-web/ → ├── zioinfo-web\ (zio/zioinfo-web)
|
||
├── guardia-itsm/ → ├── guardia-itsm\ (zio/guardia-itsm)
|
||
├── guardia-manager/ → ├── guardia-manager\ (zio/guardia-manager)
|
||
├── guardia-messenger/→ ├── guardia-messenger\ (zio/guardia-messenger)
|
||
└── guardia-docs/ → └── guardia-docs\ (zio/guardia-docs)
|
||
```
|
||
|
||
---
|
||
|
||
## Phase 0: 사전 확인
|
||
|
||
```bash
|
||
# 현재 모노레포 상태
|
||
cd C:\GUARDiA
|
||
git status # 커밋 안된 변경사항 없어야 함
|
||
git remote -v # origin(GitHub) + gitea + gitea-itsm 확인
|
||
|
||
# Gitea 서버 상태
|
||
curl http://101.79.17.164:3000 --head
|
||
```
|
||
|
||
⚠️ **주의사항:**
|
||
- 미커밋 변경사항이 있으면 먼저 커밋
|
||
- 분리 중 원본 모노레포 수정 금지
|
||
- `C:\GUARDiA\repos\` 디렉토리가 `.gitignore`에 추가됨
|
||
|
||
---
|
||
|
||
## Phase 1: 로컬 소스 분리 (repo-splitter)
|
||
|
||
```bash
|
||
cd C:\GUARDiA
|
||
|
||
# 1-1. repos 디렉토리 생성
|
||
mkdir -p C:\GUARDiA\repos
|
||
|
||
# 1-2. 각 서브트리 히스토리 분기
|
||
git subtree split --prefix=workspace/zioinfo-web -b split/zioinfo-web
|
||
git subtree split --prefix=workspace/guardia-itsm -b split/guardia-itsm
|
||
git subtree split --prefix=workspace/guardia-manager -b split/guardia-manager
|
||
git subtree split --prefix=workspace/guardia-messenger -b split/guardia-messenger
|
||
|
||
# 1-3. 각 독립 repo 디렉토리 생성 및 클론
|
||
for name in zioinfo-web guardia-itsm guardia-manager guardia-messenger; do
|
||
split_branch="split/$name"
|
||
target="C:/GUARDiA/repos/$name"
|
||
mkdir -p "$target"
|
||
git clone --no-local --branch "$split_branch" . "$target"
|
||
echo "Created: $target"
|
||
git -C "$target" log --oneline -3
|
||
done
|
||
|
||
# 1-4. manual/ → guardia-docs
|
||
git subtree split --prefix=workspace/guardia-docs -b split/guardia-docs
|
||
mkdir -p C:\GUARDiA\repos\guardia-docs
|
||
git clone --no-local --branch split/guardia-docs . C:\GUARDiA\repos\guardia-docs
|
||
|
||
# 1-5. repos/ 모노레포 .gitignore에 추가
|
||
echo "repos/" >> C:\GUARDiA\.gitignore
|
||
```
|
||
|
||
---
|
||
|
||
## Phase 2: Gitea 저장소 생성 + push (gitea-publisher)
|
||
|
||
```bash
|
||
# 2-1. 신규 저장소 생성 (manager, messenger, docs)
|
||
for repo in guardia-manager guardia-messenger guardia-docs; do
|
||
curl -sf -X POST http://101.79.17.164:3000/api/v1/user/repos \
|
||
-u 'zio:Zio@Admin2026!' \
|
||
-H 'Content-Type: application/json' \
|
||
-d "{\"name\":\"$repo\",\"private\":false,\"auto_init\":false}" \
|
||
&& echo "Created $repo"
|
||
done
|
||
|
||
# 2-2. 각 독립 repo에 Gitea remote 설정 + push
|
||
declare -A REPOS=(
|
||
[zioinfo-web]="zio/zioinfo-web"
|
||
[guardia-itsm]="zio/guardia-itsm"
|
||
[guardia-manager]="zio/guardia-manager"
|
||
[guardia-messenger]="zio/guardia-messenger"
|
||
[guardia-docs]="zio/guardia-docs"
|
||
)
|
||
for local_name in "${!REPOS[@]}"; do
|
||
repo_path="C:/GUARDiA/repos/$local_name"
|
||
gitea_url="http://zio:Zio%40Admin2026%21@101.79.17.164:3000/${REPOS[$local_name]}.git"
|
||
cd "$repo_path"
|
||
git remote add origin "$gitea_url"
|
||
git push origin main --force
|
||
echo "Pushed: $local_name → ${REPOS[$local_name]}"
|
||
done
|
||
|
||
# 2-3. 모노레포에서 GitHub(origin) remote 제거
|
||
cd C:\GUARDiA
|
||
git remote remove origin
|
||
git remote -v # gitea + gitea-itsm만 남아야 함
|
||
```
|
||
|
||
---
|
||
|
||
## Phase 3: CI/CD Webhook 연결 (cicd-wirer)
|
||
|
||
```bash
|
||
# 3-1. Gitea webhook 등록
|
||
REPOS_WITH_WEBHOOK=(zioinfo-web guardia-itsm guardia-manager guardia-messenger)
|
||
for repo in "${REPOS_WITH_WEBHOOK[@]}"; do
|
||
curl -sf -X POST "http://101.79.17.164:3000/api/v1/repos/zio/$repo/hooks" \
|
||
-u 'zio:Zio@Admin2026!' \
|
||
-H 'Content-Type: application/json' \
|
||
-d '{
|
||
"type":"gitea",
|
||
"config":{"url":"http://localhost:9999","content_type":"json","secret":"zioinfo-deploy-2026"},
|
||
"events":["push"],"active":true
|
||
}' \
|
||
&& echo "Webhook: $repo"
|
||
done
|
||
|
||
# 3-2. deploy_server.py repo name 매핑 업데이트 (서버에서)
|
||
# guardia-manager, guardia-messenger 배포 경로 추가
|
||
```
|
||
|
||
---
|
||
|
||
## Phase 4: 문서 업데이트 (doc-updater)
|
||
|
||
- 각 독립 repo에 `CLAUDE.md` 생성
|
||
- `manual/43_레파지토리_구조_가이드.md` 신규 작성
|
||
- `manual/20_zio서버_CICD_가이드.md` 업데이트
|
||
- `manual/42_zio서버_소프트웨어_구성도.md` 업데이트
|
||
|
||
---
|
||
|
||
## 에러 핸들링
|
||
|
||
| 오류 | 원인 | 해결 |
|
||
|------|------|------|
|
||
| subtree split 실패 | prefix 경로 오탈자 | `git log --oneline -- {prefix}` 확인 |
|
||
| Gitea push 413 | 파일 크기 초과 | `git lfs` 또는 대용량 파일 `.gitignore` 추가 |
|
||
| Gitea repo 이미 존재 | 중복 생성 시도 | 오류 무시하고 진행 (이미 있으면 OK) |
|
||
| webhook 미트리거 | 저장소명 불일치 | deploy_server.py의 repo name 매핑 확인 |
|
||
|
||
---
|
||
|
||
## 완료 검증 체크리스트
|
||
|
||
```
|
||
□ C:\GUARDiA\repos\ 아래 5개 디렉토리 존재
|
||
□ 각 repo git log 정상 (히스토리 있음)
|
||
□ Gitea에 5개 저장소 확인 가능
|
||
□ GitHub remote(origin) 제거됨
|
||
□ 각 repo에 Gitea remote만 존재
|
||
□ webhook 4개 등록 완료
|
||
□ 매뉴얼 43 신규 생성
|
||
□ CLAUDE.md 업데이트
|
||
```
|
||
|
||
---
|
||
|
||
## 테스트 시나리오
|
||
|
||
**정상 흐름:**
|
||
1. git subtree split → 각 브랜치 생성 확인
|
||
2. repos/ 디렉토리에 클론 → `git log` 히스토리 확인
|
||
3. Gitea push → 웹 브라우저에서 저장소 확인
|
||
4. test push → webhook 트리거 → 서버 배포 로그 확인
|
||
|
||
**에러 흐름:**
|
||
- split 브랜치 이미 존재 → 먼저 `git branch -D split/xxx` 후 재실행
|