test(e2e): entrypoint ERR trap and richer CI failure logs
test / test (push) Has been cancelled

CI showed exit=1 in ~3s with empty docker logs after /data/opendkim was
created. Log each entrypoint step and trap ERR with LINENO; also read the
container LogPath and docker logs by container id when compose logs are empty.

Co-Authored-By: Composer <noreply@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
mixeme
2026-08-09 09:12:47 +03:00
parent d43a86c4bd
commit 1639701de3
3 changed files with 65 additions and 11 deletions
+28 -8
View File
@@ -128,6 +128,21 @@ func runEntrypointBackground(t *testing.T, hostnameEnv string) (output string, s
inspect, _ := exec.Command("docker", "inspect", name, "--format",
"status={{.State.Status}} exit={{.State.ExitCode}} err={{.State.Error}} oom={{.State.OOMKilled}} started={{.State.StartedAt}} finished={{.State.FinishedAt}}").CombinedOutput()
logs, logErr := exec.Command("docker", "logs", name).CombinedOutput()
// Exited containers sometimes yield empty `docker logs` in CI; also read
// the JSON-file log path docker recorded on the container.
logPathOut, _ := exec.Command("docker", "inspect", name, "--format", "{{.LogPath}}").CombinedOutput()
logPath := strings.TrimSpace(string(logPathOut))
logFileHead := ""
if logPath != "" {
if b, e := os.ReadFile(logPath); e == nil {
logFileHead = truncateForDebug(string(b), 4000)
if strings.TrimSpace(string(logs)) == "" && len(b) > 0 {
logs = b
}
} else {
logFileHead = "read LogPath: " + e.Error()
}
}
dataMode, _ := exec.Command("docker", "exec", name, "stat", "-c", "%a %U:%G", "/data").CombinedOutput()
opendkimStat, _ := exec.Command("docker", "exec", name, "stat", "-c", "%a %U:%G", "/data/opendkim").CombinedOutput()
keyTableStat, _ := exec.Command("docker", "exec", name, "stat", "-c", "%a %U:%G", "/data/opendkim/KeyTable").CombinedOutput()
@@ -147,16 +162,18 @@ func runEntrypointBackground(t *testing.T, hostnameEnv string) (output string, s
hostDataListing = strings.Join(parts, ",")
}
agentDebugLog("H1", "hostname_gate_test.go:post-wait", "data permissions", map[string]any{
"dataMode": strings.TrimSpace(string(dataMode)),
"opendkimStat": strings.TrimSpace(string(opendkimStat)),
"keyTableStat": strings.TrimSpace(string(keyTableStat)),
"dataMode": strings.TrimSpace(string(dataMode)),
"opendkimStat": strings.TrimSpace(string(opendkimStat)),
"keyTableStat": strings.TrimSpace(string(keyTableStat)),
"hostDataListing": hostDataListing,
})
agentDebugLog("H2", "hostname_gate_test.go:post-wait", "container inspect", map[string]any{
"inspect": strings.TrimSpace(string(inspect)),
"waitErr": fmt.Sprintf("%v", err),
"logErr": fmt.Sprintf("%v", logErr),
"logLen": len(logs),
"inspect": strings.TrimSpace(string(inspect)),
"waitErr": fmt.Sprintf("%v", err),
"logErr": fmt.Sprintf("%v", logErr),
"logLen": len(logs),
"logPath": logPath,
"logFileHead": logFileHead,
})
agentDebugLog("H3", "hostname_gate_test.go:post-wait", "supervisor and logs", map[string]any{
"supervisorctl": strings.TrimSpace(string(supStatus)),
@@ -167,8 +184,11 @@ func runEntrypointBackground(t *testing.T, hostnameEnv string) (output string, s
diag := string(logs)
if strings.TrimSpace(diag) == "" {
diag = "(empty docker logs)\ninspect: " + strings.TrimSpace(string(inspect)) +
"\nlogPath: " + logPath +
"\nlogFileHead: " + logFileHead +
"\nsupervisorctl: " + strings.TrimSpace(string(supStatus)) +
"\n/data mode: " + strings.TrimSpace(string(dataMode))
"\n/data mode: " + strings.TrimSpace(string(dataMode)) +
"\nhost /data: " + hostDataListing
}
return diag, err == nil
}