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
+22 -3
View File
@@ -54,17 +54,36 @@ func checkSupervisorProcesses(s *stack) error {
ps, _ := s.compose("ps", "-a", "--format", "json")
inspectOut, _ := exec.Command("docker", "ps", "-a", "--filter", "name=selfpost-e2e",
"--format", "{{.Names}} {{.Status}} {{.ID}}").CombinedOutput()
// compose logs can be empty for a fast-exit container; pull docker logs by id.
rawDockerLogs := ""
for _, line := range strings.Split(string(inspectOut), "\n") {
fields := strings.Fields(line)
if len(fields) < 3 || !strings.Contains(fields[0], "selfpost-1") {
continue
}
id := fields[len(fields)-1]
if b, e := exec.Command("docker", "logs", id).CombinedOutput(); e == nil {
rawDockerLogs = string(b)
} else {
rawDockerLogs = e.Error() + "\n" + string(b)
}
if strings.TrimSpace(logs) == "" && strings.TrimSpace(rawDockerLogs) != "" {
logs = rawDockerLogs
}
break
}
dataPath := filepath.Join(s.stageDir, "data")
dataMode := ""
if fi, e := os.Stat(dataPath); e == nil {
dataMode = fmt.Sprintf("%04o", fi.Mode().Perm())
}
entrypointSnippet, _ := exec.Command("docker", "run", "--rm", "--entrypoint", "sh", "selfpost:e2e",
"-c", "grep -n 'chmod 755 /data\\|SELFPOST_HOSTNAME is not set' /usr/local/bin/entrypoint.sh | head -20").CombinedOutput()
"-c", "grep -n 'chmod 755 /data\\|entrypoint: command failed\\|step()' /usr/local/bin/entrypoint.sh | head -30").CombinedOutput()
agentDebugLog("H4", "process_check.go:fail", "compose selfpost not ready", map[string]any{
"waitErr": err.Error(),
"logsLen": len(logs),
"logsHead": truncateForDebug(logs, 4000),
"rawDockerLogsHead": truncateForDebug(rawDockerLogs, 4000),
"composePs": truncateForDebug(string(ps), 2000),
"dockerPs": strings.TrimSpace(string(inspectOut)),
"hostDataMode": dataMode,
@@ -74,8 +93,8 @@ func checkSupervisorProcesses(s *stack) error {
"snippet": strings.TrimSpace(string(entrypointSnippet)),
})
// #endregion
return fmt.Errorf("%w\n==== selfpost logs ====\n%s\n==== docker ps ====\n%s\n==== entrypoint markers ====\n%s",
err, logs, inspectOut, entrypointSnippet)
return fmt.Errorf("%w\n==== selfpost logs ====\n%s\n==== docker logs (by id) ====\n%s\n==== docker ps ====\n%s\n==== entrypoint markers ====\n%s",
err, logs, rawDockerLogs, inspectOut, entrypointSnippet)
}
return nil
}