#!/usr/bin/env bash
# ==============================================================================
# exdev.co.kr — Git bare + work-tree + Jenkins 완전 재구축
# 실행 위치: 서버 (aidev@exdev.co.kr) 또는 로컬에서 ssh로 원격 실행
#
# 유지 경로 (현재 운영과 동일):
# GIT_DIR = /Volumes/ADATA/git/goldenChart.git
# WORK_TREE = /Users/aidev/apps/goldenChart
# DEPLOY_SCRIPT= /Volumes/ADATA/git/deploy.sh
# DEPLOY_LOG = /Volumes/ADATA/logs/deploy/deploy.log
# Jenkins = http://127.0.0.1:8090 job: goldenChart-Pipeline
# ==============================================================================
set -euo pipefail
export PATH="/opt/homebrew/bin:/opt/homebrew/sbin:/usr/local/bin:${PATH:-/usr/bin:/bin}"
GIT_DIR="/Volumes/ADATA/git/goldenChart.git"
WORK_TREE="/Users/aidev/apps/goldenChart"
DEPLOY_SCRIPT="/Volumes/ADATA/git/deploy.sh"
DEPLOY_LOG="/Volumes/ADATA/logs/deploy/deploy.log"
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
JENKINS_HOME="${JENKINS_HOME:-$HOME/.jenkins}"
JENKINS_JOB="goldenChart-Pipeline"
STAMP="$(date +%Y%m%d-%H%M%S)"
BACKUP_ROOT="/Volumes/ADATA/backup/goldenChart-rebuild-${STAMP}"
log() { echo "[rebuild $(date '+%H:%M:%S')] $*"; }
log "백업 디렉터리: $BACKUP_ROOT"
mkdir -p "$BACKUP_ROOT" "$(dirname "$DEPLOY_LOG")" /Volumes/ADATA/logs/deploy/push-summaries
# ── 1. Jenkins Job 제거 (데이터는 유지, job만 초기화) ─────────────────────
log "Jenkins job 제거: $JENKINS_JOB"
rm -rf "${JENKINS_HOME}/jobs/${JENKINS_JOB}"
rm -f "${JENKINS_HOME}/jobs/${JENKINS_JOB}.xml" 2>/dev/null || true
# ── 2. work-tree 백업 (.env·데이터 보존) ───────────────────────────────────
if [ -d "$WORK_TREE" ]; then
log "work-tree 백업 → $BACKUP_ROOT/work-tree-snapshot"
mkdir -p "$BACKUP_ROOT/work-tree-snapshot"
[ -f "$WORK_TREE/.env" ] && cp -a "$WORK_TREE/.env" "$BACKUP_ROOT/.env"
# embedded .git 제거 대상 — 백업만
if [ -d "$WORK_TREE/.git" ]; then
log "work-tree 내 중첩 .git 백업 (배포 혼선 원인)"
cp -a "$WORK_TREE/.git" "$BACKUP_ROOT/work-tree-snapshot/dot-git-nested"
fi
fi
# ── 3. bare 저장소 제거 후 재생성 ───────────────────────────────────────────
if [ -d "$GIT_DIR" ]; then
log "bare 저장소 백업 → $BACKUP_ROOT/goldenChart.git.tgz"
tar -czf "$BACKUP_ROOT/goldenChart.git.tgz" -C "$(dirname "$GIT_DIR")" "$(basename "$GIT_DIR")" 2>/dev/null || true
log "bare 저장소 제거: $GIT_DIR"
rm -rf "$GIT_DIR"
fi
log "bare 저장소 초기화"
git init --bare "$GIT_DIR"
git --git-dir="$GIT_DIR" symbolic-ref HEAD refs/heads/main
# ── 4. 레거시 work-tree 제거·단일 경로 고정 ─────────────────────────────────
LEGACY_WORK_TREE="/Users/aidev/dev/goldenChart"
if [ -e "$LEGACY_WORK_TREE" ] || [ -L "$LEGACY_WORK_TREE" ]; then
log "레거시 경로 백업·이동: $LEGACY_WORK_TREE"
if [ -d "$LEGACY_WORK_TREE" ] && [ ! -L "$LEGACY_WORK_TREE" ]; then
tar -czf "$BACKUP_ROOT/legacy-dev-goldenChart.tgz" -C "$(dirname "$LEGACY_WORK_TREE")" "$(basename "$LEGACY_WORK_TREE")" 2>/dev/null || true
mv "$LEGACY_WORK_TREE" "$BACKUP_ROOT/legacy-dev-goldenChart-dir" 2>/dev/null || true
else
rm -f "$LEGACY_WORK_TREE" 2>/dev/null || true
fi
fi
ln -sfn "$WORK_TREE" "$LEGACY_WORK_TREE"
log " → $LEGACY_WORK_TREE → $WORK_TREE (심볼릭 링크)"
# ── 5. work-tree 정리 (중첩 .git 제거, 소스만 비움) ───────────────────────
log "work-tree 정리: $WORK_TREE"
mkdir -p "$WORK_TREE"
if [ -d "$WORK_TREE/.git" ]; then
rm -rf "$WORK_TREE/.git"
log " → 중첩 .git 제거 완료"
fi
# 소스 파일만 삭제 (.env·data·docker 볼륨 경로 유지)
find "$WORK_TREE" -mindepth 1 -maxdepth 1 \
! -name '.env' \
! -name '.env.*' \
! -name 'data' \
-exec rm -rf {} + 2>/dev/null || true
[ -f "$BACKUP_ROOT/.env" ] && cp -a "$BACKUP_ROOT/.env" "$WORK_TREE/.env" && log " → .env 복원"
# ── 6. deploy.sh · post-receive 설치 ───────────────────────────────────────
log "deploy.sh 설치"
cp -f "$REPO_ROOT/scripts/deploy.sh" "$DEPLOY_SCRIPT"
chmod +x "$DEPLOY_SCRIPT"
log "post-receive 훅 설치"
cp -f "$REPO_ROOT/scripts/post-receive" "$GIT_DIR/hooks/post-receive"
chmod +x "$GIT_DIR/hooks/post-receive"
if [ -x /Volumes/ADATA/git/git-push-summary.sh ]; then
log "git-push-summary.sh 유지"
else
log "[WARN] /Volumes/ADATA/git/git-push-summary.sh 없음 — push 요약 생략"
fi
# ── 7. Jenkins Job 재생성 ──────────────────────────────────────────────────
log "Jenkins job 생성: $JENKINS_JOB"
mkdir -p "${JENKINS_HOME}/jobs/${JENKINS_JOB}"
cat > "${JENKINS_HOME}/jobs/${JENKINS_JOB}/config.xml" << 'JENKINS_XML'
GoldenChart — Track B (deploy.sh, file:// bare repo)
false
2
file:///Volumes/ADATA/git/goldenChart.git
*/main
false
true
false
false
false
false
#!/bin/bash
set -euo pipefail
export PATH="/opt/homebrew/bin:/opt/homebrew/sbin:/usr/local/bin:$PATH"
echo "=== goldenChart Jenkins Build #${BUILD_NUMBER} ==="
echo "시각: $(date)"
SERVICE_NAME="${SERVICE_NAME:-all}" /Volumes/ADATA/git/deploy.sh
JENKINS_XML
# Jenkins 설정 리로드 (실패해도 job 파일은 생성됨)
if command -v jenkins-cli >/dev/null 2>&1; then
jenkins-cli reload-configuration 2>/dev/null || true
fi
if curl -sf -o /dev/null "http://127.0.0.1:8090/login" 2>/dev/null; then
curl -sf -X POST "http://127.0.0.1:8090/reload" 2>/dev/null || true
fi
rm -f /tmp/goldenchart_deploy.lock 2>/dev/null || true
log "============================================================"
log "서버 Git/Jenkins 재구축 완료 (소스는 아직 비어 있음)"
log " GIT_DIR : $GIT_DIR"
log " WORK_TREE : $WORK_TREE (중첩 .git 없음)"
log " Jenkins : $JENKINS_JOB → file://$GIT_DIR"
log ""
log "다음: 로컬에서 실행"
log " cd && git push origin main"
log "============================================================"