Files
weeklyreport/backend/plugins/vcs-sync-cron.ts
2026-01-11 14:32:45 +09:00

103 lines
2.8 KiB
TypeScript

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)
})