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

Commit

Permalink
feat: buildkite support (#6)
Browse files Browse the repository at this point in the history
close #5 

* feat: add buildkite support for env vars for #5

* include buildkite in provider index

* add simple url test

* test update environment variables on buildkite

* describe supported methods in readme
  • Loading branch information
bahmutov committed Oct 23, 2017
1 parent 69b5d1a commit eec2c0a
Show file tree
Hide file tree
Showing 8 changed files with 182 additions and 1 deletion.
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)

0 comments on commit eec2c0a

Please sign in to comment.