1
0
mirror of https://github.com/taigrr/wtf synced 2025-01-18 04:03:14 -08:00
wtf/modules/buildkite/client.go
Chris Cummer 1bfca29d17
WTF-657 Add spec coverage for cfg/common_settings.go (#728)
* WTF-657 Add spec coverage for cfg/common_settings.go

Signed-off-by: Chris Cummer <chriscummer@me.com>

* WTF-657 Add spec coverage for cfg/position_validation.go

Signed-off-by: Chris Cummer <chriscummer@me.com>

* WTF-657 Add spec coverage for cfg/validations.go

Signed-off-by: Chris Cummer <chriscummer@me.com>

* WTF-657 Add spec coverage for checklist/checklist.go

Signed-off-by: Chris Cummer <chriscummer@me.com>

* WTF-657 Add spec coverage for checklist/checklist_item.go

Signed-off-by: Chris Cummer <chriscummer@me.com>

* WTF-657 Add spec coverage for utils/conversions.go

Signed-off-by: Chris Cummer <chriscummer@me.com>

* WTF-657 Get rid of utils.Home() function

Signed-off-by: Chris Cummer <chriscummer@me.com>

* WTF-657 Add spec coverage for utils/homedir.go

Signed-off-by: Chris Cummer <chriscummer@me.com>

* WTF-657 Add spec coverage for utils/text.go

Signed-off-by: Chris Cummer <chriscummer@me.com>

* WTF-657 Clean up utils/utils.go

Signed-off-by: Chris Cummer <chriscummer@me.com>
2019-10-30 17:35:00 -07:00

107 lines
2.2 KiB
Go

package buildkite
import (
"fmt"
"net/http"
"github.com/wtfutil/wtf/utils"
)
type Pipeline struct {
Slug string `json:"slug"`
}
type Build struct {
State string `json:"state"`
Pipeline Pipeline `json:"pipeline"`
Branch string `json:"branch"`
WebUrl string `json:"web_url"`
}
func (widget *Widget) getBuilds() ([]Build, error) {
builds := []Build{}
for _, pipeline := range widget.settings.pipelines {
buildsForPipeline, err := widget.recentBuilds(pipeline)
if err != nil {
return nil, err
}
mostRecent := mostRecentBuildForBranches(buildsForPipeline, pipeline.branches)
builds = append(builds, mostRecent...)
}
return builds, nil
}
func (widget *Widget) recentBuilds(pipeline PipelineSettings) ([]Build, error) {
url := fmt.Sprintf(
"https://api.buildkite.com/v2/organizations/%s/pipelines/%s/builds%s",
widget.settings.orgSlug,
pipeline.slug,
branchesQuery(pipeline.branches),
)
req, err := http.NewRequest("GET", url, nil)
if err != nil {
return nil, err
}
req.Header.Add("Authorization", fmt.Sprintf("Bearer %s", widget.settings.apiKey))
httpClient := &http.Client{Transport: &http.Transport{
Proxy: http.ProxyFromEnvironment,
}}
resp, err := httpClient.Do(req)
if err != nil {
return nil, err
}
if resp.StatusCode < 200 || resp.StatusCode > 299 {
return nil, fmt.Errorf(resp.Status)
}
builds := []Build{}
err = utils.ParseJSON(&builds, resp.Body)
if err != nil {
return nil, err
}
return builds, nil
}
func branchesQuery(branches []string) string {
if len(branches) == 0 {
return ""
}
if len(branches) == 1 {
return fmt.Sprintf("?branch=%s", branches[0])
}
queryString := fmt.Sprintf("?branch[]=%s", branches[0])
for _, branch := range branches[1:] {
queryString += fmt.Sprintf("&branch[]=%s", branch)
}
return queryString
}
func mostRecentBuildForBranches(builds []Build, branches []string) []Build {
recentBuilds := []Build{}
haveMostRecentBuildForBranch := map[string]bool{}
for _, branch := range branches {
haveMostRecentBuildForBranch[branch] = false
}
for _, build := range builds {
if !haveMostRecentBuildForBranch[build.Branch] {
haveMostRecentBuildForBranch[build.Branch] = true
recentBuilds = append(recentBuilds, build)
}
}
return recentBuilds
}