103 lines
2.8 KiB
TypeScript
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)
|
|
})
|