diff --git a/lib/detect.js b/lib/detect.js index ec9b71dc..e40e0f1c 100644 --- a/lib/detect.js +++ b/lib/detect.js @@ -15,6 +15,7 @@ var services = { gitlab: require('./services/gitlab'), heroku: require('./services/heroku'), teamcity: require('./services/teamcity'), + codebuild: require('./services/codebuild'), } var detectProvider = function() { diff --git a/lib/services/codebuild.js b/lib/services/codebuild.js new file mode 100644 index 00000000..88726ae0 --- /dev/null +++ b/lib/services/codebuild.js @@ -0,0 +1,42 @@ +module.exports = { + detect: function() { + return !!process.env.CODEBUILD_CI + }, + + configuration: function() { + console.log(' AWS CodeBuild Detected') + return { + service: 'codebuild', + build: process.env.CODEBUILD_BUILD_ID, + job: process.env.CODEBUILD_BUILD_ID, + commit: process.env.CODEBUILD_RESOLVED_SOURCE_VERSION, + branch: detectBranchName(), + pr: detectPRNumber(), + slug: detectRepoSlug(), + } + function detectBranchName() { + if (process.env.CODEBUILD_WEBHOOK_HEAD_REF) { + return process.env.CODEBUILD_WEBHOOK_HEAD_REF.replace( + /^refs\/heads\//, + '' + ) + } + throw new Error('Cannot detect branch name.') + } + function detectPRNumber() { + if (process.env.CODEBUILD_SOURCE_VERSION) { + return process.env.CODEBUILD_SOURCE_VERSION.replace(/^pr\//, '') + } + throw new Error('Cannot detect PR number.') + } + function detectRepoSlug() { + if (process.env.CODEBUILD_SOURCE_REPO_URL) { + return process.env.CODEBUILD_SOURCE_REPO_URL.replace( + /^.*github.com\//, + '' + ).replace(/\.git$/, '') + } + throw new Error('Cannot detect repository slug.') + } + }, +} diff --git a/package-lock.json b/package-lock.json index 3cc3d68f..902e1312 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "codecov", - "version": "3.4.0", + "version": "3.5.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/test/services/codebuild.test.js b/test/services/codebuild.test.js new file mode 100644 index 00000000..28c354d9 --- /dev/null +++ b/test/services/codebuild.test.js @@ -0,0 +1,53 @@ +var codebuild = require('../../lib/services/codebuild') + +describe('AWS CodeBuild Provider', function() { + it('can detect codebuild', function() { + process.env.CODEBUILD_CI = 'true' + expect(codebuild.detect()).toBe(true) + }) + + it('can get codebuild env info', function() { + process.env.CODEBUILD_CI = 'true' + process.env.CODEBUILD_BUILD_ID = + 'my-project:e016b9d9-f2c8-4749-8373-7ca673b6d969' + process.env.CODEBUILD_RESOLVED_SOURCE_VERSION = + '39ec2418eca4c539d765574a1c68f3bd77e8c549' + process.env.CODEBUILD_WEBHOOK_HEAD_REF = 'refs/heads/master' + process.env.CODEBUILD_SOURCE_VERSION = 'pr/1' + process.env.CODEBUILD_SOURCE_REPO_URL = + 'https://github.com/my-org/my-project.git' + expect(codebuild.configuration()).toEqual({ + service: 'codebuild', + build: 'my-project:e016b9d9-f2c8-4749-8373-7ca673b6d969', + job: 'my-project:e016b9d9-f2c8-4749-8373-7ca673b6d969', + commit: '39ec2418eca4c539d765574a1c68f3bd77e8c549', + branch: 'master', + pr: '1', + slug: 'my-org/my-project', + }) + }) + + it('throws if branch name cannot be detected', function() { + delete process.env.CODEBUILD_WEBHOOK_HEAD_REF + expect(function() { + codebuild.configuration() + }).toThrow() + }) + + it('throws if pr number cannot be detected', function() { + process.env.CODEBUILD_WEBHOOK_HEAD_REF = 'refs/heads/master' + delete process.env.CODEBUILD_SOURCE_VERSION + expect(function() { + codebuild.configuration() + }).toThrow() + }) + + it('throws if slug cannot be detected', function() { + process.env.CODEBUILD_RESOLVED_SOURCE_VERSION = + '39ec2418eca4c539d765574a1c68f3bd77e8c549' + delete process.env.CODEBUILD_SOURCE_REPO_URL + expect(function() { + codebuild.configuration() + }).toThrow() + }) +})