MCPcopy Index your code
hub / github.com/github/github-mcp-server / handleFailedJobLogs

Function handleFailedJobLogs

pkg/github/actions.go:50–112  ·  view source on GitHub ↗

handleFailedJobLogs gets logs for all failed jobs in a workflow run

(ctx context.Context, client *github.Client, owner, repo string, runID int64, returnContent bool, tailLines int, contentWindowSize int)

Source from the content-addressed store, hash-verified

48
49// handleFailedJobLogs gets logs for all failed jobs in a workflow run
50func handleFailedJobLogs(ctx context.Context, client *github.Client, owner, repo string, runID int64, returnContent bool, tailLines int, contentWindowSize int) (*mcp.CallToolResult, any, error) {
51 // First, get all jobs for the workflow run
52 jobs, resp, err := client.Actions.ListWorkflowJobs(ctx, owner, repo, runID, &github.ListWorkflowJobsOptions{
53 Filter: "latest",
54 })
55 if err != nil {
56 return ghErrors.NewGitHubAPIErrorResponse(ctx, "failed to list workflow jobs", resp, err), nil, nil
57 }
58 defer func() { _ = resp.Body.Close() }()
59
60 // Filter for failed jobs
61 var failedJobs []*github.WorkflowJob
62 for _, job := range jobs.Jobs {
63 if job.GetConclusion() == "failure" {
64 failedJobs = append(failedJobs, job)
65 }
66 }
67
68 if len(failedJobs) == 0 {
69 result := map[string]any{
70 "message": "No failed jobs found in this workflow run",
71 "run_id": runID,
72 "total_jobs": len(jobs.Jobs),
73 "failed_jobs": 0,
74 }
75 r, _ := json.Marshal(result)
76 return utils.NewToolResultText(string(r)), nil, nil
77 }
78
79 // Collect logs for all failed jobs
80 var logResults []map[string]any
81 for _, job := range failedJobs {
82 jobResult, resp, err := getJobLogData(ctx, client, owner, repo, job.GetID(), job.GetName(), returnContent, tailLines, contentWindowSize)
83 if err != nil {
84 // Continue with other jobs even if one fails
85 jobResult = map[string]any{
86 "job_id": job.GetID(),
87 "job_name": job.GetName(),
88 "error": err.Error(),
89 }
90 // Enable reporting of status codes and error causes
91 _, _ = ghErrors.NewGitHubAPIErrorToCtx(ctx, "failed to get job logs", resp, err) // Explicitly ignore error for graceful handling
92 }
93
94 logResults = append(logResults, jobResult)
95 }
96
97 result := map[string]any{
98 "message": fmt.Sprintf("Retrieved logs for %d failed jobs", len(failedJobs)),
99 "run_id": runID,
100 "total_jobs": len(jobs.Jobs),
101 "failed_jobs": len(failedJobs),
102 "logs": logResults,
103 "return_format": map[string]bool{"content": returnContent, "urls": !returnContent},
104 }
105
106 r, err := json.Marshal(result)
107 if err != nil {

Callers 1

ActionsGetJobLogsFunction · 0.85

Calls 4

NewToolResultTextFunction · 0.92
getJobLogDataFunction · 0.85
CloseMethod · 0.80
ErrorMethod · 0.45

Tested by

no test coverage detected