Merge pull request #7879 from harveysanders/7771-list-all-run-jobs

Fetch all jobs on a `gh view run` with `json` flag
This commit is contained in:
Andy Feller 2023-09-06 09:46:43 +02:00 committed by GitHub
commit e5f499f301
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 74 additions and 6 deletions

View file

@ -4,6 +4,7 @@ import (
"archive/zip"
"errors"
"fmt"
"net/http"
"net/url"
"reflect"
"strings"
@ -424,19 +425,31 @@ func preloadWorkflowNames(client *api.Client, repo ghrepo.Interface, runs []Run)
}
type JobsPayload struct {
Jobs []Job
TotalCount int `json:"total_count"`
Jobs []Job
}
func GetJobs(client *api.Client, repo ghrepo.Interface, run *Run) ([]Job, error) {
if run.Jobs != nil {
return run.Jobs, nil
}
var result JobsPayload
if err := client.REST(repo.RepoHost(), "GET", run.JobsURL, nil, &result); err != nil {
return nil, err
query := url.Values{}
query.Set("per_page", "100")
jobsPath := fmt.Sprintf("%s?%s", run.JobsURL, query.Encode())
for jobsPath != "" {
var resp JobsPayload
var err error
jobsPath, err = client.RESTWithNext(repo.RepoHost(), http.MethodGet, jobsPath, nil, &resp)
if err != nil {
run.Jobs = nil
return nil, err
}
run.Jobs = append(run.Jobs, resp.Jobs...)
}
run.Jobs = result.Jobs
return result.Jobs, nil
return run.Jobs, nil
}
func GetJob(client *api.Client, repo ghrepo.Interface, jobID string) (*Job, error) {

View file

@ -5,6 +5,7 @@ import (
"time"
workflowShared "github.com/cli/cli/v2/pkg/cmd/workflow/shared"
"github.com/cli/cli/v2/pkg/iostreams"
)
var TestRunStartTime, _ = time.Parse("2006-01-02 15:04:05", "2021-02-23 04:51:00")
@ -122,3 +123,20 @@ var TestWorkflow workflowShared.Workflow = workflowShared.Workflow{
Name: "CI",
ID: 123,
}
type TestExporter struct {
fields []string
writeHandler func(io *iostreams.IOStreams, data interface{}) error
}
func MakeTestExporter(fields []string, wh func(io *iostreams.IOStreams, data interface{}) error) *TestExporter {
return &TestExporter{fields: fields, writeHandler: wh}
}
func (t *TestExporter) Fields() []string {
return t.fields
}
func (t *TestExporter) Write(io *iostreams.IOStreams, data interface{}) error {
return t.writeHandler(io, data)
}

View file

@ -6,6 +6,7 @@ import (
"fmt"
"io"
"net/http"
"net/url"
"testing"
"time"
@ -1242,6 +1243,42 @@ func TestViewRun(t *testing.T) {
},
wantOut: "\nX trunk CI · 123\nTriggered via push about 59 minutes ago\n\nX This run likely failed because of a workflow file issue.\n\nFor more information, see: https://github.com/runs/123\n",
},
{
name: "Fetches all of a run's jobs with --json flag",
opts: &ViewOptions{
RunID: "3",
Exporter: shared.MakeTestExporter(
[]string{"jobs"},
func(io *iostreams.IOStreams, data interface{}) error {
run, ok := data.(*shared.Run)
if !ok {
return fmt.Errorf("expected data type *shared.Run")
}
fmt.Fprintf(io.Out, "fetched %d jobs\n", len(run.Jobs))
return nil
},
),
},
httpStubs: func(reg *httpmock.Registry) {
reg.Register(
httpmock.REST("GET", "repos/OWNER/REPO/actions/runs/3"),
httpmock.JSONResponse(shared.SuccessfulRun))
reg.Register(
httpmock.REST("GET", "repos/OWNER/REPO/actions/workflows/123"),
httpmock.JSONResponse(shared.TestWorkflow))
reg.Register(
httpmock.QueryMatcher("GET", "runs/3/jobs", url.Values{"per_page": []string{"100"}}),
httpmock.WithHeader(
httpmock.StringResponse(`{"jobs":[{},{},{}]}`),
"Link",
`<https://api.github.com/runs/3/jobs?page=2>; rel="next", <https://api.github.com/runs/3/jobs?page=2>; rel="last"`),
)
reg.Register(
httpmock.REST("GET", "runs/3/jobs"),
httpmock.StringResponse(`{"jobs":[{},{}]}`))
},
wantOut: "fetched 5 jobs\n",
},
}
for _, tt := range tests {