mirror of
https://github.com/game-ci/unity-builder.git
synced 2026-06-12 00:43:55 -07:00
pr feedback
This commit is contained in:
@@ -218,23 +218,35 @@ class KubernetesTaskRunner {
|
||||
const needsFallback = output.trim().length === 0;
|
||||
if (needsFallback) {
|
||||
CloudRunnerLogger.log('Output is empty, attempting aggressive log collection fallback...');
|
||||
// Give the pod a moment to finish writing logs before we try to read them
|
||||
await new Promise((resolve) => setTimeout(resolve, 5000));
|
||||
}
|
||||
|
||||
// Always try fallback if output is empty, or if pod is terminated (to capture post-build messages)
|
||||
try {
|
||||
const isPodStillRunning = await KubernetesPods.IsPodRunning(podName, namespace, kubeClient);
|
||||
if (!isPodStillRunning || needsFallback) {
|
||||
CloudRunnerLogger.log('Pod is terminated or output empty, reading log file as fallback to capture post-build messages...');
|
||||
const shouldTryFallback = !isPodStillRunning || needsFallback;
|
||||
|
||||
if (shouldTryFallback) {
|
||||
CloudRunnerLogger.log(
|
||||
`Pod is ${isPodStillRunning ? 'running' : 'terminated'} and output is ${
|
||||
needsFallback ? 'empty' : 'not empty'
|
||||
}, reading log file as fallback...`,
|
||||
);
|
||||
try {
|
||||
// Try to read the log file from the terminated pod
|
||||
// Try to read the log file from the pod
|
||||
// For killed pods (OOM), kubectl exec might not work, so we try multiple approaches
|
||||
// First try --previous flag for terminated containers, then try without it
|
||||
let logFileContent = '';
|
||||
|
||||
|
||||
// Try multiple approaches to get the log file
|
||||
// Order matters: try terminated container first, then current, then kubectl logs as last resort
|
||||
const attempts = [
|
||||
// For terminated pods, try --previous first
|
||||
`kubectl exec ${podName} -c ${containerName} -n ${namespace} --previous -- cat /home/job-log.txt 2>/dev/null || echo ""`,
|
||||
// Try current container
|
||||
`kubectl exec ${podName} -c ${containerName} -n ${namespace} -- cat /home/job-log.txt 2>/dev/null || echo ""`,
|
||||
// Try to get logs one more time without -f flag
|
||||
// Try kubectl logs as fallback (might capture stdout even if exec fails)
|
||||
`kubectl logs ${podName} -c ${containerName} -n ${namespace} --previous 2>/dev/null || echo ""`,
|
||||
`kubectl logs ${podName} -c ${containerName} -n ${namespace} 2>/dev/null || echo ""`,
|
||||
];
|
||||
@@ -244,20 +256,33 @@ class KubernetesTaskRunner {
|
||||
break; // We got content, no need to try more
|
||||
}
|
||||
try {
|
||||
CloudRunnerLogger.log(`Trying fallback method: ${attempt.substring(0, 80)}...`);
|
||||
const result = await CloudRunnerSystem.Run(attempt, true, true);
|
||||
if (result && result.trim()) {
|
||||
logFileContent = result;
|
||||
CloudRunnerLogger.log(`Successfully read logs using fallback method: ${attempt.substring(0, 50)}...`);
|
||||
CloudRunnerLogger.log(
|
||||
`Successfully read logs using fallback method (${logFileContent.length} chars): ${attempt.substring(
|
||||
0,
|
||||
50,
|
||||
)}...`,
|
||||
);
|
||||
break;
|
||||
} else {
|
||||
CloudRunnerLogger.log(`Fallback method returned empty result: ${attempt.substring(0, 50)}...`);
|
||||
}
|
||||
} catch {
|
||||
} catch (attemptError: any) {
|
||||
CloudRunnerLogger.log(
|
||||
`Fallback method failed: ${attempt.substring(0, 50)}... Error: ${
|
||||
attemptError?.message || attemptError
|
||||
}`,
|
||||
);
|
||||
// Continue to next attempt
|
||||
}
|
||||
}
|
||||
|
||||
if (!logFileContent || !logFileContent.trim()) {
|
||||
CloudRunnerLogger.logWarning(
|
||||
'Could not read log file from terminated pod (may be OOM-killed). Using available logs.',
|
||||
'Could not read log file from pod after all fallback attempts (may be OOM-killed or pod not accessible).',
|
||||
);
|
||||
}
|
||||
|
||||
@@ -277,25 +302,16 @@ class KubernetesTaskRunner {
|
||||
!lowerLine.includes('unable to retrieve container logs') &&
|
||||
!existingLines.has(trimmedLine)
|
||||
) {
|
||||
// Add missing line to output
|
||||
output += `${line}\n`;
|
||||
// Process through FollowLogStreamService to ensure proper handling
|
||||
// Process through FollowLogStreamService - it will append to output
|
||||
// Don't add to output manually since handleIteration does it
|
||||
({ shouldReadLogs, shouldCleanup, output } = FollowLogStreamService.handleIteration(
|
||||
line,
|
||||
trimmedLine,
|
||||
shouldReadLogs,
|
||||
shouldCleanup,
|
||||
output,
|
||||
));
|
||||
}
|
||||
}
|
||||
} else if (needsFallback && output.trim().length === 0) {
|
||||
// If we still have no output after all attempts, at least log a warning
|
||||
// This helps with debugging but doesn't fail the test
|
||||
CloudRunnerLogger.logWarning(
|
||||
'Could not retrieve any logs from pod. Pod may have been killed before logs were written.',
|
||||
);
|
||||
// Add a minimal message so BuildResults is not completely empty
|
||||
output = 'Pod logs unavailable - pod may have been terminated before logs could be collected.\n';
|
||||
}
|
||||
} catch (logFileError: any) {
|
||||
CloudRunnerLogger.logWarning(
|
||||
@@ -304,10 +320,25 @@ class KubernetesTaskRunner {
|
||||
// Continue with existing output - this is a best-effort fallback
|
||||
}
|
||||
}
|
||||
|
||||
// If output is still empty after fallback attempts, add a warning message
|
||||
// This ensures BuildResults is not completely empty, which would cause test failures
|
||||
if (needsFallback && output.trim().length === 0) {
|
||||
CloudRunnerLogger.logWarning(
|
||||
'Could not retrieve any logs from pod after all attempts. Pod may have been killed before logs were written.',
|
||||
);
|
||||
// Add a minimal message so BuildResults is not completely empty
|
||||
// This helps with debugging and prevents test failures due to empty results
|
||||
output = 'Pod logs unavailable - pod may have been terminated before logs could be collected.\n';
|
||||
}
|
||||
} catch (fallbackError: any) {
|
||||
CloudRunnerLogger.logWarning(
|
||||
`Error checking pod status for log file fallback: ${fallbackError?.message || fallbackError}`,
|
||||
);
|
||||
// If output is empty and we hit an error, still add a message so BuildResults isn't empty
|
||||
if (needsFallback && output.trim().length === 0) {
|
||||
output = `Error retrieving logs: ${fallbackError?.message || fallbackError}\n`;
|
||||
}
|
||||
// Continue with existing output - this is a best-effort fallback
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user