4.9 KiB
4.9 KiB
Git Repository Mirroring Workflow
목적
- 외부 SSH Git 저장소(센터 공용 코드 관리용 깃)의 특정 브랜치를 Gitea
center_dev조직으로 순차 복제합니다. - 브랜치→저장소 매핑 규칙을 적용해
main브랜치로 강제 푸시하며, 태그 동기화 옵션을 제공합니다. backup.yml은 소스/타겟의 head 커밋을 먼저 스캔해 건너뜀/증분/신규 여부를 사전 결정하고,mirror.yml은 즉시 복제합니다.
워크플로우 파일
.gitea/workflows/backup.yml: 프리스캔 기반 백업(사전 해시 기록 → 계획 결정 → 실행). 예약 실행: 매일 02:00 KST (cron: 0 17 * * *, UTC 기준) +workflow_dispatch..gitea/workflows/mirror.yml: 기존 즉시 복제 워크플로우. 스케줄 없음,workflow_dispatch로만 수동 실행.
실행 환경
- Runner 라벨:
internal(해당 라벨이 있는 셀프호스티드 러너에서만 실행) - 수동 실행:
workflow_dispatch입력을 통해 선택 브랜치만 실행 가능
시크릿/변수
secrets.SSH_PRIVATE_KEY: 소스 저장소 접근용 SSH 키secrets.BASE_GITEA_TOKEN: Gitea API/푸시 토큰vars.BASE_GITEA_URL: Gitea URL (예: https://gitea.example.com)vars.BASE_GITEA_USER: 토큰 소유자 IDvars.NOTIFY_WEBHOOK(선택): 채팅 웹훅 URL. 없으면 알림 미전송.vars.SYNC_TAGS(선택):"false"로 설정 시 태그 동기화 비활성화. 미설정 시 태그를 동기화함.
저장소 이름 매핑 규칙
Develop_Net8→baseDevelop_Net8_*→*부분만 사용 (예:Develop_Net8_heh→heh)Develop_*/develop_*→ 접두사 제거 (예:develop_boxzainer→boxzainer)- 그 외 브랜치는 브랜치명을 그대로 사용
sourceRepo/branch,alias형태를 사용하면 alias로 최종 저장소명을 강제 설정- 동일 이름 타겟이 이미 존재하면 소스가 달라도 덮어쓰기 가능하므로 목록 구성 시 주의
branch_list 사용법
- 기본 실행 시
branch_list파일을 위에서 아래로 순차 처리 #로 시작하거나 줄 내#이후는 주석으로 무시sourceRepo/branch또는sourceRepo/branch,alias형식을 한 줄에 하나씩 기입
수동 실행 입력
branches: 콤마로 구분한sourceRepo/branch또는sourceRepo/branch,alias목록- 입력이 비어 있으면
branch_list전체를 처리
backup.yml (프리스캔 백업) 동작 개요
- 입력 또는
branch_list를 파싱해 유효 항목을 확정하고, 소스 저장소별로git ls-remote --heads를 한 번씩 수행해 브랜치→커밋 해시를 수집합니다. - Gitea에 해당 저장소가 있는지 조회 후
main해시를 확인합니다. - 사전 판정: 타겟이 없거나
main이 없으면 “신규 백업”, 해시가 같으면 “건너뜀”, 다르면 “증분 백업”으로 결정합니다. - 해시 스냅샷과 판정 테이블을
backup_reports/폴더에source_heads_*.tsv,target_heads_*.tsv,decisions_*.tsv로 기록합니다. - “건너뜀”은 바로 알림 후 종료, “신규/증분”만 fetch→push 실행합니다.
- 실행 단계: 저장소 존재 확인/생성(
default_branch=main) → shallow-exclude 기반 fetch(미지원 시 타겟 main 얕은 시드 후 일반 fetch) →main으로 강제 푸시 → 태그 동기화(옵션) → 기본 브랜치main패치 → 임시 폴더 정리. - 알림은 시작/성공/실패/건너뜀에 대해 KST 타임스탬프, 모드, 소요시간을 포함해 전송합니다.
mirror.yml (즉시 복제) 동작 개요
- 브랜치 존재 여부 확인 (
git ls-remote) - 타겟 저장소 존재 확인/생성 (
default_branch=main) - 커밋 동일 시 skip (알림 전송)
- 신규 생성: 소스 브랜치를 bare single-branch clone 후
main으로 강제 푸시 - 기존 존재: 빈 bare 저장소 init → 타겟
main커밋을 shallow-exclude로 지정해 소스 브랜치만 fetch →main으로 강제 푸시 - 태그 동기화가 켜져 있으면 태그 fetch/push(강제+prune)
- 기본 브랜치를
main으로 패치, 임시 디렉터리 정리 - 소스 서버가
--shallow-exclude를 지원하지 않으면 타겟main을 얕게(depth=50) 받아 시드한 뒤 일반 fetch로 재시도 - Gitea API(조회/생성/기본브랜치 설정)는 최대 3회 재시도 후 실패 시 해당 브랜치를 건너뛰고 다음 브랜치로 진행
알림
NOTIFY_WEBHOOK설정 시 시작/성공/실패/건너뛰기 상태를 KST 타임스탬프와 소요시간, 모드(신규/증분)와 함께 전송
주의사항
- 대용량 데이터로 인해 순차 실행을 전제로 함(병렬 실행 비권장)
- 태그 푸시는
--force --prune로 수행되어 소스에 없는 태그가 타겟에서 제거됨 - 동일 저장소명을 의도하지 않은 소스 조합으로 사용할 경우 덮어쓰기가 발생할 수 있으므로
branch_list/alias를 신중히 관리