briareus
Version:
Briareus assists with Feature Branch deploys to ECS
86 lines (73 loc) • 2.64 kB
JavaScript
const AWS = require('aws-sdk');
const _ = require('lodash');
const escapeStringRegexp = require('escape-string-regexp');
const traverse = require('traverse');
let action = module.exports = function (pipeline, payload, cb) {
const ecs = new AWS.ECS();
let taskDefinition = _.cloneDeep(payload.taskDefinition);
taskDefinition.family = payload.name;
taskDefinition.executionRoleArn = payload.taskExecutionRoleArn;
_.each(taskDefinition.containerDefinitions, (container) => {
// Set secrets
container.secrets = _
.chain(payload.assets.ssmParameters)
.filter({ container: container.name })
.map((secret) => {
return {
name: secret.name,
valueFrom: secret.arn
}
})
.value()
// Set environment variables
let envs = _
.chain(payload.envs)
.filter({ container: container.name })
.map((env) => _.pick(env, ['name', 'value']))
.value()
if (!container.environment) container.environment = [];
container.environment = container.environment.concat(envs);
// Set logging configuration
container.logConfiguration = {
logDriver: 'awslogs',
options: {
'awslogs-region': AWS.config.region,
'awslogs-group': payload.variantsLogGroup,
'awslogs-stream-prefix': payload.slug
}
}
});
// Do variable replacement in Task Definition values
const vars = {
'build_image': payload.image,
'region': AWS.config.region,
'slug': payload.slug,
'aws_account_id': payload.awsAccountId,
'endpoint.host': payload.endpoint.host,
'endpoint.url': payload.endpoint.url,
'git_repo': payload.gitRepo,
'git_branch': payload.gitBranch,
'git_commit': payload.gitCommit,
'build_url': payload.buildUrl,
'pull_request_id': payload.pullRequestId
}
traverse(taskDefinition).forEach(function (node) {
if (this.notLeaf || !_.isString(node)) return;
_.each(vars, (value, name) => {
node = node.replace(new RegExp('\\${' + escapeStringRegexp(name) + '}'), value);
});
this.update(node);
});
ecs.registerTaskDefinition(taskDefinition, (err, data) => {
if (err) return cb(err);
cb(null, [
{ op: 'add', path: '/assets/buildTaskDefinition', value: { arn: data.taskDefinition.taskDefinitionArn } },
{ op: 'add', path: '/assets/taskDefinitions/-', value: { arn: data.taskDefinition.taskDefinitionArn } }
]);
});
}
action.waiting = 'Creating build task definition';
action.done = function (payload) {
return `Build task definition "${payload.assets.buildTaskDefinition.arn}" has been created`
}