Skip to content

Commit 5e6e1dd

Browse files
authored
Merge pull request #84 from buildkite/json-tags
Added JSON struct tags for CreatePipelineArgs, UpdatePipelineArgs and CreateBuildArgs
2 parents 410ed3d + 593670b commit 5e6e1dd

4 files changed

Lines changed: 61 additions & 60 deletions

File tree

internal/buildkite/builds.go

Lines changed: 11 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -286,19 +286,19 @@ type Entry struct {
286286
}
287287

288288
type CreateBuildArgs struct {
289-
Org string
290-
PipelineSlug string
291-
Commit string
292-
Branch string
293-
Message string
294-
Environment []Entry
295-
MetaData []Entry
289+
OrgSlug string `json:"org_slug"`
290+
PipelineSlug string `json:"pipeline_slug"`
291+
Commit string `json:"commit"`
292+
Branch string `json:"branch"`
293+
Message string `json:"message"`
294+
Environment []Entry `json:"environment"`
295+
MetaData []Entry `json:"metadata"`
296296
}
297297

298298
func CreateBuild(ctx context.Context, client BuildsClient) (tool mcp.Tool, handler mcp.TypedToolHandlerFunc[CreateBuildArgs]) {
299299
return mcp.NewTool("create_build",
300300
mcp.WithDescription("Trigger a new build on a Buildkite pipeline for a specific commit and branch, with optional environment variables, metadata, and author information"),
301-
mcp.WithString("org",
301+
mcp.WithString("org_slug",
302302
mcp.Required(),
303303
mcp.Description("The organization slug for the owner of the pipeline"),
304304
),
@@ -363,16 +363,6 @@ func CreateBuild(ctx context.Context, client BuildsClient) (tool mcp.Tool, handl
363363
ctx, span := trace.Start(ctx, "buildkite.CreateBuild")
364364
defer span.End()
365365

366-
org, err := request.RequireString("org")
367-
if err != nil {
368-
return mcp.NewToolResultError(err.Error()), nil
369-
}
370-
371-
pipelineSlug, err := request.RequireString("pipeline_slug")
372-
if err != nil {
373-
return mcp.NewToolResultError(err.Error()), nil
374-
}
375-
376366
createBuild := buildkite.CreateBuild{
377367
Commit: args.Commit,
378368
Branch: args.Branch,
@@ -382,11 +372,11 @@ func CreateBuild(ctx context.Context, client BuildsClient) (tool mcp.Tool, handl
382372
}
383373

384374
span.SetAttributes(
385-
attribute.String("org", org),
386-
attribute.String("pipeline_slug", pipelineSlug),
375+
attribute.String("org", args.OrgSlug),
376+
attribute.String("pipeline_slug", args.PipelineSlug),
387377
)
388378

389-
build, _, err := client.Create(ctx, org, pipelineSlug, createBuild)
379+
build, _, err := client.Create(ctx, args.OrgSlug, args.PipelineSlug, createBuild)
390380
if err != nil {
391381
var errResp *buildkite.ErrorResponse
392382
if errors.As(err, &errResp) {

internal/buildkite/builds_test.go

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -393,6 +393,13 @@ func TestCreateBuild(t *testing.T) {
393393
ctx := context.Background()
394394
client := &MockBuildsClient{
395395
CreateFunc: func(ctx context.Context, org string, pipeline string, b buildkite.CreateBuild) (buildkite.Build, *buildkite.Response, error) {
396+
397+
// Validate required fields
398+
assert.Equal(org, "org")
399+
assert.Equal(pipeline, "pipeline")
400+
assert.Equal(b.Commit, "abc123")
401+
assert.Equal(b.Message, "Test build")
402+
396403
// Return created build
397404
return buildkite.Build{
398405
ID: "123",
@@ -417,15 +424,14 @@ func TestCreateBuild(t *testing.T) {
417424
assert.NotNil(tool)
418425
assert.NotNil(handler)
419426

420-
request := createMCPRequest(t, map[string]any{
421-
"org": "org",
422-
"pipeline_slug": "pipeline",
423-
})
427+
request := createMCPRequest(t, map[string]any{})
424428

425429
args := CreateBuildArgs{
426-
Commit: "abc123",
427-
Message: "Test build",
428-
Branch: "main",
430+
OrgSlug: "org",
431+
PipelineSlug: "pipeline",
432+
Commit: "abc123",
433+
Message: "Test build",
434+
Branch: "main",
429435
Environment: []Entry{
430436
{Key: "ENV_VAR", Value: "value"},
431437
},

internal/buildkite/pipelines.go

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -140,16 +140,16 @@ func GetPipeline(ctx context.Context, client PipelinesClient) (tool mcp.Tool, ha
140140
}
141141

142142
type CreatePipelineArgs struct {
143-
OrgSlug string
144-
Name string
145-
RepositoryURL string
146-
ClusterID string
147-
Description string
148-
Configuration string
149-
DefaultBranch string
150-
SkipQueuedBranchBuilds bool
151-
CancelRunningBranchBuilds bool
152-
Tags []string
143+
OrgSlug string `json:"org_slug"`
144+
Name string `json:"name"`
145+
RepositoryURL string `json:"repository_url"`
146+
ClusterID string `json:"cluster_id"`
147+
Description string `json:"description"`
148+
Configuration string `json:"configuration"`
149+
DefaultBranch string `json:"default_branch"`
150+
SkipQueuedBranchBuilds bool `json:"skip_queued_branch_builds"`
151+
CancelRunningBranchBuilds bool `json:"cancel_running_branch_builds"`
152+
Tags []string `json:"tags"`
153153
}
154154

155155
func CreatePipeline(ctx context.Context, client PipelinesClient) (tool mcp.Tool, handler mcp.TypedToolHandlerFunc[CreatePipelineArgs]) {
@@ -266,16 +266,16 @@ func CreatePipeline(ctx context.Context, client PipelinesClient) (tool mcp.Tool,
266266
}
267267

268268
type UpdatePipelineArgs struct {
269-
OrgSlug string
270-
PipelineSlug string
271-
Name string
272-
RepositoryURL string
273-
ClusterID string
274-
Description string
275-
Configuration string
276-
DefaultBranch string
277-
SkipQueuedBranchBuilds bool
278-
CancelRunningBranchBuilds bool
269+
OrgSlug string `json:"org_slug"`
270+
PipelineSlug string `json:"pipeline_slug"`
271+
Name string `json:"name"`
272+
RepositoryURL string `json:"repository_url"`
273+
ClusterID string `json:"cluster_id"`
274+
Description string `json:"description"`
275+
Configuration string `json:"configuration"`
276+
DefaultBranch string `json:"default_branch"`
277+
SkipQueuedBranchBuilds bool `json:"skip_queued_branch_builds"`
278+
CancelRunningBranchBuilds bool `json:"cancel_running_branch_builds"`
279279
Tags []string `json:"tags"` // Optional, labels to apply to the pipeline
280280
}
281281

internal/buildkite/pipelines_test.go

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -135,13 +135,19 @@ steps:
135135
client := &MockPipelinesClient{
136136
CreateFunc: func(ctx context.Context, org string, p buildkite.CreatePipeline) (buildkite.Pipeline, *buildkite.Response, error) {
137137

138+
// validate required fields
139+
assert.Equal("org", org)
140+
assert.Equal("cluster-123", p.ClusterID)
141+
assert.Equal("Test Pipeline", p.Name)
142+
assert.Equal("https://example.com/repo.git", p.Repository)
143+
138144
assert.Equal(testPipelineDefinition, p.Configuration)
139145

140146
return buildkite.Pipeline{
141147
ID: "123",
142148
Slug: "test-pipeline",
143149
Name: "Test Pipeline",
144-
ClusterID: "abc-123",
150+
ClusterID: "cluster-123",
145151
CreatedAt: &buildkite.Timestamp{},
146152
Tags: []string{"tag1", "tag2"},
147153
}, &buildkite.Response{
@@ -156,16 +162,12 @@ steps:
156162
assert.NotNil(tool)
157163
assert.NotNil(handler)
158164

159-
request := createMCPRequest(t, map[string]any{
160-
"org": "org",
161-
"name": "Test Pipeline",
162-
"repository_url": "https://example.com/repo.git",
163-
})
165+
request := createMCPRequest(t, map[string]any{})
164166

165167
args := CreatePipelineArgs{
166168
OrgSlug: "org",
167169
Name: "Test Pipeline",
168-
ClusterID: "abc-123",
170+
ClusterID: "cluster-123",
169171
RepositoryURL: "https://example.com/repo.git",
170172
Description: "A test pipeline",
171173
Configuration: testPipelineDefinition,
@@ -175,7 +177,7 @@ steps:
175177
result, err := handler(ctx, request, args)
176178
assert.NoError(err)
177179
textContent := getTextResult(t, result)
178-
assert.Equal(`{"id":"123","name":"Test Pipeline","slug":"test-pipeline","created_at":"0001-01-01T00:00:00Z","skip_queued_branch_builds":false,"cancel_running_branch_builds":false,"cluster_id":"abc-123","tags":["tag1","tag2"],"provider":{"id":"","webhook_url":"","settings":null}}`, textContent.Text)
180+
assert.Equal(`{"id":"123","name":"Test Pipeline","slug":"test-pipeline","created_at":"0001-01-01T00:00:00Z","skip_queued_branch_builds":false,"cancel_running_branch_builds":false,"cluster_id":"cluster-123","tags":["tag1","tag2"],"provider":{"id":"","webhook_url":"","settings":null}}`, textContent.Text)
179181
}
180182

181183
func TestUpdatePipeline(t *testing.T) {
@@ -194,6 +196,10 @@ steps:
194196
client := &MockPipelinesClient{
195197
UpdateFunc: func(ctx context.Context, org string, pipeline string, p buildkite.UpdatePipeline) (buildkite.Pipeline, *buildkite.Response, error) {
196198

199+
// validate required fields
200+
assert.Equal("org", org)
201+
assert.Equal("test-pipeline", pipeline)
202+
197203
assert.Equal(testPipelineDefinition, p.Configuration)
198204

199205
return buildkite.Pipeline{
@@ -214,10 +220,9 @@ steps:
214220
tool, handler := UpdatePipeline(ctx, client)
215221
assert.NotNil(tool)
216222
assert.NotNil(handler)
217-
request := createMCPRequest(t, map[string]any{
218-
"org": "org",
219-
"pipeline_slug": "test-pipeline",
220-
})
223+
224+
request := createMCPRequest(t, map[string]any{})
225+
221226
args := UpdatePipelineArgs{
222227
OrgSlug: "org",
223228
PipelineSlug: "test-pipeline",

0 commit comments

Comments
 (0)