Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 0 additions & 9 deletions cmd/job/graphql/retry.graphql

This file was deleted.

14 changes: 14 additions & 0 deletions cmd/job/rest.go
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,20 @@ func reprioritizeJob(ctx context.Context, client *buildkite.Client, organization
return job, nil
}

func retryJob(ctx context.Context, client *buildkite.Client, organization, jobID string) (buildkite.Job, error) {
req, err := client.NewRequest(ctx, "PUT", organizationJobPath(organization, jobID, "retry"), nil)
if err != nil {
return buildkite.Job{}, err
}

var job buildkite.Job
if _, err := client.Do(req, &job); err != nil {
return buildkite.Job{}, err
}

return job, nil
}

func unblockJob(ctx context.Context, client *buildkite.Client, organization, jobID string, fields map[string]any) (buildkite.Job, error) {
req, err := client.NewRequest(ctx, "PUT", organizationJobPath(organization, jobID, "unblock"), &unblockJobOptions{
Fields: fields,
Expand Down
31 changes: 15 additions & 16 deletions cmd/job/retry.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,12 @@ import (

"github.com/alecthomas/kong"
"github.com/buildkite/cli/v3/internal/cli"
bkGraphQL "github.com/buildkite/cli/v3/internal/graphql"
bkIO "github.com/buildkite/cli/v3/internal/io"
"github.com/buildkite/cli/v3/internal/util"
"github.com/buildkite/cli/v3/pkg/cmd/factory"
"github.com/buildkite/cli/v3/pkg/cmd/validation"
buildkite "github.com/buildkite/go-buildkite/v4"
)

const jobCommandPrefix = "JobTypeCommand---"

type RetryCmd struct {
JobID string `arg:"" help:"Job UUID to retry"`
}
Expand All @@ -38,28 +35,30 @@ func (c *RetryCmd) Run(kongCtx *kong.Context, globals cli.GlobalFlags) error {
f.NoInput = globals.DisableInput()
f.Quiet = globals.IsQuiet()

organization, err := configuredOrganization(f.Config.OrganizationSlug())
if err != nil {
return err
}
if err := validation.ValidateConfiguration(f.Config, kongCtx.Command()); err != nil {
return err
}

// Given a job UUID argument, we need to generate the GraphQL ID matching
graphqlID := util.GenerateGraphQLID(jobCommandPrefix, c.JobID)

ctx := context.Background()
var j *bkGraphQL.RetryJobResponse

var job buildkite.Job
if err = bkIO.SpinWhile(f, "Retrying job", func() error {
j, err = bkGraphQL.RetryJob(ctx, f.GraphQLClient, graphqlID)
return err
var apiErr error
job, apiErr = retryJob(
ctx,
f.RestAPIClient,
organization,
c.JobID,
)
return apiErr
}); err != nil {
return err
}

// Fixes segfault when error is returned, e.g. "Jobs from canceled builds cannot be retried"
if j == nil || j.JobTypeCommandRetry == nil {
return fmt.Errorf("failed to retry job")
}

fmt.Println("Successfully retried job: " + j.JobTypeCommandRetry.JobTypeCommand.Url)
fmt.Println("Successfully retried job: " + job.WebURL)
return nil
}
52 changes: 52 additions & 0 deletions cmd/job/retry_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
package job

import (
"context"
"io"
"net/http"
"net/http/httptest"
"testing"

buildkite "github.com/buildkite/go-buildkite/v4"
)

func TestRetryJobUsesOrganizationEndpoint(t *testing.T) {
t.Parallel()

server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if r.Method != http.MethodPut {
t.Fatalf("method = %s, want PUT", r.Method)
}
if r.URL.Path != "/v2/organizations/buildkite/jobs/job-1/retry" {
t.Fatalf("path = %s", r.URL.Path)
}

body, err := io.ReadAll(r.Body)
if err != nil {
t.Fatalf("read body: %v", err)
}
if len(body) != 0 {
t.Fatalf("body = %q, want empty", body)
}

w.Header().Set("Content-Type", "application/json")
_, _ = w.Write([]byte(`{"id":"job-2","state":"scheduled","retried_in_job_id":"job-2","web_url":"https://buildkite.com/buildkite/cli/builds/42#job-2"}`))
}))
defer server.Close()

client, err := buildkite.NewOpts(
buildkite.WithBaseURL(server.URL),
buildkite.WithTokenAuth("test-token"),
)
if err != nil {
t.Fatalf("new client: %v", err)
}

job, err := retryJob(context.Background(), client, "buildkite", "job-1")
if err != nil {
t.Fatalf("retryJob() error = %v", err)
}
if job.ID != "job-2" {
t.Fatalf("job = %#v", job)
}
}
97 changes: 0 additions & 97 deletions internal/graphql/generated.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.