briareus
Version:
Briareus assists with Feature Branch deploys to ECS
74 lines (58 loc) • 1.97 kB
JavaScript
const _ = require('lodash');
const Monitor = require('ecs-deployment-monitor');
const renderStates = require('../../../node_modules/ecs-deployment-monitor/lib/renderer/states');
const errors = require('../errors');
let action = module.exports = function (pipeline, payload, cb) {
let deployment = payload.activeDeployment;
let lastEvent;
let monitor = Monitor({
serviceName: payload.name,
clusterArn: payload.ecsClusterArn,
taskDefinitionArn: deployment.taskDefinition.arn,
});
function getStateInfo(state) {
let stateInfo = renderStates[state](monitor);
stateInfo.id = state;
let event = {
action: stateInfo,
monitor: {
isSteady: monitor.isSteady(),
isFailure: monitor.isFailure(),
}
};
return event;
}
function emitComplete(event, cb) {
if (!cb) cb = _.noop;
event.endAt = Date.now();
event.duration = Math.ceil((event.endAt - event.startAt) / 1000);
pipeline.emit('action:complete', event);
pipeline.save(cb);
}
monitor.on('error', (error) => pipeline.emit('monitor:error', { deployment, error }));
monitor.on('state', (state) => {
// Process on next tick so that action:complete's are processed
// before action:start
process.nextTick(() => {
let event = lastEvent = getStateInfo(state);
event.startAt = Date.now();
pipeline.emit('action:start', event);
if (state === 'Steady') emitComplete(event);
else monitor.once('state', (state) => emitComplete(event));
pipeline.save(_.noop);
});
});
monitor.on('end', () => {
// Process on next tick so that steady's action:complete is processed
// before we call the callback
process.nextTick(() => {
if (monitor.isFailure()) {
return cb(new errors.DeploymentFailure('payload failed'));
}
cb(null, [])
});
});
}
action.waiting = 'Monitoring deploy';
action.done = 'Monitoring complete';