Skip to content

Instantly share code, notes, and snippets.

@m87h
Created February 15, 2017 22:04
Show Gist options
  • Save m87h/49ebb23b51f5a155f303847b15e465bc to your computer and use it in GitHub Desktop.
Save m87h/49ebb23b51f5a155f303847b15e465bc to your computer and use it in GitHub Desktop.
CodeBuild Lambda hook for CodeCommit
'use strict';
const AWS = require('aws-sdk');
const codeBuild = new AWS.CodeBuild();
const codeCommit = new AWS.CodeCommit();
function listProjects() {
return new Promise((resolve, reject) => {
let projects = [];
codeBuild.listProjects().eachPage((err, data, done) => {
if (err) {
reject(err);
return done(false);
}
if (!data) {
resolve(projects);
return done(false);
}
codeBuild.batchGetProjects({ names: data.projects }, (err, data) => {
if (err) {
reject(err);
return done(false);
}
projects = projects.concat(data.projects);
done();
});
});
});
}
function getRepository(arn) {
return new Promise((resolve, reject) => {
const name = arn.split(':')[5];
codeCommit.getRepository({ repositoryName: name }, (err, data) => {
if (err) {
return reject(err);
}
resolve(data.repositoryMetadata);
});
});
}
function startBuild(project, commit) {
return new Promise((resolve, reject) => {
codeBuild.startBuild({ projectName: project.name, sourceVersion: commit }, (err, data) => {
if (err) {
return reject(err);
}
resolve(data.build);
});
});
}
exports.handler = (event, context, done) => {
const repos = Promise.all(event.Records.map(r => getRepository(r.eventSourceARN)));
const commits = event.Records.map(r => r.codecommit.references.map(r => r.commit));
repos
.then((repos) => {
return listProjects().then((projects) => {
const builds = [];
repos.forEach((r, i) => {
const p = projects.find(p => p.source.type === 'CODECOMMIT' && p.source.location === r.cloneUrlHttp);
if (p) {
commits[i].forEach((c) => {
builds.push(startBuild(p, c));
});
}
});
return Promise.all(builds);
});
})
.then((builds) => done(null, builds.map(b => b.id)))
.catch(done);
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment