Deploy: GitHub submodule sync 2026-07-23 12:46:52

This commit is contained in:
Macbook
2026-07-23 12:46:52 +09:00
parent fb55262bbc
commit 9ea8540979
339 changed files with 811 additions and 44137 deletions
+164
View File
@@ -0,0 +1,164 @@
#!/usr/bin/env bash
# GitHub upstream → monorepo submodule 최신 소스 반영 (pull only, push 없음)
#
# ./git_fetch_all.sh # 4개 submodule fetch + fast-forward
# ./git_fetch_all.sh --init # submodule 미초기화 시 clone 포함
# ./git_fetch_all.sh --dry-run # 실행 없이 변경 예상만 출력
#
# 대상 (.gitmodules):
# chatbotApp-chatbot2.0-agent → KoreaExpressWayCorp/chatbotApp (chatbot2.0-agent)
# chatbotApi-chatbot2.0-agent → KoreaExpressWayCorp/chatbotApi (chatbot2.0-agent)
# exAiChatBot-chatbot2.0-agent → KoreaExpressWayCorp/exAiChatBot (chatbot2.0-agent)
# kakaoChatbotSkill-chatbot2.0-agent → KoreaExpressWayCorp/kakaoChatbotSkill (chatbot2.0-agent)
set -euo pipefail
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
INIT=false
DRY_RUN=false
for arg in "$@"; do
case "$arg" in
--init) INIT=true ;;
--dry-run) DRY_RUN=true ;;
-h|--help)
sed -n '2,14p' "$0"
exit 0
;;
*)
echo "알 수 없는 옵션: $arg (--help)"
exit 1
;;
esac
done
log() { echo "[git_fetch_all] $*"; }
warn() { echo "[git_fetch_all] ⚠️ $*" >&2; }
cd "${ROOT_DIR}"
if [[ ! -f .gitmodules ]]; then
echo "ERROR: .gitmodules 없음 — submodule 미설정"
exit 1
fi
SUBMODULE_PATHS=()
while IFS= read -r _path; do
[[ -n "${_path}" ]] && SUBMODULE_PATHS+=("${_path}")
done < <(git config -f .gitmodules --get-regexp '^submodule\..*\.path$' | awk '{print $2}')
if [[ ${#SUBMODULE_PATHS[@]} -eq 0 ]]; then
echo "ERROR: .gitmodules 에 submodule 경로 없음"
exit 1
fi
if $INIT && ! $DRY_RUN; then
log "submodule init..."
git submodule update --init --recursive
fi
restore_monorepo_overlays() {
if [[ -f "${ROOT_DIR}/local-dev/docker-compose.rag.local.yml" ]]; then
cp "${ROOT_DIR}/local-dev/docker-compose.rag.local.yml" \
"${ROOT_DIR}/exAiChatBot-chatbot2.0-agent/docker-compose.local.yml"
log "복원: exAiChatBot/docker-compose.local.yml (monorepo overlay)"
fi
if [[ -f "${ROOT_DIR}/server-dev/docker-compose.rag.server.yml" ]]; then
cp "${ROOT_DIR}/server-dev/docker-compose.rag.server.yml" \
"${ROOT_DIR}/exAiChatBot-chatbot2.0-agent/docker-compose.server.yml"
log "복원: exAiChatBot/docker-compose.server.yml (monorepo overlay)"
fi
}
fetch_one() {
local path="$1"
local url branch old new dirty
url="$(git config -f .gitmodules "submodule.${path}.url")"
branch="$(git config -f .gitmodules "submodule.${path}.branch" || echo main)"
branch="${branch:-main}"
log ">>> ${path}"
log " url=${url} branch=${branch}"
if ! git -C "${ROOT_DIR}/${path}" rev-parse --git-dir >/dev/null 2>&1; then
if $DRY_RUN; then
log " [dry-run] submodule clone 필요 — ./git_fetch_all.sh --init"
return 0
fi
if $INIT; then
git submodule update --init "${path}"
else
warn "${path} — submodule 미초기화. --init 옵션 사용"
return 1
fi
fi
(
cd "${ROOT_DIR}/${path}"
if ! git diff --quiet || ! git diff --cached --quiet; then
dirty=yes
warn "${path} — 로컬 변경 있음 (fetch는 진행, fast-forward 실패 가능)"
else
dirty=no
fi
old="$(git rev-parse HEAD 2>/dev/null || echo none)"
if $DRY_RUN; then
git fetch origin "${branch}" 2>/dev/null || git fetch origin
new="$(git rev-parse "origin/${branch}" 2>/dev/null || echo unknown)"
if [[ "${old}" == "${new}" ]]; then
log " [dry-run] 이미 최신: ${old:0:7}"
else
log " [dry-run] ${old:0:7} → ${new:0:7}"
git log --oneline "${old}..origin/${branch}" 2>/dev/null | sed 's/^/ /' || true
fi
exit 0
fi
git fetch origin "${branch}"
git checkout "${branch}" 2>/dev/null || git checkout -B "${branch}" "origin/${branch}"
if git merge-base --is-ancestor HEAD "origin/${branch}" 2>/dev/null \
&& [[ "$(git rev-parse HEAD)" != "$(git rev-parse "origin/${branch}")" ]]; then
git merge --ff-only "origin/${branch}"
elif [[ "$(git rev-parse HEAD)" != "$(git rev-parse "origin/${branch}")" ]]; then
warn "${path} — fast-forward 불가 (로컬 커밋/변경 존재). 수동 merge 필요"
git status -sb | sed 's/^/ /'
exit 1
fi
new="$(git rev-parse HEAD)"
if [[ "${old}" == "${new}" ]]; then
log " ✅ 최신 유지 $(git log -1 --oneline)"
else
log " ✅ 갱신 ${old:0:7} → ${new:0:7} $(git log -1 --oneline)"
fi
)
}
failures=0
for path in "${SUBMODULE_PATHS[@]}"; do
if ! fetch_one "${path}"; then
failures=$((failures + 1))
fi
echo ""
done
if ! $DRY_RUN; then
restore_monorepo_overlays
fi
log "=========================================="
log "submodule 상태:"
git submodule status || true
log "=========================================="
if [[ ${failures} -gt 0 ]]; then
warn "실패 ${failures}개 — 로그 확인"
exit 1
fi
log "완료 — GitHub → 로컬 반영 (push 없음)"
log "monorepo 커밋 갱신: git add .gitmodules *-chatbot2.0-agent && git status"