From 84492c7fbc60d4577a16b8cb065ec2fa1aa3e1c2 Mon Sep 17 00:00:00 2001 From: Radoslav Kirilov Date: Mon, 17 Oct 2022 16:40:25 +0300 Subject: [PATCH] Instanced Pipelines support Alert types `fixed` and `broke` (#96) --- concourse/build.go | 19 ++++++++++--------- concourse/client.go | 5 +++-- concourse/client_test.go | 28 ++++++++++++++++++++++++++-- out/main.go | 8 +++++++- 4 files changed, 46 insertions(+), 14 deletions(-) diff --git a/concourse/build.go b/concourse/build.go index 58dc7b2..7687a20 100644 --- a/concourse/build.go +++ b/concourse/build.go @@ -10,15 +10,16 @@ import ( // A Build is a build's data from the undocumented Concourse API. type Build struct { - ID int `json:"id"` - Team string `json:"team_name"` - Name string `json:"name"` - Status string `json:"status"` - Job string `json:"job_name"` - APIURL string `json:"api_url"` - Pipeline string `json:"pipeline_name"` - StartTime int `json:"start_time"` - EndTime int `json:"end_time"` + ID int `json:"id"` + Team string `json:"team_name"` + Name string `json:"name"` + Status string `json:"status"` + Job string `json:"job_name"` + APIURL string `json:"api_url"` + Pipeline string `json:"pipeline_name"` + InstanceVars map[string]string `json:"pipeline_instance_vars,omitempty"` + StartTime int `json:"start_time"` + EndTime int `json:"end_time"` } // BuildMetadata is the current build's metadata exposed via the environment. diff --git a/concourse/client.go b/concourse/client.go index c77f8bc..8237141 100644 --- a/concourse/client.go +++ b/concourse/client.go @@ -226,14 +226,15 @@ func (c *Client) loginLegacy(url, username, password string) error { // JobBuild finds and returns a Build from the Concourse API by its // pipeline name, job name and build name. -func (c *Client) JobBuild(pipeline, job, name string) (*Build, error) { +func (c *Client) JobBuild(pipeline, job, name, instanceVars string) (*Build, error) { u := fmt.Sprintf( - "%s/api/v1/teams/%s/pipelines/%s/jobs/%s/builds/%s", + "%s/api/v1/teams/%s/pipelines/%s/jobs/%s/builds/%s%s", c.atcurl, c.team, pipeline, job, name, + instanceVars, ) r, err := c.conn.Get(u) diff --git a/concourse/client_test.go b/concourse/client_test.go index 2c7675a..db03435 100644 --- a/concourse/client_test.go +++ b/concourse/client_test.go @@ -2,6 +2,7 @@ package concourse import ( "encoding/json" + "fmt" "net/http" "net/http/httptest" "net/url" @@ -147,7 +148,7 @@ func TestJobBuild(t *testing.T) { build *Build err bool }{ - "ok": {build: &Build{ + "okWithoutInstanceVars": {build: &Build{ ID: 1, Team: "main", Name: "1", @@ -156,6 +157,19 @@ func TestJobBuild(t *testing.T) { APIURL: "/api/v1/builds/1", Pipeline: "demo", }}, + "okWithInstanceVars": {build: &Build{ + ID: 1, + Team: "main", + Name: "1", + Status: "succeeded", + Job: "test", + APIURL: "/api/v1/builds/1", + Pipeline: "demo", + InstanceVars: map[string]string{ + "image_name": "my-image", + "pr_number": "1234", + }, + }}, "unauthorized": { build: &Build{}, err: true, @@ -174,7 +188,17 @@ func TestJobBuild(t *testing.T) { t.Run(name, func(t *testing.T) { client := &Client{atcurl: u, team: c.build.Team, conn: &http.Client{}} - build, err := client.JobBuild(c.build.Pipeline, c.build.Job, c.build.Name) + instanceVars := "" + if c.build.InstanceVars != nil { + query := &url.Values{} + for key, value := range c.build.InstanceVars { + key = fmt.Sprintf("vars.%s", key) + value = fmt.Sprintf(`"%s"`, value) + query.Set(key, value) + } + instanceVars = fmt.Sprintf("?%s", query.Encode()) + } + build, err := client.JobBuild(c.build.Pipeline, c.build.Job, c.build.Name, instanceVars) if err != nil && !c.err { t.Fatalf("unexpected error from JobBuild:\n\t(ERR): %s", err) diff --git a/out/main.go b/out/main.go index 0fba9fa..7733b09 100644 --- a/out/main.go +++ b/out/main.go @@ -96,7 +96,13 @@ func previousBuildStatus(input *concourse.OutRequest, m concourse.BuildMetadata) return "", fmt.Errorf("error parsing build name: %s", err) } - previous, err := c.JobBuild(m.PipelineName, m.JobName, p) + instanceVars := "" + instanceVarsIndex := strings.Index(m.URL, "?") + if instanceVarsIndex > -1 { + instanceVars = m.URL[instanceVarsIndex:] + } + + previous, err := c.JobBuild(m.PipelineName, m.JobName, p, instanceVars) if err != nil { return "", fmt.Errorf("error requesting Concourse build status: %s", err) }