mirror of
https://github.com/khoaliber/dockhand.git
synced 2026-03-03 05:29:05 +00:00
Initial commit
This commit is contained in:
102
lib/server/scheduler/tasks/git-stack-sync.ts
Normal file
102
lib/server/scheduler/tasks/git-stack-sync.ts
Normal file
@@ -0,0 +1,102 @@
|
||||
/**
|
||||
* Git Stack Auto-Sync Task
|
||||
*
|
||||
* Handles automatic syncing and deploying of git-based compose stacks.
|
||||
*/
|
||||
|
||||
import type { ScheduleTrigger } from '../../db';
|
||||
import {
|
||||
createScheduleExecution,
|
||||
updateScheduleExecution,
|
||||
appendScheduleExecutionLog
|
||||
} from '../../db';
|
||||
import { deployGitStack } from '../../git';
|
||||
import { sendEventNotification } from '../../notifications';
|
||||
|
||||
/**
|
||||
* Execute a git stack sync.
|
||||
*/
|
||||
export async function runGitStackSync(
|
||||
stackId: number,
|
||||
stackName: string,
|
||||
environmentId: number | null | undefined,
|
||||
triggeredBy: ScheduleTrigger
|
||||
): Promise<void> {
|
||||
const startTime = Date.now();
|
||||
|
||||
// Create execution record
|
||||
const execution = await createScheduleExecution({
|
||||
scheduleType: 'git_stack_sync',
|
||||
scheduleId: stackId,
|
||||
environmentId: environmentId ?? null,
|
||||
entityName: stackName,
|
||||
triggeredBy,
|
||||
status: 'running'
|
||||
});
|
||||
|
||||
await updateScheduleExecution(execution.id, {
|
||||
startedAt: new Date().toISOString()
|
||||
});
|
||||
|
||||
const log = (message: string) => {
|
||||
console.log(`[Git-sync] ${message}`);
|
||||
appendScheduleExecutionLog(execution.id, `[${new Date().toISOString()}] ${message}`);
|
||||
};
|
||||
|
||||
try {
|
||||
log(`Starting sync for stack: ${stackName}`);
|
||||
|
||||
// Deploy the git stack (only if there are changes)
|
||||
const result = await deployGitStack(stackId, { force: false });
|
||||
|
||||
const envId = environmentId ?? undefined;
|
||||
|
||||
if (result.success) {
|
||||
if (result.skipped) {
|
||||
log(`No changes detected for stack: ${stackName}, skipping redeploy`);
|
||||
|
||||
// Send notification for skipped sync
|
||||
await sendEventNotification('git_sync_skipped', {
|
||||
title: 'Git sync skipped',
|
||||
message: `Stack "${stackName}" sync skipped: no changes detected`,
|
||||
type: 'info'
|
||||
}, envId);
|
||||
} else {
|
||||
log(`Successfully deployed stack: ${stackName}`);
|
||||
|
||||
// Send notification for successful sync
|
||||
await sendEventNotification('git_sync_success', {
|
||||
title: 'Git stack deployed',
|
||||
message: `Stack "${stackName}" was synced and deployed successfully`,
|
||||
type: 'success'
|
||||
}, envId);
|
||||
}
|
||||
if (result.output) log(result.output);
|
||||
|
||||
await updateScheduleExecution(execution.id, {
|
||||
status: result.skipped ? 'skipped' : 'success',
|
||||
completedAt: new Date().toISOString(),
|
||||
duration: Date.now() - startTime,
|
||||
details: { output: result.output }
|
||||
});
|
||||
} else {
|
||||
throw new Error(result.error || 'Deployment failed');
|
||||
}
|
||||
} catch (error: any) {
|
||||
log(`Error: ${error.message}`);
|
||||
await updateScheduleExecution(execution.id, {
|
||||
status: 'failed',
|
||||
completedAt: new Date().toISOString(),
|
||||
duration: Date.now() - startTime,
|
||||
errorMessage: error.message
|
||||
});
|
||||
|
||||
// Send notification for failed sync
|
||||
const envId = environmentId ?? undefined;
|
||||
await sendEventNotification('git_sync_failed', {
|
||||
title: 'Git sync failed',
|
||||
message: `Stack "${stackName}" sync failed: ${error.message}`,
|
||||
type: 'error'
|
||||
}, envId);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user