import { query } from '../utils/db' import { syncGitRepository } from '../utils/git-sync' import { syncSvnRepository } from '../utils/svn-sync' /** * VCS 저장소 자동 동기화 Cron Job * 매일 새벽 3시에 실행 */ // 마지막 실행 시간 체크 let lastSyncDate = '' function getTodayDate() { return new Date().toISOString().split('T')[0] } function getCurrentHour() { return new Date().getHours() } /** * 모든 활성 저장소 동기화 */ async function syncAllRepositories() { console.log('[VCS-SYNC] 자동 동기화 시작:', new Date().toISOString()) try { // 모든 활성 저장소 조회 const repos = await query(` SELECT r.repo_id, r.repo_name, s.server_type FROM wr_repository r JOIN wr_vcs_server s ON r.server_id = s.server_id WHERE r.is_active = true AND s.is_active = true `) console.log(`[VCS-SYNC] 동기화 대상 저장소: ${repos.length}개`) let successCount = 0 let failCount = 0 for (const repo of repos) { try { let result if (repo.server_type === 'GIT') { result = await syncGitRepository(repo.repo_id) } else if (repo.server_type === 'SVN') { result = await syncSvnRepository(repo.repo_id) } if (result?.success) { successCount++ console.log(`[VCS-SYNC] ✓ ${repo.repo_name}: ${result.message}`) } else { failCount++ console.log(`[VCS-SYNC] ✗ ${repo.repo_name}: ${result?.message || '알 수 없는 오류'}`) } } catch (e: any) { failCount++ console.error(`[VCS-SYNC] ✗ ${repo.repo_name} 오류:`, e.message) } // 저장소 간 1초 대기 (서버 부하 방지) await new Promise(resolve => setTimeout(resolve, 1000)) } console.log(`[VCS-SYNC] 동기화 완료: 성공 ${successCount}개, 실패 ${failCount}개`) lastSyncDate = getTodayDate() } catch (e: any) { console.error('[VCS-SYNC] 동기화 중 오류:', e.message) } } /** * Cron 체크 (1시간마다 실행, 새벽 3시에 동기화) */ function checkAndSync() { const today = getTodayDate() const hour = getCurrentHour() // 새벽 3시이고, 오늘 아직 실행 안했으면 실행 if (hour === 3 && lastSyncDate !== today) { syncAllRepositories() } } export default defineNitroPlugin((nitroApp) => { // 서버 시작 시 로그 console.log('[VCS-SYNC] Cron Job 플러그인 로드됨 (매일 03:00 실행)') // 개발 환경에서는 비활성화 옵션 if (process.env.DISABLE_VCS_SYNC === 'true') { console.log('[VCS-SYNC] 환경변수로 비활성화됨') return } // 1시간마다 체크 setInterval(checkAndSync, 60 * 60 * 1000) // 서버 시작 5분 후 첫 체크 setTimeout(checkAndSync, 5 * 60 * 1000) })