From 23be76333ec74924bcb522cf0a792112821c2eb2 Mon Sep 17 00:00:00 2001 From: Lectom C Han Date: Tue, 16 Dec 2025 16:18:30 +0900 Subject: [PATCH] =?UTF-8?q?action=20runner=20=ED=83=80=EC=9E=85=20?= =?UTF-8?q?=EC=A0=9C=ED=95=9C,=20README=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitea/workflows/mirror.yml | 23 ++++++++++++++-- README.md | 52 +++++++++++++++++++++++++++++++++++++ to-do.md | 2 ++ 3 files changed, 75 insertions(+), 2 deletions(-) create mode 100644 README.md diff --git a/.gitea/workflows/mirror.yml b/.gitea/workflows/mirror.yml index 7be8eef..251e4bb 100644 --- a/.gitea/workflows/mirror.yml +++ b/.gitea/workflows/mirror.yml @@ -8,11 +8,11 @@ on: required: false default: '' schedule: - - cron: '0 2 * * *' # Runs every day at 2:00 AM + - cron: '7 2 * * *' # Runs every day at 2:07 AM jobs: mirror: - runs-on: ubuntu-latest + runs-on: [internal] timeout-minutes: 360 # 6 hours timeout steps: - name: Checkout @@ -34,6 +34,7 @@ jobs: BASE_GITEA_USER: ${{ vars.BASE_GITEA_USER }} # The user who owns the token INPUT_BRANCHES: ${{ github.event.inputs.branches }} NOTIFY_WEBHOOK: ${{ vars.NOTIFY_WEBHOOK }} # Optional chat webhook + SYNC_TAGS: ${{ vars.SYNC_TAGS }} # Optional, "false" to skip tag sync run: | set -euo pipefail @@ -42,6 +43,7 @@ jobs: SOURCE_SSH_HOST="engdev@172.16.42.118" ROOT_DIR="$(pwd)" NOTIFY_WEBHOOK="${NOTIFY_WEBHOOK:-}" + SYNC_TAGS="${SYNC_TAGS:-true}" notify_status() { local status="$1" repo="$2" branch="$3" mode="$4" start_epoch="$5" extra="${6:-}" @@ -254,6 +256,16 @@ jobs: rm -rf "${CLONE_DIR}" return fi + if [[ "${SYNC_TAGS}" == "true" ]]; then + echo "Fetching tags from source..." + if ! git fetch --prune --prune-tags --no-tags source "refs/tags/*:refs/tags/*"; then + echo "::error::Failed to fetch tags from source repo" + notify_status "error" "${repo_name}" "${branch_name}" "${backup_mode}" "${start_epoch}" "tag fetch 오류" + cd "${ROOT_DIR}" + rm -rf "${CLONE_DIR}" + return + fi + fi echo "Pushing '${branch_name}' to Gitea repository '${repo_name}'..." if ! git push --progress --force origin "refs/heads/${branch_name}:refs/heads/main"; then @@ -263,6 +275,13 @@ jobs: rm -rf "${CLONE_DIR}" return fi + if [[ "${SYNC_TAGS}" == "true" ]]; then + echo "Pushing tags to Gitea repository '${repo_name}'..." + if ! git push --force --prune origin "refs/tags/*:refs/tags/*"; then + echo "::warning::Failed to push tags to target repository" + notify_status "error" "${repo_name}" "${branch_name}" "${backup_mode}" "${start_epoch}" "tag push 오류" + fi + fi # Cleanup cd "${ROOT_DIR}" diff --git a/README.md b/README.md new file mode 100644 index 0000000..0f1ff97 --- /dev/null +++ b/README.md @@ -0,0 +1,52 @@ +# Git Repository Mirroring Workflow + +## 목적 +- 외부 SSH Git 저장소(센터 공용 코드 관리용 깃)의 특정 브랜치를 Gitea `center_dev` 조직의 개별 저장소로 순차 복제합니다. +- 브랜치마다 대응 저장소명을 결정해 `main` 브랜치로 강제 푸시하며, 태그 동기화 옵션을 제공합니다. + +## 실행 환경 +- Runner 라벨: `internal` (워크플로우는 이 라벨을 가진 러너에서만 동작) +- 예약 실행: 매일 02:07 KST (`cron: 7 2 * * *`) +- 수동 실행: `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`: 토큰 소유자 ID +- `vars.NOTIFY_WEBHOOK` (선택): 채팅 웹훅 URL. 없으면 알림 미전송. +- `vars.SYNC_TAGS` (선택): `"false"`로 설정 시 태그 동기화 비활성화. 미설정 시 태그를 동기화함. + +## 저장소 이름 매핑 규칙 +- `Develop_Net8` → `base` +- `Develop_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` 전체를 처리 + +## 동작 개요 +1) 브랜치 존재 여부 확인 (`git ls-remote`) +2) 타겟 저장소 존재 확인/생성 (`default_branch=main`) +3) 커밋 동일 시 skip (알림 전송) +4) 신규 생성: 소스 브랜치를 bare single-branch clone 후 `main`으로 강제 푸시 +5) 기존 존재: 빈 bare 저장소 init → 타겟 `main` 선-fetch로 객체 시드 → 소스 브랜치만 fetch → `main`으로 강제 푸시 +6) 태그 동기화가 켜져 있으면 태그 fetch/push(강제+prune) +7) 기본 브랜치를 `main`으로 패치, 임시 디렉터리 정리 + +## 알림 +- `NOTIFY_WEBHOOK` 설정 시 시작/성공/실패/건너뛰기 상태를 KST 타임스탬프와 소요시간, 모드(신규/증분)와 함께 전송 + +## 주의사항 +- 대용량 데이터로 인해 순차 실행을 전제로 함(병렬 실행 비권장) +- 태그 푸시는 `--force --prune`로 수행되어 소스에 없는 태그가 타겟에서 제거됨 +- 동일 저장소명을 의도하지 않은 소스 조합으로 사용할 경우 덮어쓰기가 발생할 수 있으므로 `branch_list`/alias를 신중히 관리 diff --git a/to-do.md b/to-do.md index f2dafe7..6b883d3 100644 --- a/to-do.md +++ b/to-do.md @@ -18,3 +18,5 @@ 2025-12-16 09:48:20 KST 추가 업데이트: mirror.yml에서 타겟이 새로 생성된 경우 소스 브랜치를 `git clone --bare --single-branch`로 전체 클론 후 push, 기존 타겟이 있을 때만 빈 bare repo를 init해 필요한 브랜치만 fetch→push 하도록 분기. 생성된 경우에도 백업 모드/알림이 “신규 전체 백업”으로 정확히 표시되도록 just_created 플래그를 추가. 2025-12-16 11:10:39 KST 추가 업데이트: 증분 경로에서 빈 bare init 후 타겟 main을 `fetch --no-tags`로 선반입해 객체를 시드한 뒤 소스 브랜치 fetch를 수행하도록 변경, 델타 전송을 활용해 변경량이 적을 때 트래픽을 줄이도록 개선. 2025-12-16 13:28:01 KST 추가 업데이트: mirror.yml에 branch_list 주석(`#`) 스킵 및 `sourceRepo/branch,alias` 구문을 추가해, 콤마 뒤의 별도 저장소 이름(alias)으로 타겟을 지정할 수 있도록 개선. +2025-12-16 14:03:18 KST 추가 업데이트: mirror.yml에 태그 동기화 옵션(SYNC_TAGS, 기본 true) 추가. 소스 태그를 fetch --prune/--prune-tags 후 타겟으로 push --force --prune해 태그를 미러링하도록 개선하며, 태그 동기화 실패 시 알림을 보냄. +2025-12-16 16:16:39 KST 추가 업데이트: README.md 작성(목적/사용법/입력 규칙/시크릿/러너 조건/태그 옵션 등). mirror.yml의 cron을 매일 02:07 KST로 조정하고 runs-on 라벨을 `internal`로 제한.