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)
| 48 | |
| 49 | // handleFailedJobLogs gets logs for all failed jobs in a workflow run |
| 50 | func 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 { |
no test coverage detected