Fix deploy webhook: auto-recover from broken .git directory
If git pull fails (corrupted .git), automatically remove the broken .git dir and re-clone. This prevents the chicken-and-egg problem where a broken repo state makes the deploy webhook permanently stuck. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
629c7d2cef
commit
4a9db0de0a
1 changed files with 32 additions and 3 deletions
|
|
@ -10,18 +10,47 @@ if ($headerSecret !== $secret) {
|
||||||
exit;
|
exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Run git pull directly
|
// Deploy: clone if needed, otherwise pull (with auto-recovery)
|
||||||
$repoPath = dirname(__DIR__);
|
$repoPath = dirname(__DIR__);
|
||||||
|
$repoUrl = 'https://payfrit:Noorani%401234@git.payfrit.com/payfrit/payfrit-api.git';
|
||||||
$output = [];
|
$output = [];
|
||||||
$exitCode = 0;
|
$exitCode = 0;
|
||||||
exec("cd " . escapeshellarg($repoPath) . " && git pull origin main 2>&1", $output, $exitCode);
|
$method = 'unknown';
|
||||||
|
|
||||||
// Also write trigger file for backward compatibility
|
if (is_dir($repoPath . '/.git')) {
|
||||||
|
// Try pull first
|
||||||
|
$method = 'pull';
|
||||||
|
exec("cd " . escapeshellarg($repoPath) . " && git pull origin main 2>&1", $output, $exitCode);
|
||||||
|
|
||||||
|
// If pull fails, nuke the broken .git and re-clone
|
||||||
|
if ($exitCode !== 0) {
|
||||||
|
$method = 'recovery-clone';
|
||||||
|
$output[] = '--- pull failed, attempting recovery clone ---';
|
||||||
|
exec("rm -rf " . escapeshellarg($repoPath . '/.git') . " 2>&1");
|
||||||
|
// Fall through to clone logic below
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!is_dir($repoPath . '/.git')) {
|
||||||
|
// Fresh clone into temp dir, then copy into web root
|
||||||
|
$method = ($method === 'recovery-clone') ? 'recovery-clone' : 'fresh-clone';
|
||||||
|
$tmpDir = '/tmp/payfrit-api-clone-' . time();
|
||||||
|
$cloneOutput = [];
|
||||||
|
exec("git clone --branch main " . escapeshellarg($repoUrl) . " " . escapeshellarg($tmpDir) . " 2>&1", $cloneOutput, $exitCode);
|
||||||
|
$output = array_merge($output, $cloneOutput);
|
||||||
|
if ($exitCode === 0) {
|
||||||
|
exec("cp -a " . escapeshellarg($tmpDir) . "/. " . escapeshellarg($repoPath) . "/ 2>&1", $output, $exitCode);
|
||||||
|
exec("rm -rf " . escapeshellarg($tmpDir) . " 2>&1");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Write trigger file for backward compatibility
|
||||||
$triggerFile = '/tmp/deploy-payfrit-api.trigger';
|
$triggerFile = '/tmp/deploy-payfrit-api.trigger';
|
||||||
file_put_contents($triggerFile, date('Y-m-d H:i:s'));
|
file_put_contents($triggerFile, date('Y-m-d H:i:s'));
|
||||||
|
|
||||||
echo json_encode([
|
echo json_encode([
|
||||||
'OK' => $exitCode === 0,
|
'OK' => $exitCode === 0,
|
||||||
|
'METHOD' => $method,
|
||||||
'MESSAGE' => $exitCode === 0 ? 'Deploy successful' : 'Deploy failed',
|
'MESSAGE' => $exitCode === 0 ? 'Deploy successful' : 'Deploy failed',
|
||||||
'OUTPUT' => implode("\n", $output),
|
'OUTPUT' => implode("\n", $output),
|
||||||
'TIME' => date('c')
|
'TIME' => date('c')
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue