opinionated-ci-pipeline
Version:
CI/CD on AWS with feature-branch builds, developer-environment deployments, and build status notifications.
64 lines • 11 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.CIStack = void 0;
const aws_cdk_lib_1 = require("aws-cdk-lib");
const aws_iam_1 = require("aws-cdk-lib/aws-iam");
const featureBranchBuilds_1 = require("./constructs/featureBranchBuilds");
const mainPipeline_1 = require("./constructs/mainPipeline");
const aws_chatbot_1 = require("aws-cdk-lib/aws-chatbot");
const notificationsTopic_1 = require("./constructs/notificationsTopic");
const context_1 = require("./util/context");
const aws_ssm_1 = require("aws-cdk-lib/aws-ssm");
const mirrorRepository_1 = require("./constructs/mirrorRepository");
const string_1 = require("./util/string");
class CIStack extends aws_cdk_lib_1.Stack {
constructor(scope, id, props) {
super(scope, id, props);
const repositoryTokenParam = aws_ssm_1.StringParameter.fromSecureStringParameterAttributes(this, 'RepositoryTokenParam', {
parameterName: `/${(0, context_1.getProjectName)(this)}/ci/repositoryAccessToken`,
});
const mirror = new mirrorRepository_1.MirrorRepository(this, 'MirrorRepository', {
repoTokenParam: repositoryTokenParam,
repository: props.repository,
});
const mainPipeline = new mainPipeline_1.MainPipeline(this, 'MainPipeline', {
...props,
sourceBucket: mirror.sourceBucket,
repositoryTokenParam,
});
const featureBranchBuilds = new featureBranchBuilds_1.FeatureBranchBuilds(this, 'FeatureBranchBuilds', {
...props,
sourceBucket: mirror.sourceBucket,
repositoryTokenParam,
});
if (props.slackNotifications) {
this.createSlackNotifications((0, context_1.getProjectName)(this), props.slackNotifications, mainPipeline.failuresTopic, featureBranchBuilds.failuresTopic);
}
}
createSlackNotifications(projectName, slackNotificationsConfig, mainPipelineFailuresTopic, featureBranchFailuresTopic) {
const { mainPipelineFailures, featureBranchFailures } = slackNotificationsConfig;
if (mainPipelineFailures) {
const alarmsTopic = new notificationsTopic_1.NotificationsTopic(this, 'SlackAlarmsTopic', {
projectName: projectName,
notificationName: 'slackAlarms',
});
this.createSlackChannelConfiguration('main', mainPipelineFailures, [alarmsTopic.topic, mainPipelineFailuresTopic]);
}
if (featureBranchFailures) {
this.createSlackChannelConfiguration('feature', featureBranchFailures, [featureBranchFailuresTopic]);
}
}
createSlackChannelConfiguration(name, config, topics) {
const lowercasedName = name.toLowerCase();
const slackChannelConfiguration = new aws_chatbot_1.SlackChannelConfiguration(this, `${(0, string_1.capitalizeFirstLetter)(lowercasedName)}SlackChannelConfiguration`, {
slackChannelConfigurationName: `${this.stackName}-${lowercasedName}`,
slackWorkspaceId: config.workspaceId,
slackChannelId: config.channelId,
notificationTopics: topics,
});
slackChannelConfiguration.role?.addManagedPolicy(aws_iam_1.ManagedPolicy.fromAwsManagedPolicyName('CloudWatchReadOnlyAccess'));
return slackChannelConfiguration;
}
}
exports.CIStack = CIStack;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2lTdGFjay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9jaVN0YWNrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZDQUE4QztBQUU5QyxpREFBa0Q7QUFDbEQsMEVBQXFFO0FBQ3JFLDREQUF1RDtBQUV2RCx5REFBa0U7QUFFbEUsd0VBQW1FO0FBQ25FLDRDQUE4QztBQUM5QyxpREFBb0Q7QUFDcEQsb0VBQStEO0FBQy9ELDBDQUFvRDtBQUtwRCxNQUFhLE9BQVEsU0FBUSxtQkFBSztJQUM5QixZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQW1CO1FBQ3pELEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRXhCLE1BQU0sb0JBQW9CLEdBQUcseUJBQWUsQ0FBQyxtQ0FBbUMsQ0FBQyxJQUFJLEVBQUUsc0JBQXNCLEVBQUU7WUFDM0csYUFBYSxFQUFFLElBQUksSUFBQSx3QkFBYyxFQUFDLElBQUksQ0FBQywyQkFBMkI7U0FDckUsQ0FBQyxDQUFDO1FBRUgsTUFBTSxNQUFNLEdBQUcsSUFBSSxtQ0FBZ0IsQ0FBQyxJQUFJLEVBQUUsa0JBQWtCLEVBQUU7WUFDMUQsY0FBYyxFQUFFLG9CQUFvQjtZQUNwQyxVQUFVLEVBQUUsS0FBSyxDQUFDLFVBQVU7U0FDL0IsQ0FBQyxDQUFDO1FBRUgsTUFBTSxZQUFZLEdBQUcsSUFBSSwyQkFBWSxDQUFDLElBQUksRUFBRSxjQUFjLEVBQUU7WUFDeEQsR0FBRyxLQUFLO1lBQ1IsWUFBWSxFQUFFLE1BQU0sQ0FBQyxZQUFZO1lBQ2pDLG9CQUFvQjtTQUN2QixDQUFDLENBQUM7UUFFSCxNQUFNLG1CQUFtQixHQUFHLElBQUkseUNBQW1CLENBQUMsSUFBSSxFQUFFLHFCQUFxQixFQUFFO1lBQzdFLEdBQUcsS0FBSztZQUNSLFlBQVksRUFBRSxNQUFNLENBQUMsWUFBWTtZQUNqQyxvQkFBb0I7U0FDdkIsQ0FBQyxDQUFDO1FBRUgsSUFBSSxLQUFLLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUMzQixJQUFJLENBQUMsd0JBQXdCLENBQUMsSUFBQSx3QkFBYyxFQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssQ0FBQyxrQkFBa0IsRUFBRSxZQUFZLENBQUMsYUFBYSxFQUFFLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ2pKLENBQUM7SUFDTCxDQUFDO0lBRU8sd0JBQXdCLENBQzVCLFdBQW1CLEVBQUUsd0JBQTRDLEVBQ2pFLHlCQUFnQyxFQUFFLDBCQUFpQztRQUVuRSxNQUFNLEVBQUMsb0JBQW9CLEVBQUUscUJBQXFCLEVBQUMsR0FBRyx3QkFBd0IsQ0FBQztRQUUvRSxJQUFJLG9CQUFvQixFQUFFLENBQUM7WUFDdkIsTUFBTSxXQUFXLEdBQUcsSUFBSSx1Q0FBa0IsQ0FBQyxJQUFJLEVBQUUsa0JBQWtCLEVBQUU7Z0JBQ2pFLFdBQVcsRUFBRSxXQUFXO2dCQUN4QixnQkFBZ0IsRUFBRSxhQUFhO2FBQ2xDLENBQUMsQ0FBQztZQUNILElBQUksQ0FBQywrQkFBK0IsQ0FBQyxNQUFNLEVBQUUsb0JBQW9CLEVBQUUsQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLHlCQUF5QixDQUFDLENBQUMsQ0FBQztRQUN2SCxDQUFDO1FBRUQsSUFBSSxxQkFBcUIsRUFBRSxDQUFDO1lBQ3hCLElBQUksQ0FBQywrQkFBK0IsQ0FBQyxTQUFTLEVBQUUscUJBQXFCLEVBQUUsQ0FBQywwQkFBMEIsQ0FBQyxDQUFDLENBQUM7UUFDekcsQ0FBQztJQUNMLENBQUM7SUFFTywrQkFBK0IsQ0FBQyxJQUFZLEVBQUUsTUFBMEIsRUFBRSxNQUFnQjtRQUM5RixNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDMUMsTUFBTSx5QkFBeUIsR0FBRyxJQUFJLHVDQUF5QixDQUFDLElBQUksRUFBRSxHQUFHLElBQUEsOEJBQXFCLEVBQUMsY0FBYyxDQUFDLDJCQUEyQixFQUFFO1lBQ3ZJLDZCQUE2QixFQUFFLEdBQUcsSUFBSSxDQUFDLFNBQVMsSUFBSSxjQUFjLEVBQUU7WUFDcEUsZ0JBQWdCLEVBQUUsTUFBTSxDQUFDLFdBQVc7WUFDcEMsY0FBYyxFQUFFLE1BQU0sQ0FBQyxTQUFTO1lBQ2hDLGtCQUFrQixFQUFFLE1BQU07U0FDN0IsQ0FBQyxDQUFDO1FBQ0gseUJBQXlCLENBQUMsSUFBSSxFQUFFLGdCQUFnQixDQUM1Qyx1QkFBYSxDQUFDLHdCQUF3QixDQUFDLDBCQUEwQixDQUFDLENBQ3JFLENBQUM7UUFDRixPQUFPLHlCQUF5QixDQUFDO0lBQ3JDLENBQUM7Q0FDSjtBQTlERCwwQkE4REMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1N0YWNrLCBTdGFja1Byb3BzfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQge0NvbnN0cnVjdH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQge01hbmFnZWRQb2xpY3l9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1pYW0nO1xuaW1wb3J0IHtGZWF0dXJlQnJhbmNoQnVpbGRzfSBmcm9tICcuL2NvbnN0cnVjdHMvZmVhdHVyZUJyYW5jaEJ1aWxkcyc7XG5pbXBvcnQge01haW5QaXBlbGluZX0gZnJvbSAnLi9jb25zdHJ1Y3RzL21haW5QaXBlbGluZSc7XG5pbXBvcnQge1Jlc29sdmVkQXBwbGljYXRpb25Qcm9wcywgU2xhY2tDaGFubmVsQ29uZmlnLCBTbGFja05vdGlmaWNhdGlvbnN9IGZyb20gJy4vYXBwbGljYXRpb25Qcm9wcyc7XG5pbXBvcnQge1NsYWNrQ2hhbm5lbENvbmZpZ3VyYXRpb259IGZyb20gJ2F3cy1jZGstbGliL2F3cy1jaGF0Ym90JztcbmltcG9ydCB7SVRvcGljLCBUb3BpY30gZnJvbSAnYXdzLWNkay1saWIvYXdzLXNucyc7XG5pbXBvcnQge05vdGlmaWNhdGlvbnNUb3BpY30gZnJvbSAnLi9jb25zdHJ1Y3RzL25vdGlmaWNhdGlvbnNUb3BpYyc7XG5pbXBvcnQge2dldFByb2plY3ROYW1lfSBmcm9tICcuL3V0aWwvY29udGV4dCc7XG5pbXBvcnQge1N0cmluZ1BhcmFtZXRlcn0gZnJvbSAnYXdzLWNkay1saWIvYXdzLXNzbSc7XG5pbXBvcnQge01pcnJvclJlcG9zaXRvcnl9IGZyb20gJy4vY29uc3RydWN0cy9taXJyb3JSZXBvc2l0b3J5JztcbmltcG9ydCB7Y2FwaXRhbGl6ZUZpcnN0TGV0dGVyfSBmcm9tICcuL3V0aWwvc3RyaW5nJztcblxuZXhwb3J0IGludGVyZmFjZSBDSVN0YWNrUHJvcHMgZXh0ZW5kcyBTdGFja1Byb3BzLCBSZXNvbHZlZEFwcGxpY2F0aW9uUHJvcHMge1xufVxuXG5leHBvcnQgY2xhc3MgQ0lTdGFjayBleHRlbmRzIFN0YWNrIHtcbiAgICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogQ0lTdGFja1Byb3BzKSB7XG4gICAgICAgIHN1cGVyKHNjb3BlLCBpZCwgcHJvcHMpO1xuXG4gICAgICAgIGNvbnN0IHJlcG9zaXRvcnlUb2tlblBhcmFtID0gU3RyaW5nUGFyYW1ldGVyLmZyb21TZWN1cmVTdHJpbmdQYXJhbWV0ZXJBdHRyaWJ1dGVzKHRoaXMsICdSZXBvc2l0b3J5VG9rZW5QYXJhbScsIHtcbiAgICAgICAgICAgIHBhcmFtZXRlck5hbWU6IGAvJHtnZXRQcm9qZWN0TmFtZSh0aGlzKX0vY2kvcmVwb3NpdG9yeUFjY2Vzc1Rva2VuYCxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgbWlycm9yID0gbmV3IE1pcnJvclJlcG9zaXRvcnkodGhpcywgJ01pcnJvclJlcG9zaXRvcnknLCB7XG4gICAgICAgICAgICByZXBvVG9rZW5QYXJhbTogcmVwb3NpdG9yeVRva2VuUGFyYW0sXG4gICAgICAgICAgICByZXBvc2l0b3J5OiBwcm9wcy5yZXBvc2l0b3J5LFxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBtYWluUGlwZWxpbmUgPSBuZXcgTWFpblBpcGVsaW5lKHRoaXMsICdNYWluUGlwZWxpbmUnLCB7XG4gICAgICAgICAgICAuLi5wcm9wcyxcbiAgICAgICAgICAgIHNvdXJjZUJ1Y2tldDogbWlycm9yLnNvdXJjZUJ1Y2tldCxcbiAgICAgICAgICAgIHJlcG9zaXRvcnlUb2tlblBhcmFtLFxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBmZWF0dXJlQnJhbmNoQnVpbGRzID0gbmV3IEZlYXR1cmVCcmFuY2hCdWlsZHModGhpcywgJ0ZlYXR1cmVCcmFuY2hCdWlsZHMnLCB7XG4gICAgICAgICAgICAuLi5wcm9wcyxcbiAgICAgICAgICAgIHNvdXJjZUJ1Y2tldDogbWlycm9yLnNvdXJjZUJ1Y2tldCxcbiAgICAgICAgICAgIHJlcG9zaXRvcnlUb2tlblBhcmFtLFxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAocHJvcHMuc2xhY2tOb3RpZmljYXRpb25zKSB7XG4gICAgICAgICAgICB0aGlzLmNyZWF0ZVNsYWNrTm90aWZpY2F0aW9ucyhnZXRQcm9qZWN0TmFtZSh0aGlzKSwgcHJvcHMuc2xhY2tOb3RpZmljYXRpb25zLCBtYWluUGlwZWxpbmUuZmFpbHVyZXNUb3BpYywgZmVhdHVyZUJyYW5jaEJ1aWxkcy5mYWlsdXJlc1RvcGljKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgY3JlYXRlU2xhY2tOb3RpZmljYXRpb25zKFxuICAgICAgICBwcm9qZWN0TmFtZTogc3RyaW5nLCBzbGFja05vdGlmaWNhdGlvbnNDb25maWc6IFNsYWNrTm90aWZpY2F0aW9ucyxcbiAgICAgICAgbWFpblBpcGVsaW5lRmFpbHVyZXNUb3BpYzogVG9waWMsIGZlYXR1cmVCcmFuY2hGYWlsdXJlc1RvcGljOiBUb3BpYyxcbiAgICApIHtcbiAgICAgICAgY29uc3Qge21haW5QaXBlbGluZUZhaWx1cmVzLCBmZWF0dXJlQnJhbmNoRmFpbHVyZXN9ID0gc2xhY2tOb3RpZmljYXRpb25zQ29uZmlnO1xuXG4gICAgICAgIGlmIChtYWluUGlwZWxpbmVGYWlsdXJlcykge1xuICAgICAgICAgICAgY29uc3QgYWxhcm1zVG9waWMgPSBuZXcgTm90aWZpY2F0aW9uc1RvcGljKHRoaXMsICdTbGFja0FsYXJtc1RvcGljJywge1xuICAgICAgICAgICAgICAgIHByb2plY3ROYW1lOiBwcm9qZWN0TmFtZSxcbiAgICAgICAgICAgICAgICBub3RpZmljYXRpb25OYW1lOiAnc2xhY2tBbGFybXMnLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLmNyZWF0ZVNsYWNrQ2hhbm5lbENvbmZpZ3VyYXRpb24oJ21haW4nLCBtYWluUGlwZWxpbmVGYWlsdXJlcywgW2FsYXJtc1RvcGljLnRvcGljLCBtYWluUGlwZWxpbmVGYWlsdXJlc1RvcGljXSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZmVhdHVyZUJyYW5jaEZhaWx1cmVzKSB7XG4gICAgICAgICAgICB0aGlzLmNyZWF0ZVNsYWNrQ2hhbm5lbENvbmZpZ3VyYXRpb24oJ2ZlYXR1cmUnLCBmZWF0dXJlQnJhbmNoRmFpbHVyZXMsIFtmZWF0dXJlQnJhbmNoRmFpbHVyZXNUb3BpY10pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVTbGFja0NoYW5uZWxDb25maWd1cmF0aW9uKG5hbWU6IHN0cmluZywgY29uZmlnOiBTbGFja0NoYW5uZWxDb25maWcsIHRvcGljczogSVRvcGljW10pOiBTbGFja0NoYW5uZWxDb25maWd1cmF0aW9uIHtcbiAgICAgICAgY29uc3QgbG93ZXJjYXNlZE5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGNvbnN0IHNsYWNrQ2hhbm5lbENvbmZpZ3VyYXRpb24gPSBuZXcgU2xhY2tDaGFubmVsQ29uZmlndXJhdGlvbih0aGlzLCBgJHtjYXBpdGFsaXplRmlyc3RMZXR0ZXIobG93ZXJjYXNlZE5hbWUpfVNsYWNrQ2hhbm5lbENvbmZpZ3VyYXRpb25gLCB7XG4gICAgICAgICAgICBzbGFja0NoYW5uZWxDb25maWd1cmF0aW9uTmFtZTogYCR7dGhpcy5zdGFja05hbWV9LSR7bG93ZXJjYXNlZE5hbWV9YCxcbiAgICAgICAgICAgIHNsYWNrV29ya3NwYWNlSWQ6IGNvbmZpZy53b3Jrc3BhY2VJZCxcbiAgICAgICAgICAgIHNsYWNrQ2hhbm5lbElkOiBjb25maWcuY2hhbm5lbElkLFxuICAgICAgICAgICAgbm90aWZpY2F0aW9uVG9waWNzOiB0b3BpY3MsXG4gICAgICAgIH0pO1xuICAgICAgICBzbGFja0NoYW5uZWxDb25maWd1cmF0aW9uLnJvbGU/LmFkZE1hbmFnZWRQb2xpY3koXG4gICAgICAgICAgICBNYW5hZ2VkUG9saWN5LmZyb21Bd3NNYW5hZ2VkUG9saWN5TmFtZSgnQ2xvdWRXYXRjaFJlYWRPbmx5QWNjZXNzJyksXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBzbGFja0NoYW5uZWxDb25maWd1cmF0aW9uO1xuICAgIH1cbn1cbiJdfQ==