Skip to content
This repository has been archived by the owner on Mar 1, 2022. It is now read-only.

Buildkite support #6

Merged
merged 5 commits into from
Oct 23, 2017
Merged
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
18 changes: 18 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,24 @@ car.updateProjectEnv("cypress-io/cypress-download", "circle", {
car.runProject("cypress-io/cypress-download", "circle")
```

## API

This module supports

* Travis
- [x] setting environment variables
- [x] fetch last build by id
- [x] restart build by id
* CircleCI
- [x] setting environment variables
- [x] starting a build
* AppVeyor
- [x] setting environment variables
- [ ] starting a build
* Buildkite
- [x] setting environment variables
- [ ] starting a build

## Testing

- `npm test` runs the unit tests once
Expand Down
3 changes: 3 additions & 0 deletions __snapshots__/buildkite_api_spec.coffee.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
exports['Buildkite API wrapper pipeline url forms pipeline url 1'] = `
/organizations/org/pipelines/project
`
5 changes: 4 additions & 1 deletion lib/bumpercar.coffee
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
Promise = require("bluebird")
inspect = require("util").inspect

{ travisProvider, circleProvider, appVeyorProvider } = require("./providers")
{ travisProvider, circleProvider, appVeyorProvider, buildkiteProvider } = require("./providers")

module.exports = {
create: (config = {}) ->
Expand All @@ -18,6 +18,9 @@ module.exports = {
if configProviders.appVeyor?
providers.appVeyor = appVeyorProvider.configure(configProviders.appVeyor)

if configProviders.buildkite?
providers.appVeyor = buildkiteProvider.configure(configProviders.buildkite)

findProviderOrDie = (providerName) ->
providers[providerName] or throw new Error("Provider wasn't configured: '#{providerName}'")

Expand Down
68 changes: 68 additions & 0 deletions lib/providers/buildkite-api.coffee
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
axios = require("axios")
R = require("ramda")
la = require("lazy-ass")
check = require("check-more-types")
debug = require("debug")("bumper")

toData = R.prop("data")
env = R.prop("env")

buildkiteApiUrl = "https://api.buildkite.com/v2"

getPipelineUrl = (organization, project) ->
la(check.unemptyString(organization), "missing organization", organization)
la(check.unemptyString(project), "missing project", project)
"/organizations/#{organization}/pipelines/#{project}"

module.exports = {
url: buildkiteApiUrl

create: (token) ->
throw new Error("Buildkite requires an access token!") if !token

api = axios.create({
baseURL: buildkiteApiUrl
headers: {
'Content-Type': 'application/json',
'Authorization': "Bearer #{token}"
}
})

# returns merged variable object from pipeline
setEnvironmentVariables = (organization, project, variables = {}) ->
url = getPipelineUrl(organization, project)
api.patch(url, {
env: variables
})
.then toData
.then env

## public API
api.getPipelineUrl = getPipelineUrl

api.getPipeline = (organization, project) ->
url = getPipelineUrl(organization, project)
debug("getting pipeline", url)
api.get(url)
.then toData

api.setPipeline = (organization, project, pipeline) ->
la(check.object(pipeline), "missing pipeline to set", pipeline)
debug("setting pipeline for", organization, project)
url = getPipelineUrl(organization, project)
api.post(url, pipeline)
.then toData

api.updateEnvironmentVariables = (organization, project, variables) ->
api.getPipeline(organization, project)
.then env
.then (oldVariables) ->
merged = R.merge(oldVariables, variables)
setEnvironmentVariables(organization, project, merged)

api.triggerNewBuild = (organization, project) ->
throw new Error "Not implemented for Buildkite yet"
# https://buildkite.com/docs/rest-api/builds#create-a-build

return api
}
30 changes: 30 additions & 0 deletions lib/providers/buildkite.coffee
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
_ = require("lodash")
Promise = require("bluebird")
providerApi = require("./buildkite-api")
debug = require("debug")("bumper")

api =
configure: (options={}) ->
api = providerApi.create(options.buildkiteToken)

return {
updateProjectEnv: (organization, project, variables) ->
debug("updating Buildkite variables for", organization, project)
debug(variables)
api.updateEnvironmentVariables(organization, project, variables)

runProject: (organization, project) ->
api.triggerNewBuild(organization, project)
}

module.exports = api

if !module.parent
console.log("Buildkite demo")
if !process.env.support__ci_json
throw new Error("Missing support__ci_json in environment")
tokens = JSON.parse(process.env.support__ci_json)
ci = api.configure(tokens)
ci.updateProjectEnv("cypress-io", "bumpercar-test", {
foo: "foo"
}).catch(console.error)
1 change: 1 addition & 0 deletions lib/providers/index.coffee
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,5 @@ module.exports = {
travisProvider: require("./travis")
circleProvider: require("./circle")
appVeyorProvider: require("./app-veyor")
buildkiteProvider: require("./buildkite")
}
3 changes: 3 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,9 @@
"@cypress/coffee-script": "0.1.2",
"axios": "^0.15.3",
"bluebird": "^3.5.0",
"check-more-types": "^2.24.0",
"debug": "^3.1.0",
"lazy-ass": "^1.6.0",
"lodash": "^4.17.4",
"ramda": "^0.24.1"
},
Expand All @@ -38,6 +40,7 @@
"condition-circle": "^1.5.0",
"github-post-release": "^1.13.1",
"mocha": "^3.2.0",
"nock": "^9.0.24",
"semantic-release": "^8.0.3",
"sinon": "^1.17.7",
"sinon-as-promised": "^4.0.2",
Expand Down
55 changes: 55 additions & 0 deletions test/buildkite_api_spec.coffee
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
require("./spec_helper")

buildkiteApi = require("../lib/providers/buildkite-api")
snapshot = require("snap-shot-it")
la = require("lazy-ass")
check = require("check-more-types")
R = require("ramda")
nock = require('nock')

describe "Buildkite API wrapper", ->
it "has API base url", ->
la(check.url(buildkiteApi.url))

context "pipeline url", ->
api = buildkiteApi.create('fake-test-token')

it "forms pipeline url", ->
url = api.getPipelineUrl('org', 'project')
snapshot(url)

context "update environment variables", ->
api = buildkiteApi.create('fake-test-token')
organization = "foo"
project = "p1"
oldVariables = {
key: "value",
life: 20
}
pipeline = {
env: oldVariables
}

beforeEach () ->
pipelineUrl = api.getPipelineUrl(organization, project)

nock(buildkiteApi.url)
.get(pipelineUrl)
.reply(200, pipeline)

nock(buildkiteApi.url)
.patch(pipelineUrl)
.reply(200, (uri, requestBody, cb) ->
pipeline.env = R.merge(pipeline.env, requestBody.env)
cb(null, [200, pipeline])
)

it "is a function", ->
la(check.fn(api.updateEnvironmentVariables))

it "updates pipeline variables", ->
newVariables = { life: 42 }
api.updateEnvironmentVariables(organization, project, newVariables)
.then (allVariables) ->
expected = R.merge(oldVariables, newVariables)
la(R.equals(allVariables, expected), allVariables, "expected", expected)