#!/bin/bash # ============================================================== # GUARDiA Gitea 초기화 스크립트 # ============================================================== # Gitea 컨테이너/서비스가 기동된 후 실행하여 # 관리자 계정, 조직, 저장소, 브랜치 보호를 자동 설정합니다. # # 사용법: # bash setup/gitea_init.sh # GITEA_PORT=3000 GITEA_ADMIN=admin bash setup/gitea_init.sh # ============================================================== set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" GUARDIA_ROOT="$(dirname "$SCRIPT_DIR")" GITEA_PORT="${GITEA_PORT:-3000}" GITEA_BASE="http://localhost:${GITEA_PORT}" GITEA_ADMIN="${GITEA_ADMIN:-gitadmin}" GITEA_ADMIN_PW="${GITEA_ADMIN_PW:-Gitea@guardia!}" GITEA_ADMIN_EMAIL="${GITEA_ADMIN_EMAIL:-admin@guardia.local}" GITEA_ORG="${GITEA_ORG:-guardia}" GITEA_REPO="${GITEA_REPO:-GUARDiA}" GREEN='\033[0;32m'; YELLOW='\033[1;33m'; NC='\033[0m' ok() { echo -e "${GREEN}[OK]${NC} $*"; } warn() { echo -e "${YELLOW}[WARN]${NC} $*"; } info() { echo -e " $*"; } API="${GITEA_BASE}/api/v1" AUTH="Authorization: Basic $(echo -n "${GITEA_ADMIN}:${GITEA_ADMIN_PW}" | base64)" echo "==================================================" echo " Gitea 초기화" echo " URL: $GITEA_BASE" echo "==================================================" # ── Gitea 응답 대기 ─────────────────────────────────────────── echo "" echo "[1/7] Gitea 서비스 응답 대기..." for i in $(seq 1 30); do if curl -sf "$API/version" -o /dev/null 2>/dev/null; then ok "Gitea 응답 확인" break fi sleep 2 [[ $i -eq 30 ]] && { echo "[ERR] Gitea 응답 없음 — 서비스를 먼저 시작하세요"; exit 1; } done # ── 관리자 계정 생성 (Gitea API 인증용) ───────────────────────── echo "" echo "[2/7] 관리자 계정 설정..." # Docker 환경: gitea admin 명령 사용 if command -v docker &>/dev/null && docker ps | grep -q guardia-gitea; then docker exec guardia-gitea gitea admin user create \ --username "$GITEA_ADMIN" \ --password "$GITEA_ADMIN_PW" \ --email "$GITEA_ADMIN_EMAIL" \ --admin 2>/dev/null || info "관리자 이미 존재" elif command -v gitea &>/dev/null; then gitea admin user create \ --username "$GITEA_ADMIN" \ --password "$GITEA_ADMIN_PW" \ --email "$GITEA_ADMIN_EMAIL" \ --admin 2>/dev/null || info "관리자 이미 존재" else # API로 관리자 생성 시도 (초기 설치 시) curl -sf -X POST "$API/users" \ -H "Content-Type: application/json" \ -d "{\"username\":\"${GITEA_ADMIN}\",\"password\":\"${GITEA_ADMIN_PW}\",\"email\":\"${GITEA_ADMIN_EMAIL}\"}" \ -o /dev/null 2>/dev/null || info "관리자 이미 존재" fi ok "관리자: $GITEA_ADMIN" # ── 조직 생성 ──────────────────────────────────────────────── echo "" echo "[3/7] 조직 생성..." curl -sf -X POST "$API/orgs" \ -H "$AUTH" -H "Content-Type: application/json" \ -d "{\"username\":\"${GITEA_ORG}\",\"visibility\":\"private\",\"description\":\"GUARDiA ITSM Organization\"}" \ -o /dev/null 2>/dev/null && ok "조직 생성: $GITEA_ORG" || info "조직 이미 존재: $GITEA_ORG" # ── GUARDiA 저장소 생성 ────────────────────────────────────── echo "" echo "[4/7] 저장소 생성..." curl -sf -X POST "$API/orgs/${GITEA_ORG}/repos" \ -H "$AUTH" -H "Content-Type: application/json" \ -d "{ \"name\":\"${GITEA_REPO}\", \"description\":\"GUARDiA ITSM Platform\", \"private\":true, \"default_branch\":\"main\", \"auto_init\":true, \"readme\":\"Default\" }" \ -o /dev/null 2>/dev/null && ok "저장소 생성: ${GITEA_ORG}/${GITEA_REPO}" \ || info "저장소 이미 존재" sleep 3 # 저장소 초기화 대기 # ── develop 브랜치 생성 ───────────────────────────────────── echo "" echo "[5/7] develop 브랜치 생성..." curl -sf -X POST "$API/repos/${GITEA_ORG}/${GITEA_REPO}/branches" \ -H "$AUTH" -H "Content-Type: application/json" \ -d '{"new_branch_name":"develop","old_branch_name":"main"}' \ -o /dev/null 2>/dev/null && ok "develop 브랜치 생성" || info "develop 브랜치 이미 존재" # ── main 브랜치 보호 설정 ──────────────────────────────────── echo "" echo "[6/7] main 브랜치 보호 설정..." curl -sf -X POST "$API/repos/${GITEA_ORG}/${GITEA_REPO}/branch_protections" \ -H "$AUTH" -H "Content-Type: application/json" \ -d "{ \"branch_name\": \"main\", \"enable_push\": false, \"enable_push_whitelist\": true, \"push_whitelist_usernames\": [\"${GITEA_ADMIN}\"], \"required_approvals\": 1, \"enable_approvals_whitelist\": false, \"block_on_rejected_reviews\": true, \"block_on_official_review_requests\": false, \"dismiss_stale_approvals\": true }" \ -o /dev/null 2>/dev/null \ && ok "main 브랜치 보호: PR 필수, 리뷰 1명 필수" \ || info "브랜치 보호 이미 설정됨" # develop 브랜치 보호 (push 허용, but 직접 force-push 금지) curl -sf -X POST "$API/repos/${GITEA_ORG}/${GITEA_REPO}/branch_protections" \ -H "$AUTH" -H "Content-Type: application/json" \ -d '{"branch_name":"develop","enable_force_push":false}' \ -o /dev/null 2>/dev/null || true # ── 개발자 계정 + 개인 브랜치 생성 ────────────────────────── echo "" echo "[7/7] 개발자 계정 + 개인 브랜치 생성..." # GUARDiA ITSM 역할에 맞는 기본 개발자 계정 declare -A USERS=( ["engineer1"]="Eng1@guardia!:engineer1@guardia.local" ["engineer2"]="Eng2@guardia!:engineer2@guardia.local" ["pm1"]="PM1@guardia!:pm1@guardia.local" ["admin"]="Admin@guardia!:admin@guardia.local" ) # Developers 팀 생성 TEAM_RESP=$(curl -sf -X POST "$API/orgs/${GITEA_ORG}/teams" \ -H "$AUTH" -H "Content-Type: application/json" \ -d "{ \"name\":\"Developers\", \"permission\":\"write\", \"units\":[\"repo.code\",\"repo.issues\",\"repo.pulls\"], \"includes_all_repositories\":true }" 2>/dev/null) TEAM_ID=$(echo "$TEAM_RESP" | python3 -c "import sys,json; print(json.load(sys.stdin).get('id',''))" 2>/dev/null || echo "") [[ -n "$TEAM_ID" ]] && ok "Developers 팀 생성 (ID: $TEAM_ID)" # 팀에 저장소 추가 [[ -n "$TEAM_ID" ]] && curl -sf -X PUT "$API/teams/${TEAM_ID}/repos/${GITEA_ORG}/${GITEA_REPO}" \ -H "$AUTH" -o /dev/null 2>/dev/null for username in "${!USERS[@]}"; do IFS=':' read -r pw email <<< "${USERS[$username]}" # 사용자 생성 curl -sf -X POST "$API/admin/users" \ -H "$AUTH" -H "Content-Type: application/json" \ -d "{ \"username\":\"${username}\", \"password\":\"${pw}\", \"email\":\"${email}\", \"login_name\":\"${username}\", \"source_id\":0, \"send_notify\":false, \"must_change_password\":false }" -o /dev/null 2>/dev/null || info "사용자 이미 존재: $username" # 팀 멤버 추가 [[ -n "$TEAM_ID" ]] && curl -sf -X PUT "$API/teams/${TEAM_ID}/members/${username}" \ -H "$AUTH" -o /dev/null 2>/dev/null # 개인 feature 브랜치 생성 (feature/이름/init) curl -sf -X POST "$API/repos/${GITEA_ORG}/${GITEA_REPO}/branches" \ -H "$AUTH" -H "Content-Type: application/json" \ -d "{\"new_branch_name\":\"feature/${username}/init\",\"old_branch_name\":\"develop\"}" \ -o /dev/null 2>/dev/null ok "계정 + 브랜치: $username (feature/${username}/init)" done # ── 현재 소스 push ─────────────────────────────────────────── echo "" echo " 현재 GUARDiA 소스를 Gitea에 push..." GITEA_URL="http://${GITEA_ADMIN}:${GITEA_ADMIN_PW}@localhost:${GITEA_PORT}/${GITEA_ORG}/${GITEA_REPO}.git" git -C "$GUARDIA_ROOT" remote remove gitea 2>/dev/null || true git -C "$GUARDIA_ROOT" remote add gitea "$GITEA_URL" git -C "$GUARDIA_ROOT" push gitea main 2>/dev/null \ && ok "main 브랜치 push 완료" || warn "main push 실패 — 수동: git push gitea main" git -C "$GUARDIA_ROOT" push gitea develop 2>/dev/null || true echo "" echo "==================================================" ok "Gitea 초기화 완료!" echo "" info "Gitea URL: http://localhost:${GITEA_PORT}" info "관리자: ${GITEA_ADMIN} / ${GITEA_ADMIN_PW}" info "저장소: http://localhost:${GITEA_PORT}/${GITEA_ORG}/${GITEA_REPO}" echo "" info "=== 브랜치 전략 ===" info " main : PR + 리뷰 1명 필수 (보호)" info " develop : 통합 브랜치 (force-push 금지)" info " feature/이름/기능명: 개인 개발 브랜치" echo "" info "=== 개발자 계정 ===" for username in "${!USERS[@]}"; do IFS=':' read -r pw _ <<< "${USERS[$username]}" info " $username / $pw → feature/${username}/init" done echo "" info "=== Git 원격 저장소 설정 ===" info " git remote add guardia-gitea http://localhost:${GITEA_PORT}/${GITEA_ORG}/${GITEA_REPO}.git" info " git push guardia-gitea feature/이름/기능명" echo "=================================================="