aws-delivlib 13.7.10 → 14.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cdk.out/asset.1f7e277bd526ebce1983fa1e7a84a5281ec533d9187caaebb773681bbf7bf4c1/__entrypoint__.js +119 -0
- package/cdk.out/{asset.15684a15d07860e99d2a8079150ad33dd2cb743677fcd7016dd07345e1b69538 → asset.1f7e277bd526ebce1983fa1e7a84a5281ec533d9187caaebb773681bbf7bf4c1}/index.d.ts +0 -0
- package/cdk.out/{asset.15684a15d07860e99d2a8079150ad33dd2cb743677fcd7016dd07345e1b69538 → asset.1f7e277bd526ebce1983fa1e7a84a5281ec533d9187caaebb773681bbf7bf4c1}/index.js +0 -0
- package/cdk.out/{asset.ca50c9b7760151d8e8ce6e39851032d4eff4836ea1ee806eaa944aaef110a353 → asset.7ada94e893d605ebbcf2f5b3bedc83bad3c704ab7892c1f2af45bfd79fb751e7}/index.js +20 -4
- package/cdk.out/{asset.1c4d00e8f9125a52b4db3e74494c950959ffa433738adcf5c9f7251e4d255451 → asset.7bfdb1075bf8728fe236bcef49fbf08ac3ead6c9947f5d65f25b5a7c09758bb1}/create-release.js +0 -0
- package/cdk.out/{asset.1c4d00e8f9125a52b4db3e74494c950959ffa433738adcf5c9f7251e4d255451 → asset.7bfdb1075bf8728fe236bcef49fbf08ac3ead6c9947f5d65f25b5a7c09758bb1}/package-lock.json +0 -0
- package/cdk.out/{asset.1c4d00e8f9125a52b4db3e74494c950959ffa433738adcf5c9f7251e4d255451 → asset.7bfdb1075bf8728fe236bcef49fbf08ac3ead6c9947f5d65f25b5a7c09758bb1}/package.json +0 -0
- package/cdk.out/{asset.1c4d00e8f9125a52b4db3e74494c950959ffa433738adcf5c9f7251e4d255451 → asset.7bfdb1075bf8728fe236bcef49fbf08ac3ead6c9947f5d65f25b5a7c09758bb1}/publish.sh +0 -0
- package/cdk.out/{asset.1c4d00e8f9125a52b4db3e74494c950959ffa433738adcf5c9f7251e4d255451 → asset.7bfdb1075bf8728fe236bcef49fbf08ac3ead6c9947f5d65f25b5a7c09758bb1}/sign-files.sh +0 -0
- package/cdk.out/{asset.1c4d00e8f9125a52b4db3e74494c950959ffa433738adcf5c9f7251e4d255451 → asset.7bfdb1075bf8728fe236bcef49fbf08ac3ead6c9947f5d65f25b5a7c09758bb1}/with-signing-key.sh +1 -7
- package/cdk.out/cdk.out +1 -1
- package/cdk.out/delivlib-test.assets.json +12 -12
- package/cdk.out/delivlib-test.template.json +7135 -7704
- package/cdk.out/manifest.json +152 -2498
- package/cdk.out/tree.json +1059 -1427
- package/lib/auto-build.d.ts +2 -1
- package/lib/auto-build.js +8 -7
- package/lib/auto-build.ts +3 -2
- package/lib/build-env.d.ts +1 -1
- package/lib/build-env.js +4 -4
- package/lib/build-env.ts +1 -1
- package/lib/canary.d.ts +2 -1
- package/lib/canary.js +7 -6
- package/lib/canary.ts +2 -2
- package/lib/change-controller.d.ts +2 -1
- package/lib/change-controller.js +20 -18
- package/lib/change-controller.ts +6 -5
- package/lib/chime-notifier/chime-notifier.d.ts +2 -1
- package/lib/chime-notifier/chime-notifier.js +12 -11
- package/lib/chime-notifier/chime-notifier.ts +3 -2
- package/lib/code-signing/certificate-signing-request.d.ts +1 -1
- package/lib/code-signing/certificate-signing-request.js +16 -14
- package/lib/code-signing/certificate-signing-request.ts +7 -5
- package/lib/code-signing/code-signing-certificate.d.ts +2 -1
- package/lib/code-signing/code-signing-certificate.js +12 -11
- package/lib/code-signing/code-signing-certificate.ts +5 -4
- package/lib/code-signing/private-key.d.ts +2 -1
- package/lib/code-signing/private-key.js +28 -26
- package/lib/code-signing/private-key.ts +10 -8
- package/lib/credential-pair.d.ts +1 -1
- package/lib/credential-pair.js +1 -1
- package/lib/credential-pair.ts +1 -1
- package/lib/custom-resource-handlers/src/certificate-signing-request.tsbuildinfo +1 -1
- package/lib/custom-resource-handlers/src/pgp-secret.tsbuildinfo +1 -1
- package/lib/custom-resource-handlers/src/private-key.tsbuildinfo +1 -1
- package/lib/open-pgp-key-pair.d.ts +2 -1
- package/lib/open-pgp-key-pair.js +28 -27
- package/lib/open-pgp-key-pair.ts +12 -10
- package/lib/package-integrity/handler/validate.bundle.js +814 -457
- package/lib/package-integrity/integrity.d.ts +2 -1
- package/lib/package-integrity/integrity.js +7 -6
- package/lib/package-integrity/integrity.ts +2 -2
- package/lib/permissions.d.ts +1 -1
- package/lib/permissions.js +5 -5
- package/lib/permissions.ts +4 -4
- package/lib/pipeline-notifications/slack.d.ts +1 -1
- package/lib/pipeline-notifications/slack.js +4 -4
- package/lib/pipeline-notifications/slack.ts +1 -1
- package/lib/pipeline-watcher/watcher.d.ts +2 -1
- package/lib/pipeline-watcher/watcher.js +16 -15
- package/lib/pipeline-watcher/watcher.ts +3 -3
- package/lib/pipeline.d.ts +2 -1
- package/lib/pipeline.js +19 -18
- package/lib/pipeline.ts +5 -4
- package/lib/publishing/github/with-signing-key.sh +1 -7
- package/lib/publishing.d.ts +2 -1
- package/lib/publishing.js +36 -35
- package/lib/publishing.ts +9 -8
- package/lib/pull-request/bump.d.ts +3 -3
- package/lib/pull-request/bump.js +3 -26
- package/lib/pull-request/bump.ts +3 -3
- package/lib/pull-request/merge-back.d.ts +3 -3
- package/lib/pull-request/merge-back.js +3 -3
- package/lib/pull-request/merge-back.ts +3 -3
- package/lib/pull-request/pr.d.ts +2 -1
- package/lib/pull-request/pr.js +11 -10
- package/lib/pull-request/pr.ts +3 -2
- package/lib/registry-sync/ecr-mirror.d.ts +2 -1
- package/lib/registry-sync/ecr-mirror.js +22 -21
- package/lib/registry-sync/ecr-mirror.ts +4 -3
- package/lib/registry-sync/mirror-source.d.ts +2 -1
- package/lib/registry-sync/mirror-source.js +3 -3
- package/lib/registry-sync/mirror-source.ts +2 -2
- package/lib/repo.d.ts +2 -1
- package/lib/repo.js +12 -12
- package/lib/repo.ts +3 -2
- package/lib/shellable.d.ts +2 -1
- package/lib/shellable.js +23 -22
- package/lib/shellable.ts +5 -4
- package/lib/signing-key.d.ts +2 -1
- package/lib/signing-key.js +6 -5
- package/lib/signing-key.ts +3 -2
- package/lib/util.d.ts +1 -1
- package/lib/util.js +1 -1
- package/lib/util.ts +1 -1
- package/package.json +12 -10
- package/cdk.out/asset.15684a15d07860e99d2a8079150ad33dd2cb743677fcd7016dd07345e1b69538/__entrypoint__.js +0 -119
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { aws_cloudwatch as cloudwatch, aws_events as events, aws_secretsmanager as sm } from 'aws-cdk-lib';
|
|
2
|
+
import { Construct } from 'constructs';
|
|
2
3
|
import { ShellPlatform } from '../shellable';
|
|
3
4
|
/**
|
|
4
5
|
* Properties for `PackageIntegrityValidation`.
|
|
@@ -25,7 +25,8 @@ var __importStar = (this && this.__importStar) || function (mod) {
|
|
|
25
25
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
26
|
exports.PackageIntegrityValidation = void 0;
|
|
27
27
|
const path = __importStar(require("path"));
|
|
28
|
-
const
|
|
28
|
+
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
29
|
+
const constructs_1 = require("constructs");
|
|
29
30
|
const shellable_1 = require("../shellable");
|
|
30
31
|
/**
|
|
31
32
|
* Perform periodic integrity checks on published packages based on the
|
|
@@ -37,7 +38,7 @@ const shellable_1 = require("../shellable");
|
|
|
37
38
|
* - The publishing platform (for example GitHub runners)
|
|
38
39
|
* - The artifact storage (for example npmjs.com)
|
|
39
40
|
*/
|
|
40
|
-
class PackageIntegrityValidation extends
|
|
41
|
+
class PackageIntegrityValidation extends constructs_1.Construct {
|
|
41
42
|
constructor(scope, id, props) {
|
|
42
43
|
var _a, _b, _c, _d, _e;
|
|
43
44
|
super(scope, id);
|
|
@@ -57,12 +58,12 @@ class PackageIntegrityValidation extends monocdk_1.Construct {
|
|
|
57
58
|
const grant = props.githubTokenSecret.grantRead(shellable.role);
|
|
58
59
|
grant.assertSuccess();
|
|
59
60
|
}
|
|
60
|
-
new
|
|
61
|
-
schedule: (_e = props.schedule) !== null && _e !== void 0 ? _e :
|
|
62
|
-
targets: [new
|
|
61
|
+
new aws_cdk_lib_1.aws_events.Rule(this, 'ScheduledTrigger', {
|
|
62
|
+
schedule: (_e = props.schedule) !== null && _e !== void 0 ? _e : aws_cdk_lib_1.aws_events.Schedule.rate(aws_cdk_lib_1.Duration.days(1)),
|
|
63
|
+
targets: [new aws_cdk_lib_1.aws_events_targets.CodeBuildProject(shellable.project)],
|
|
63
64
|
});
|
|
64
65
|
this.failureAlarm = shellable.alarm;
|
|
65
66
|
}
|
|
66
67
|
}
|
|
67
68
|
exports.PackageIntegrityValidation = PackageIntegrityValidation;
|
|
68
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
69
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZWdyaXR5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiaW50ZWdyaXR5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsMkNBQTZCO0FBQzdCLDZDQU1xQjtBQUNyQiwyQ0FBdUM7QUFDdkMsNENBQXdEO0FBd0R4RDs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFhLDBCQUEyQixTQUFRLHNCQUFTO0lBT3ZELFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBc0M7O1FBQzlFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakIsTUFBTSxTQUFTLEdBQUcsSUFBSSxxQkFBUyxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUU7WUFDL0MsZUFBZSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQztZQUNoRCxVQUFVLEVBQUUsYUFBYTtZQUN6QixVQUFVLEVBQUUsTUFBQSxLQUFLLENBQUMsVUFBVSxtQ0FBSSxLQUFLO1lBQ3JDLFFBQVEsRUFBRSxNQUFBLEtBQUssQ0FBQyxhQUFhLG1DQUFJLHlCQUFhLENBQUMsV0FBVztZQUMxRCxXQUFXLEVBQUU7Z0JBQ1gsaUJBQWlCLEVBQUUsS0FBSyxDQUFDLFVBQVU7Z0JBQ25DLFVBQVUsRUFBRSxNQUFBLEtBQUssQ0FBQyxTQUFTLG1DQUFJLEVBQUU7Z0JBQ2pDLGdCQUFnQixFQUFFLE1BQUEsS0FBSyxDQUFDLGlCQUFpQiwwQ0FBRSxTQUFTO2dCQUNwRCxTQUFTLEVBQUUsS0FBSyxDQUFDLFFBQVE7YUFDMUI7U0FDRixDQUFDLENBQUM7UUFFSCxJQUFJLEtBQUssQ0FBQyxpQkFBaUIsRUFBRTtZQUMzQixNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNoRSxLQUFLLENBQUMsYUFBYSxFQUFFLENBQUM7U0FDdkI7UUFFRCxJQUFJLHdCQUFNLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxrQkFBa0IsRUFBRTtZQUN4QyxRQUFRLEVBQUUsTUFBQSxLQUFLLENBQUMsUUFBUSxtQ0FBSSx3QkFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsc0JBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbEUsT0FBTyxFQUFFLENBQUMsSUFBSSxnQ0FBTyxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUMzRCxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsWUFBWSxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUM7SUFFdEMsQ0FBQztDQUNGO0FBcENELGdFQW9DQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQge1xuICBhd3NfY2xvdWR3YXRjaCBhcyBjbG91ZHdhdGNoLFxuICBhd3NfZXZlbnRzIGFzIGV2ZW50cyxcbiAgYXdzX2V2ZW50c190YXJnZXRzIGFzIHRhcmdldHMsXG4gIGF3c19zZWNyZXRzbWFuYWdlciBhcyBzbSxcbiAgRHVyYXRpb24sXG59IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgU2hlbGxhYmxlLCBTaGVsbFBsYXRmb3JtIH0gZnJvbSAnLi4vc2hlbGxhYmxlJztcblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBgUGFja2FnZUludGVncml0eVZhbGlkYXRpb25gLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhY2thZ2VJbnRlZ3JpdHlWYWxpZGF0aW9uUHJvcHMge1xuXG4gIC8qKlxuICAgKiBUaGUgcmVwb3NpdG9yeSBzbHVnIG9mIHRoZSBwYWNrYWdlIChpLmUgY2RrbGFicy9qc2lpLWRvY2dlbilcbiAgICovXG4gIHJlYWRvbmx5IHJlcG9zaXRvcnk6IHN0cmluZztcblxuICAvKipcbiAgICogU2VjcmV0IGNvbnRhaW5pbmcgYSBnaXRodWIgdG9rZW4uXG4gICAqL1xuICByZWFkb25seSBnaXRodWJUb2tlblNlY3JldD86IHNtLklTZWNyZXQ7XG5cbiAgLyoqXG4gICAqIFRoZSBidWlsZCBwbGF0Zm9ybSB0byB1c2UuIFRoaXMgcGxhdGZvcm0gc2hvdWxkIGNvbnRhaW4gYWxsIG5lY2Vzc2FyeSB0b29scyB0byBwYWNrYWdlIHRoZSBhcnRpZmFjdHNcbiAgICogaW4gdGhlIHJlcG9zaXRvcnkuIE5vdGUgdGhhdCBieSBkZWZhdWx0LCB0aGlzIGFsc28gbWVhbnMgcnVubmluZyB0aGUgdGVzdHMuXG4gICAqXG4gICAqIEBkZWZhdWx0IFNoZWxsUGxhdGZvcm0uTGludXhVYnVudHVcbiAgICovXG4gIHJlYWRvbmx5IGJ1aWxkUGxhdGZvcm0/OiBTaGVsbFBsYXRmb3JtO1xuXG4gIC8qKlxuICAgKiBSdW4gdGhlIHZhbGlkYXRpb24gb24gYSBzY2hlZHVsZS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBvbmNlIGEgZGF5LlxuICAgKi9cbiAgcmVhZG9ubHkgc2NoZWR1bGU/OiBldmVudHMuU2NoZWR1bGU7XG5cbiAgLyoqXG4gICAqIFdldGhlciBvciBub3QgdGhlIGVudmlyb25tZW50IHNob3VsZCBiZSBwcml2aWxlZ2VkLCBuZWNlc3NhcnkgdG8gcnVuIGNvbnRhaW5lciBpbWFnZXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBwcml2aWxlZ2VkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGFnIHByZWZpeCBmb3IgdGhpcyBzcGVjaWZpYyB2YWxpZGF0aW9uLiBPbmx5IG5lZWRlZCBmb3IgcmVwb3NpdG9yaWVzIHRoYXQgZWl0aGVyIHJlbGVhc2VcbiAgICogbXVsdGlwbGUgcGFja2FnZXMgb3IgbXVsdGlwbGUgbWFqb3IgdmVyc2lvbnMuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gcHJlZml4XG4gICAqL1xuICByZWFkb25seSB0YWdQcmVmaXg/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBwcm9qZW4gdGFzayB0aGF0IHByb2R1Y2VzIHRoZSBsb2NhbCBhcnRpZmFjdHMuXG4gICAqXG4gICAqIEBkZWZhdWx0ICdyZWxlYXNlJ1xuICAgKi9cbiAgcmVhZG9ubHkgcGFja1Rhc2s/OiBzdHJpbmc7XG5cbn1cblxuLyoqXG4gKiBQZXJmb3JtIHBlcmlvZGljIGludGVncml0eSBjaGVja3Mgb24gcHVibGlzaGVkIHBhY2thZ2VzIGJhc2VkIG9uIHRoZVxuICogc291cmNlIGNvZGUgb2YgdGhlIHBhY2thZ2UuIEN1cnJlbnRseSBzdXBwb3J0cyBvbmx5IEdpdEh1YiBob3N0ZWQgcGFja2FnZXMuXG4gKlxuICogVGhlIGNoZWNrIGlzIGRvbmUgYnkgZG93bmxvYWRpbmcgdGhlIHB1Ymxpc2hlZCBhcnRpZmFjdCwgYnVpbGRpbmcgdGhlIHNvdXJjZSBjb2RlLCBhbmQgY29tcGFyaW5nIHRoZSB0d28uXG4gKiBJZiB0aGV5IGRpZmZlciwgaXQgbWVhbnMgdGhhdCBvZiB0aGUgZm9sbG93aW5nIHdhcyBjb21wcm9taXNlZDpcbiAqXG4gKiAtIFRoZSBwdWJsaXNoaW5nIHBsYXRmb3JtIChmb3IgZXhhbXBsZSBHaXRIdWIgcnVubmVycylcbiAqIC0gVGhlIGFydGlmYWN0IHN0b3JhZ2UgKGZvciBleGFtcGxlIG5wbWpzLmNvbSlcbiAqL1xuZXhwb3J0IGNsYXNzIFBhY2thZ2VJbnRlZ3JpdHlWYWxpZGF0aW9uIGV4dGVuZHMgQ29uc3RydWN0IHtcblxuICAvKipcbiAgICogVGhlIGFsYXJtIHRoYXQgd2lsbCB0cmlnZ2VyIGlmIHRoZSB2YWxpZGF0aW9uIGZhaWxzLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGZhaWx1cmVBbGFybTogY2xvdWR3YXRjaC5BbGFybTtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogUGFja2FnZUludGVncml0eVZhbGlkYXRpb25Qcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICBjb25zdCBzaGVsbGFibGUgPSBuZXcgU2hlbGxhYmxlKHRoaXMsICdEZWZhdWx0Jywge1xuICAgICAgc2NyaXB0RGlyZWN0b3J5OiBwYXRoLmpvaW4oX19kaXJuYW1lLCAnaGFuZGxlcicpLFxuICAgICAgZW50cnlwb2ludDogJ3ZhbGlkYXRlLnNoJyxcbiAgICAgIHByaXZpbGVnZWQ6IHByb3BzLnByaXZpbGVnZWQgPz8gZmFsc2UsXG4gICAgICBwbGF0Zm9ybTogcHJvcHMuYnVpbGRQbGF0Zm9ybSA/PyBTaGVsbFBsYXRmb3JtLkxpbnV4VWJ1bnR1LFxuICAgICAgZW52aXJvbm1lbnQ6IHtcbiAgICAgICAgR0lUSFVCX1JFUE9TSVRPUlk6IHByb3BzLnJlcG9zaXRvcnksXG4gICAgICAgIFRBR19QUkVGSVg6IHByb3BzLnRhZ1ByZWZpeCA/PyAnJyxcbiAgICAgICAgR0lUSFVCX1RPS0VOX0FSTjogcHJvcHMuZ2l0aHViVG9rZW5TZWNyZXQ/LnNlY3JldEFybixcbiAgICAgICAgUEFDS19UQVNLOiBwcm9wcy5wYWNrVGFzayxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBpZiAocHJvcHMuZ2l0aHViVG9rZW5TZWNyZXQpIHtcbiAgICAgIGNvbnN0IGdyYW50ID0gcHJvcHMuZ2l0aHViVG9rZW5TZWNyZXQuZ3JhbnRSZWFkKHNoZWxsYWJsZS5yb2xlKTtcbiAgICAgIGdyYW50LmFzc2VydFN1Y2Nlc3MoKTtcbiAgICB9XG5cbiAgICBuZXcgZXZlbnRzLlJ1bGUodGhpcywgJ1NjaGVkdWxlZFRyaWdnZXInLCB7XG4gICAgICBzY2hlZHVsZTogcHJvcHMuc2NoZWR1bGUgPz8gZXZlbnRzLlNjaGVkdWxlLnJhdGUoRHVyYXRpb24uZGF5cygxKSksXG4gICAgICB0YXJnZXRzOiBbbmV3IHRhcmdldHMuQ29kZUJ1aWxkUHJvamVjdChzaGVsbGFibGUucHJvamVjdCldLFxuICAgIH0pO1xuXG4gICAgdGhpcy5mYWlsdXJlQWxhcm0gPSBzaGVsbGFibGUuYWxhcm07XG5cbiAgfVxufVxuIl19
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import * as path from 'path';
|
|
2
2
|
import {
|
|
3
|
-
Construct,
|
|
4
3
|
aws_cloudwatch as cloudwatch,
|
|
5
4
|
aws_events as events,
|
|
6
5
|
aws_events_targets as targets,
|
|
7
6
|
aws_secretsmanager as sm,
|
|
8
7
|
Duration,
|
|
9
|
-
} from '
|
|
8
|
+
} from 'aws-cdk-lib';
|
|
9
|
+
import { Construct } from 'constructs';
|
|
10
10
|
import { Shellable, ShellPlatform } from '../shellable';
|
|
11
11
|
|
|
12
12
|
/**
|
package/lib/permissions.d.ts
CHANGED
package/lib/permissions.js
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.grantAssumeRole = exports.grantSecretRead = void 0;
|
|
4
|
-
const
|
|
4
|
+
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
5
5
|
/**
|
|
6
6
|
* Give the role permission to read a particular secret and its key.
|
|
7
7
|
*/
|
|
8
8
|
function grantSecretRead(secret, identity) {
|
|
9
|
-
identity.
|
|
9
|
+
identity.addToPrincipalPolicy(new aws_cdk_lib_1.aws_iam.PolicyStatement({
|
|
10
10
|
resources: [secret.secretArn],
|
|
11
11
|
actions: ['secretsmanager:ListSecrets', 'secretsmanager:DescribeSecret', 'secretsmanager:GetSecretValue'],
|
|
12
12
|
}));
|
|
13
13
|
if (secret.keyArn) {
|
|
14
|
-
identity.
|
|
14
|
+
identity.addToPrincipalPolicy(new aws_cdk_lib_1.aws_iam.PolicyStatement({
|
|
15
15
|
resources: [secret.keyArn],
|
|
16
16
|
actions: ['kms:Decrypt'],
|
|
17
17
|
}));
|
|
@@ -22,10 +22,10 @@ exports.grantSecretRead = grantSecretRead;
|
|
|
22
22
|
* Give the role permission to assume another role.
|
|
23
23
|
*/
|
|
24
24
|
function grantAssumeRole(roleToAssumeArn, identity) {
|
|
25
|
-
identity.
|
|
25
|
+
identity.addToPrincipalPolicy(new aws_cdk_lib_1.aws_iam.PolicyStatement({
|
|
26
26
|
resources: [roleToAssumeArn],
|
|
27
27
|
actions: ['sts:AssumeRole'],
|
|
28
28
|
}));
|
|
29
29
|
}
|
|
30
30
|
exports.grantAssumeRole = grantAssumeRole;
|
|
31
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
31
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVybWlzc2lvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJwZXJtaXNzaW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2Q0FBNkM7QUFzRDdDOztHQUVHO0FBQ0gsU0FBZ0IsZUFBZSxDQUFDLE1BQXNCLEVBQUUsUUFBd0I7SUFDOUUsUUFBUSxDQUFDLG9CQUFvQixDQUFDLElBQUkscUJBQUcsQ0FBQyxlQUFlLENBQUM7UUFDcEQsU0FBUyxFQUFFLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQztRQUM3QixPQUFPLEVBQUUsQ0FBQyw0QkFBNEIsRUFBRSwrQkFBK0IsRUFBRSwrQkFBK0IsQ0FBQztLQUMxRyxDQUFDLENBQUMsQ0FBQztJQUVKLElBQUksTUFBTSxDQUFDLE1BQU0sRUFBRTtRQUNqQixRQUFRLENBQUMsb0JBQW9CLENBQUMsSUFBSSxxQkFBRyxDQUFDLGVBQWUsQ0FBQztZQUNwRCxTQUFTLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDO1lBQzFCLE9BQU8sRUFBRSxDQUFDLGFBQWEsQ0FBQztTQUN6QixDQUFDLENBQUMsQ0FBQztLQUNMO0FBQ0gsQ0FBQztBQVpELDBDQVlDO0FBRUQ7O0dBRUc7QUFDSCxTQUFnQixlQUFlLENBQUMsZUFBdUIsRUFBRSxRQUF3QjtJQUMvRSxRQUFRLENBQUMsb0JBQW9CLENBQUMsSUFBSSxxQkFBRyxDQUFDLGVBQWUsQ0FBQztRQUNwRCxTQUFTLEVBQUUsQ0FBQyxlQUFlLENBQUM7UUFDNUIsT0FBTyxFQUFFLENBQUMsZ0JBQWdCLENBQUM7S0FDNUIsQ0FBQyxDQUFDLENBQUM7QUFDTixDQUFDO0FBTEQsMENBS0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBhd3NfaWFtIGFzIGlhbSB9IGZyb20gJ2F3cy1jZGstbGliJztcblxuXG4vKipcbiAqIERlc2NyaWJlIGEgU2VjcmV0cyBNYW5hZ2VyIHNlY3JldCBleHRlcm5hbCB0byB0aGUgQ0RLIGFwcFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEV4dGVybmFsU2VjcmV0IHtcbiAgLyoqXG4gICAqIFRoZSBBUk4gb2YgdGhlIEFXUyBTZWNyZXRzIE1hbmFnZXIgc2VjcmV0LlxuICAgKi9cbiAgc2VjcmV0QXJuOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFSTiBvZiB0aGUgZW5jcnlwdGlvbiBrZXkgZm9yIHRoaXMgc2VjcmV0LlxuICAgKlxuICAgKiAoQWZ0ZXIgY3JlYXRpb24gb2YgdGhlIHByb2plY3QsIHlvdSBtdXN0IG1hbnVhbGx5IGdyYW50IFwia21zOkRlY3J5cHRcIlxuICAgKiBwZXJtaXNzaW9ucyBvbiB0aGlzIGtleSB0byB0aGUgcm9sZSBjcmVhdGVkIGZvciB0aGlzIENvZGVCdWlsZCBwcm9qZWN0KS5cbiAgICovXG4gIGtleUFybj86IHN0cmluZztcblxuICAvKipcbiAgICogT3B0aW9uYWwgcm9sZSB0byBiZSBhc3N1bWVkIGluIG9yZGVyIHRvIGFjY2VzcyB0aGUgc2VjcmV0LlxuICAgKiBAZGVmYXVsdCBOb25lXG4gICAqL1xuICBhc3N1bWVSb2xlQXJuPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVnaW9uIHdoZXJlIHRoZSBzZWNyZXQgaXMgc3RvcmVkLlxuICAgKiBAZGVmYXVsdCBjdXJyZW50IHJlZ2lvblxuICAgKi9cbiAgcmVnaW9uPzogUmVnaW9uO1xufVxuXG4vLyBMaXN0IHRha2VuIGZyb20gaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2dlbmVyYWwvbGF0ZXN0L2dyL3JhbmRlLmh0bWwuXG5leHBvcnQgdHlwZSBSZWdpb24gPVxuICAndXMtZWFzdC0xJyB8XG4gICd1cy1lYXN0LTInIHxcbiAgJ3VzLXdlc3QtMScgfFxuICAndXMtd2VzdC0yJyB8XG4gICdhcC1ub3J0aGVhc3QtMScgfFxuICAnYXAtbm9ydGhlYXN0LTInIHxcbiAgJ2FwLW5vcnRoZWFzdC0zJyB8XG4gICdhcC1zb3V0aC0xJyB8XG4gICdhcC1zb3V0aGVhc3QtMScgfFxuICAnYXAtc291dGhlYXN0LTInIHxcbiAgJ2NhLWNlbnRyYWwtMScgfFxuICAnY24tbm9ydGgtMScgfFxuICAnY24tbm9ydGh3ZXN0LTEnIHxcbiAgJ2V1LWNlbnRyYWwtMScgfFxuICAnZXUtd2VzdC0xJyB8XG4gICdldS13ZXN0LTInIHxcbiAgJ2V1LXdlc3QtMycgfFxuICAnc2EtZWFzdC0xJztcblxuLyoqXG4gKiBHaXZlIHRoZSByb2xlIHBlcm1pc3Npb24gdG8gcmVhZCBhIHBhcnRpY3VsYXIgc2VjcmV0IGFuZCBpdHMga2V5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ3JhbnRTZWNyZXRSZWFkKHNlY3JldDogRXh0ZXJuYWxTZWNyZXQsIGlkZW50aXR5OiBpYW0uSVByaW5jaXBhbCkge1xuICBpZGVudGl0eS5hZGRUb1ByaW5jaXBhbFBvbGljeShuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgcmVzb3VyY2VzOiBbc2VjcmV0LnNlY3JldEFybl0sXG4gICAgYWN0aW9uczogWydzZWNyZXRzbWFuYWdlcjpMaXN0U2VjcmV0cycsICdzZWNyZXRzbWFuYWdlcjpEZXNjcmliZVNlY3JldCcsICdzZWNyZXRzbWFuYWdlcjpHZXRTZWNyZXRWYWx1ZSddLFxuICB9KSk7XG5cbiAgaWYgKHNlY3JldC5rZXlBcm4pIHtcbiAgICBpZGVudGl0eS5hZGRUb1ByaW5jaXBhbFBvbGljeShuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICByZXNvdXJjZXM6IFtzZWNyZXQua2V5QXJuXSxcbiAgICAgIGFjdGlvbnM6IFsna21zOkRlY3J5cHQnXSxcbiAgICB9KSk7XG4gIH1cbn1cblxuLyoqXG4gKiBHaXZlIHRoZSByb2xlIHBlcm1pc3Npb24gdG8gYXNzdW1lIGFub3RoZXIgcm9sZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdyYW50QXNzdW1lUm9sZShyb2xlVG9Bc3N1bWVBcm46IHN0cmluZywgaWRlbnRpdHk6IGlhbS5JUHJpbmNpcGFsKSB7XG4gIGlkZW50aXR5LmFkZFRvUHJpbmNpcGFsUG9saWN5KG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICByZXNvdXJjZXM6IFtyb2xlVG9Bc3N1bWVBcm5dLFxuICAgIGFjdGlvbnM6IFsnc3RzOkFzc3VtZVJvbGUnXSxcbiAgfSkpO1xufVxuIl19
|
package/lib/permissions.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { aws_iam as iam } from '
|
|
1
|
+
import { aws_iam as iam } from 'aws-cdk-lib';
|
|
2
2
|
|
|
3
3
|
|
|
4
4
|
/**
|
|
@@ -56,13 +56,13 @@ export type Region =
|
|
|
56
56
|
* Give the role permission to read a particular secret and its key.
|
|
57
57
|
*/
|
|
58
58
|
export function grantSecretRead(secret: ExternalSecret, identity: iam.IPrincipal) {
|
|
59
|
-
identity.
|
|
59
|
+
identity.addToPrincipalPolicy(new iam.PolicyStatement({
|
|
60
60
|
resources: [secret.secretArn],
|
|
61
61
|
actions: ['secretsmanager:ListSecrets', 'secretsmanager:DescribeSecret', 'secretsmanager:GetSecretValue'],
|
|
62
62
|
}));
|
|
63
63
|
|
|
64
64
|
if (secret.keyArn) {
|
|
65
|
-
identity.
|
|
65
|
+
identity.addToPrincipalPolicy(new iam.PolicyStatement({
|
|
66
66
|
resources: [secret.keyArn],
|
|
67
67
|
actions: ['kms:Decrypt'],
|
|
68
68
|
}));
|
|
@@ -73,7 +73,7 @@ export function grantSecretRead(secret: ExternalSecret, identity: iam.IPrincipal
|
|
|
73
73
|
* Give the role permission to assume another role.
|
|
74
74
|
*/
|
|
75
75
|
export function grantAssumeRole(roleToAssumeArn: string, identity: iam.IPrincipal) {
|
|
76
|
-
identity.
|
|
76
|
+
identity.addToPrincipalPolicy(new iam.PolicyStatement({
|
|
77
77
|
resources: [roleToAssumeArn],
|
|
78
78
|
actions: ['sts:AssumeRole'],
|
|
79
79
|
}));
|
|
@@ -25,7 +25,7 @@ var __importStar = (this && this.__importStar) || function (mod) {
|
|
|
25
25
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
26
|
exports.SlackNotification = exports.SlackNotificationDetailLevel = void 0;
|
|
27
27
|
const crypto = __importStar(require("crypto"));
|
|
28
|
-
const
|
|
28
|
+
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
29
29
|
/**
|
|
30
30
|
* The level of details to be included in a slack notification.
|
|
31
31
|
*/
|
|
@@ -61,9 +61,9 @@ class SlackNotification {
|
|
|
61
61
|
const hash = crypto.createHash('md5')
|
|
62
62
|
.update(JSON.stringify(
|
|
63
63
|
// Resolving the value so tokens don't cause flaky outputs
|
|
64
|
-
|
|
64
|
+
aws_cdk_lib_1.Stack.of(options.pipeline).resolve(targets)))
|
|
65
65
|
.digest('hex');
|
|
66
|
-
new
|
|
66
|
+
new aws_cdk_lib_1.aws_codestarnotifications.CfnNotificationRule(options.pipeline, `PipelineNotificationSlack-${hash}`, {
|
|
67
67
|
name: `${options.pipeline.pipeline.pipelineName}-${hash}`,
|
|
68
68
|
detailType: (_a = this.props.detailLevel) !== null && _a !== void 0 ? _a : SlackNotificationDetailLevel.BASIC,
|
|
69
69
|
resource: options.pipeline.pipeline.pipelineArn,
|
|
@@ -73,4 +73,4 @@ class SlackNotification {
|
|
|
73
73
|
}
|
|
74
74
|
}
|
|
75
75
|
exports.SlackNotification = SlackNotification;
|
|
76
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
76
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xhY2suanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJzbGFjay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLCtDQUFpQztBQUNqQyw2Q0FJcUI7QUFtQnJCOztHQUVHO0FBQ0gsSUFBWSw0QkFTWDtBQVRELFdBQVksNEJBQTRCO0lBQ3RDOztPQUVHO0lBQ0gsK0NBQWUsQ0FBQTtJQUNmOztPQUVHO0lBQ0gsNkNBQWEsQ0FBQTtBQUNmLENBQUMsRUFUVyw0QkFBNEIsR0FBNUIsb0NBQTRCLEtBQTVCLG9DQUE0QixRQVN2QztBQUVEOztHQUVHO0FBQ0gsTUFBYSxpQkFBaUI7SUFDNUIsWUFBNkIsS0FBNkI7UUFBN0IsVUFBSyxHQUFMLEtBQUssQ0FBd0I7UUFDeEQsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUFFO1lBQ25DLE1BQU0sSUFBSSxLQUFLLENBQUMsMEJBQTBCLENBQUMsQ0FBQztTQUM3QztJQUNILENBQUM7SUFFTSxJQUFJLENBQUMsT0FBd0M7O1FBQ2xELE1BQU0sT0FBTyxHQUFvRCxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDM0YsT0FBTztnQkFDTCxhQUFhLEVBQUUsQ0FBQyxDQUFDLDRCQUE0QjtnQkFDN0MsVUFBVSxFQUFFLGlCQUFpQjthQUM5QixDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7UUFDSCxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQzthQUNsQyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVM7UUFDcEIsMERBQTBEO1FBQzFELG1CQUFLLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FDN0M7YUFDQSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDakIsSUFBSSx1Q0FBVSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsNkJBQTZCLElBQUksRUFBRSxFQUFFO1lBQ3hGLElBQUksRUFBRSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFlBQVksSUFBSSxJQUFJLEVBQUU7WUFDekQsVUFBVSxFQUFFLE1BQUEsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLG1DQUFJLDRCQUE0QixDQUFDLEtBQUs7WUFDeEUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFdBQVc7WUFDL0MsT0FBTztZQUNQLFlBQVksRUFBRSxDQUFDLCtDQUErQyxDQUFDO1NBQ2hFLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjtBQTVCRCw4Q0E0QkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBjcnlwdG8gZnJvbSAnY3J5cHRvJztcbmltcG9ydCB7XG4gIGF3c19jaGF0Ym90IGFzIGNoYXRib3QsXG4gIGF3c19jb2Rlc3Rhcm5vdGlmaWNhdGlvbnMgYXMgc3Rhcm5vdGlmcyxcbiAgU3RhY2ssXG59IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IElQaXBlbGluZU5vdGlmaWNhdGlvbiwgUGlwZWxpbmVOb3RpZmljYXRpb25CaW5kT3B0aW9ucyB9IGZyb20gJy4uLyc7XG5cbi8qKlxuICogUHJvcGVydGllcyB0byBpbml0aWFsaXplIFNsYWNrTm90aWZpY2F0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2xhY2tOb3RpZmljYXRpb25Qcm9wcyB7XG4gIC8qKlxuICAgKiBUaGUgbGlzdCBvZiBDaGF0Ym90IHJlZ2lzdGVyZWQgc2xhY2sgY2hhbm5lbHMuXG4gICAqL1xuICByZWFkb25seSBjaGFubmVsczogY2hhdGJvdC5TbGFja0NoYW5uZWxDb25maWd1cmF0aW9uW107XG5cbiAgLyoqXG4gICAqIFRoZSBsZXZlbCBvZiBkZXRhaWxzIHRvIGJlIGluY2x1ZGVkIGluIHRoZSBub3RpZmljYXRpb25cbiAgICogQGRlZmF1bHQgU2xhY2tOb3RpZmljYXRpb25EZXRhaWxMZXZlbC5CQVNJQ1xuICAgKi9cbiAgcmVhZG9ubHkgZGV0YWlsTGV2ZWw/OiBTbGFja05vdGlmaWNhdGlvbkRldGFpbExldmVsO1xufVxuXG4vKipcbiAqIFRoZSBsZXZlbCBvZiBkZXRhaWxzIHRvIGJlIGluY2x1ZGVkIGluIGEgc2xhY2sgbm90aWZpY2F0aW9uLlxuICovXG5leHBvcnQgZW51bSBTbGFja05vdGlmaWNhdGlvbkRldGFpbExldmVsIHtcbiAgLyoqXG4gICAqIEJhc2ljIGV2ZW50IGRldGFpbHMgd2l0aG91dCB0aGUgY29udGVudHMgb2YgdGhlIGVycm9yIG1lc3NhZ2UuXG4gICAqL1xuICBCQVNJQyA9ICdCQVNJQycsXG4gIC8qKlxuICAgKiBJbmZvcm1hdGlvbiBpbmNsdWRlZCBpbiBCQVNJQywgcGx1cyB0aGUgY29udGVudHMgb2YgdGhlIGVycm9yIG1lc3NhZ2UuXG4gICAqL1xuICBGVUxMID0gJ0ZVTEwnLFxufVxuXG4vKipcbiAqIE5vdGlmeSBldmVudHMgb24gcGlwZWxpbmUgdG8gYSBTbGFjayBjaGFubmVsIHZpYSBBV1MgQ2hhdGJvdFxuICovXG5leHBvcnQgY2xhc3MgU2xhY2tOb3RpZmljYXRpb24gaW1wbGVtZW50cyBJUGlwZWxpbmVOb3RpZmljYXRpb24ge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHByb3BzOiBTbGFja05vdGlmaWNhdGlvblByb3BzKSB7XG4gICAgaWYgKHRoaXMucHJvcHMuY2hhbm5lbHMubGVuZ3RoID09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignY2hhbm5lbHMgY2Fubm90IGJlIGVtcHR5Jyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGJpbmQob3B0aW9uczogUGlwZWxpbmVOb3RpZmljYXRpb25CaW5kT3B0aW9ucyk6IHZvaWQge1xuICAgIGNvbnN0IHRhcmdldHM6IHN0YXJub3RpZnMuQ2ZuTm90aWZpY2F0aW9uUnVsZS5UYXJnZXRQcm9wZXJ0eVtdID0gdGhpcy5wcm9wcy5jaGFubmVscy5tYXAoYyA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0YXJnZXRBZGRyZXNzOiBjLnNsYWNrQ2hhbm5lbENvbmZpZ3VyYXRpb25Bcm4sXG4gICAgICAgIHRhcmdldFR5cGU6ICdBV1NDaGF0Ym90U2xhY2snLFxuICAgICAgfTtcbiAgICB9KTtcbiAgICBjb25zdCBoYXNoID0gY3J5cHRvLmNyZWF0ZUhhc2goJ21kNScpXG4gICAgICAudXBkYXRlKEpTT04uc3RyaW5naWZ5KFxuICAgICAgICAvLyBSZXNvbHZpbmcgdGhlIHZhbHVlIHNvIHRva2VucyBkb24ndCBjYXVzZSBmbGFreSBvdXRwdXRzXG4gICAgICAgIFN0YWNrLm9mKG9wdGlvbnMucGlwZWxpbmUpLnJlc29sdmUodGFyZ2V0cykpLFxuICAgICAgKVxuICAgICAgLmRpZ2VzdCgnaGV4Jyk7XG4gICAgbmV3IHN0YXJub3RpZnMuQ2ZuTm90aWZpY2F0aW9uUnVsZShvcHRpb25zLnBpcGVsaW5lLCBgUGlwZWxpbmVOb3RpZmljYXRpb25TbGFjay0ke2hhc2h9YCwge1xuICAgICAgbmFtZTogYCR7b3B0aW9ucy5waXBlbGluZS5waXBlbGluZS5waXBlbGluZU5hbWV9LSR7aGFzaH1gLFxuICAgICAgZGV0YWlsVHlwZTogdGhpcy5wcm9wcy5kZXRhaWxMZXZlbCA/PyBTbGFja05vdGlmaWNhdGlvbkRldGFpbExldmVsLkJBU0lDLFxuICAgICAgcmVzb3VyY2U6IG9wdGlvbnMucGlwZWxpbmUucGlwZWxpbmUucGlwZWxpbmVBcm4sXG4gICAgICB0YXJnZXRzLFxuICAgICAgZXZlbnRUeXBlSWRzOiBbJ2NvZGVwaXBlbGluZS1waXBlbGluZS1hY3Rpb24tZXhlY3V0aW9uLWZhaWxlZCddLFxuICAgIH0pO1xuICB9XG59XG4iXX0=
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { aws_cloudwatch as cloudwatch, aws_codepipeline as cpipeline } from 'aws-cdk-lib';
|
|
2
|
+
import { Construct } from 'constructs';
|
|
2
3
|
export interface PipelineWatcherProps {
|
|
3
4
|
/**
|
|
4
5
|
* The CloudWatch metric namespace to which metrics should be sent
|
|
@@ -25,7 +25,8 @@ var __importStar = (this && this.__importStar) || function (mod) {
|
|
|
25
25
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
26
|
exports.PipelineWatcher = void 0;
|
|
27
27
|
const path = __importStar(require("path"));
|
|
28
|
-
const
|
|
28
|
+
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
29
|
+
const constructs_1 = require("constructs");
|
|
29
30
|
/**
|
|
30
31
|
* Construct which watches a Code Pipeline for failed stages and raises an alarm
|
|
31
32
|
* if there are any failed stages.
|
|
@@ -36,19 +37,19 @@ const monocdk_1 = require("monocdk");
|
|
|
36
37
|
* a corresponding alarm is set to fire when the maximim value of a single 5-minute interval
|
|
37
38
|
* is >= 1.
|
|
38
39
|
*/
|
|
39
|
-
class PipelineWatcher extends
|
|
40
|
+
class PipelineWatcher extends constructs_1.Construct {
|
|
40
41
|
constructor(parent, name, props) {
|
|
41
42
|
super(parent, name);
|
|
42
|
-
const pipelineWatcher = new
|
|
43
|
+
const pipelineWatcher = new aws_cdk_lib_1.aws_lambda.Function(this, 'Poller', {
|
|
43
44
|
handler: 'watcher-handler.handler',
|
|
44
|
-
runtime:
|
|
45
|
-
code:
|
|
45
|
+
runtime: aws_cdk_lib_1.aws_lambda.Runtime.NODEJS_12_X,
|
|
46
|
+
code: aws_cdk_lib_1.aws_lambda.Code.fromAsset(path.join(__dirname, 'handler')),
|
|
46
47
|
environment: {
|
|
47
48
|
METRIC_NAMESPACE: props.metricNamespace,
|
|
48
49
|
METRIC_NAME: props.failureMetricName,
|
|
49
50
|
},
|
|
50
51
|
});
|
|
51
|
-
pipelineWatcher.addToRolePolicy(new
|
|
52
|
+
pipelineWatcher.addToRolePolicy(new aws_cdk_lib_1.aws_iam.PolicyStatement({
|
|
52
53
|
resources: ['*'],
|
|
53
54
|
actions: ['cloudwatch:PutMetricData'],
|
|
54
55
|
conditions: {
|
|
@@ -57,7 +58,7 @@ class PipelineWatcher extends monocdk_1.Construct {
|
|
|
57
58
|
},
|
|
58
59
|
},
|
|
59
60
|
}));
|
|
60
|
-
new
|
|
61
|
+
new aws_cdk_lib_1.aws_events.Rule(this, 'Trigger', {
|
|
61
62
|
eventPattern: {
|
|
62
63
|
source: ['aws.codepipeline'],
|
|
63
64
|
resources: [props.pipeline.pipelineArn],
|
|
@@ -69,25 +70,25 @@ class PipelineWatcher extends monocdk_1.Construct {
|
|
|
69
70
|
state: ['FAILED', 'SUCCEEDED'],
|
|
70
71
|
},
|
|
71
72
|
},
|
|
72
|
-
targets: [new
|
|
73
|
+
targets: [new aws_cdk_lib_1.aws_events_targets.LambdaFunction(pipelineWatcher)],
|
|
73
74
|
});
|
|
74
|
-
this.alarm = new
|
|
75
|
+
this.alarm = new aws_cdk_lib_1.aws_cloudwatch.Alarm(this, 'Alarm', {
|
|
75
76
|
alarmDescription: `Pipeline ${props.title || props.pipeline.pipelineName} has failed stages`,
|
|
76
|
-
metric: new
|
|
77
|
+
metric: new aws_cdk_lib_1.aws_cloudwatch.Metric({
|
|
77
78
|
metricName: props.failureMetricName,
|
|
78
79
|
namespace: props.metricNamespace,
|
|
79
|
-
statistic:
|
|
80
|
-
|
|
80
|
+
statistic: aws_cdk_lib_1.aws_cloudwatch.Statistic.MAXIMUM,
|
|
81
|
+
dimensionsMap: {
|
|
81
82
|
Pipeline: props.pipeline.pipelineName,
|
|
82
83
|
},
|
|
83
84
|
}),
|
|
84
85
|
threshold: 1,
|
|
85
|
-
comparisonOperator:
|
|
86
|
+
comparisonOperator: aws_cdk_lib_1.aws_cloudwatch.ComparisonOperator.GREATER_THAN_OR_EQUAL_TO_THRESHOLD,
|
|
86
87
|
evaluationPeriods: 1,
|
|
87
88
|
// IGNORE missing data, so the alarm stays in its current state, until the next data point.
|
|
88
|
-
treatMissingData:
|
|
89
|
+
treatMissingData: aws_cdk_lib_1.aws_cloudwatch.TreatMissingData.IGNORE,
|
|
89
90
|
});
|
|
90
91
|
}
|
|
91
92
|
}
|
|
92
93
|
exports.PipelineWatcher = PipelineWatcher;
|
|
93
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
94
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2F0Y2hlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIndhdGNoZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwyQ0FBNkI7QUFDN0IsNkNBT3FCO0FBQ3JCLDJDQUF1QztBQTRCdkM7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBYSxlQUFnQixTQUFRLHNCQUFTO0lBRzVDLFlBQVksTUFBaUIsRUFBRSxJQUFZLEVBQUUsS0FBMkI7UUFDdEUsS0FBSyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztRQUVwQixNQUFNLGVBQWUsR0FBRyxJQUFJLHdCQUFNLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUU7WUFDMUQsT0FBTyxFQUFFLHlCQUF5QjtZQUNsQyxPQUFPLEVBQUUsd0JBQU0sQ0FBQyxPQUFPLENBQUMsV0FBVztZQUNuQyxJQUFJLEVBQUUsd0JBQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQzVELFdBQVcsRUFBRTtnQkFDWCxnQkFBZ0IsRUFBRSxLQUFLLENBQUMsZUFBZTtnQkFDdkMsV0FBVyxFQUFFLEtBQUssQ0FBQyxpQkFBaUI7YUFDckM7U0FDRixDQUFDLENBQUM7UUFFSCxlQUFlLENBQUMsZUFBZSxDQUFDLElBQUkscUJBQUcsQ0FBQyxlQUFlLENBQUM7WUFDdEQsU0FBUyxFQUFFLENBQUMsR0FBRyxDQUFDO1lBQ2hCLE9BQU8sRUFBRSxDQUFDLDBCQUEwQixDQUFDO1lBQ3JDLFVBQVUsRUFBRTtnQkFDVixZQUFZLEVBQUU7b0JBQ1osc0JBQXNCLEVBQUUsS0FBSyxDQUFDLGVBQWU7aUJBQzlDO2FBQ0Y7U0FDRixDQUFDLENBQUMsQ0FBQztRQUVKLElBQUksd0JBQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRTtZQUMvQixZQUFZLEVBQUU7Z0JBQ1osTUFBTSxFQUFFLENBQUMsa0JBQWtCLENBQUM7Z0JBQzVCLFNBQVMsRUFBRSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDO2dCQUN2QyxVQUFVLEVBQUU7b0JBQ1YsNENBQTRDO29CQUM1Qyw4Q0FBOEM7aUJBQy9DO2dCQUNELE1BQU0sRUFBRTtvQkFDTixLQUFLLEVBQUUsQ0FBQyxRQUFRLEVBQUUsV0FBVyxDQUFDO2lCQUMvQjthQUNGO1lBQ0QsT0FBTyxFQUFFLENBQUMsSUFBSSxnQ0FBYyxDQUFDLGNBQWMsQ0FBQyxlQUFlLENBQUMsQ0FBQztTQUM5RCxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksNEJBQVUsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRTtZQUMvQyxnQkFBZ0IsRUFBRSxZQUFZLEtBQUssQ0FBQyxLQUFLLElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxZQUFZLG9CQUFvQjtZQUM1RixNQUFNLEVBQUUsSUFBSSw0QkFBVSxDQUFDLE1BQU0sQ0FBQztnQkFDNUIsVUFBVSxFQUFFLEtBQUssQ0FBQyxpQkFBaUI7Z0JBQ25DLFNBQVMsRUFBRSxLQUFLLENBQUMsZUFBZTtnQkFDaEMsU0FBUyxFQUFFLDRCQUFVLENBQUMsU0FBUyxDQUFDLE9BQU87Z0JBQ3ZDLGFBQWEsRUFBRTtvQkFDYixRQUFRLEVBQUUsS0FBSyxDQUFDLFFBQVEsQ0FBQyxZQUFZO2lCQUN0QzthQUNGLENBQUM7WUFDRixTQUFTLEVBQUUsQ0FBQztZQUNaLGtCQUFrQixFQUFFLDRCQUFVLENBQUMsa0JBQWtCLENBQUMsa0NBQWtDO1lBQ3BGLGlCQUFpQixFQUFFLENBQUM7WUFDcEIsMkZBQTJGO1lBQzNGLGdCQUFnQixFQUFFLDRCQUFVLENBQUMsZ0JBQWdCLENBQUMsTUFBTTtTQUNyRCxDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0Y7QUExREQsMENBMERDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7XG4gIGF3c19jbG91ZHdhdGNoIGFzIGNsb3Vkd2F0Y2gsXG4gIGF3c19jb2RlcGlwZWxpbmUgYXMgY3BpcGVsaW5lLFxuICBhd3NfZXZlbnRzIGFzIGV2ZW50cyxcbiAgYXdzX2V2ZW50c190YXJnZXRzIGFzIGV2ZW50c190YXJnZXRzLFxuICBhd3NfaWFtIGFzIGlhbSxcbiAgYXdzX2xhbWJkYSBhcyBsYW1iZGEsXG59IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFBpcGVsaW5lV2F0Y2hlclByb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBDbG91ZFdhdGNoIG1ldHJpYyBuYW1lc3BhY2UgdG8gd2hpY2ggbWV0cmljcyBzaG91bGQgYmUgc2VudFxuICAgKi9cbiAgbWV0cmljTmFtZXNwYWNlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBDbG91ZFdhdGNoIG1ldHJpYyBuYW1lIGZvciBmYWlsdXJlcy5cbiAgICovXG4gIGZhaWx1cmVNZXRyaWNOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIENvZGUgUGlwZWxpbmUgdG8gbW9uaXRvciBmb3IgZmFpbGVkIHN0YWdlc1xuICAgKi9cbiAgcGlwZWxpbmU6IGNwaXBlbGluZS5JUGlwZWxpbmU7XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgcGlwZWxpbmVOYW1lIG9mIHRoZSBhbGFybSBkZXNjcmlwdGlvbi5cbiAgICpcbiAgICogRGVzY3JpcHRpb24gaXMgc2V0IHRvICdQaXBlbGluZSA8dGl0bGU+IGhhcyBmYWlsZWQgc3RhZ2VzJ1xuICAgKlxuICAgKiBAZGVmYXVsdCBwaXBlbGluZSdzIG5hbWVcbiAgICovXG4gIHRpdGxlPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbnN0cnVjdCB3aGljaCB3YXRjaGVzIGEgQ29kZSBQaXBlbGluZSBmb3IgZmFpbGVkIHN0YWdlcyBhbmQgcmFpc2VzIGFuIGFsYXJtXG4gKiBpZiB0aGVyZSBhcmUgYW55IGZhaWxlZCBzdGFnZXMuXG4gKlxuICogQSBmdW5jdGlvbiBydW5zIGV2ZXJ5IG1pbnV0ZSBhbmQgY2FsbHMgR2V0UGlwZWxpbmVTdGF0ZSBmb3IgdGhlIHByb3ZpZGVkIHBpcGVsaW5lJ3NcbiAqIG5hbWUsIGNvdW50cyB0aGUgbnVtYmVyIG9mIGZhaWxlZCBzdGFnZXMgYW5kIGVtaXRzIGEgSlNPTiBsb2cgeyBmYWlsZWRDb3VudDogPG51bWJlcj4gfS5cbiAqIEEgbWV0cmljIGZpbHRlciBpcyB0aGVuIGNvbmZpZ3VyZWQgdG8gdHJhY2sgdGhpcyB2YWx1ZSBhcyBhIENsb3VkV2F0Y2ggbWV0cmljLCBhbmRcbiAqIGEgY29ycmVzcG9uZGluZyBhbGFybSBpcyBzZXQgdG8gZmlyZSB3aGVuIHRoZSBtYXhpbWltIHZhbHVlIG9mIGEgc2luZ2xlIDUtbWludXRlIGludGVydmFsXG4gKiBpcyA+PSAxLlxuICovXG5leHBvcnQgY2xhc3MgUGlwZWxpbmVXYXRjaGVyIGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgcHVibGljIHJlYWRvbmx5IGFsYXJtOiBjbG91ZHdhdGNoLkFsYXJtO1xuXG4gIGNvbnN0cnVjdG9yKHBhcmVudDogQ29uc3RydWN0LCBuYW1lOiBzdHJpbmcsIHByb3BzOiBQaXBlbGluZVdhdGNoZXJQcm9wcykge1xuICAgIHN1cGVyKHBhcmVudCwgbmFtZSk7XG5cbiAgICBjb25zdCBwaXBlbGluZVdhdGNoZXIgPSBuZXcgbGFtYmRhLkZ1bmN0aW9uKHRoaXMsICdQb2xsZXInLCB7XG4gICAgICBoYW5kbGVyOiAnd2F0Y2hlci1oYW5kbGVyLmhhbmRsZXInLFxuICAgICAgcnVudGltZTogbGFtYmRhLlJ1bnRpbWUuTk9ERUpTXzEyX1gsXG4gICAgICBjb2RlOiBsYW1iZGEuQ29kZS5mcm9tQXNzZXQocGF0aC5qb2luKF9fZGlybmFtZSwgJ2hhbmRsZXInKSksXG4gICAgICBlbnZpcm9ubWVudDoge1xuICAgICAgICBNRVRSSUNfTkFNRVNQQUNFOiBwcm9wcy5tZXRyaWNOYW1lc3BhY2UsXG4gICAgICAgIE1FVFJJQ19OQU1FOiBwcm9wcy5mYWlsdXJlTWV0cmljTmFtZSxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBwaXBlbGluZVdhdGNoZXIuYWRkVG9Sb2xlUG9saWN5KG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgIHJlc291cmNlczogWycqJ10sXG4gICAgICBhY3Rpb25zOiBbJ2Nsb3Vkd2F0Y2g6UHV0TWV0cmljRGF0YSddLFxuICAgICAgY29uZGl0aW9uczoge1xuICAgICAgICBTdHJpbmdFcXVhbHM6IHtcbiAgICAgICAgICAnY2xvdWR3YXRjaDpuYW1lc3BhY2UnOiBwcm9wcy5tZXRyaWNOYW1lc3BhY2UsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pKTtcblxuICAgIG5ldyBldmVudHMuUnVsZSh0aGlzLCAnVHJpZ2dlcicsIHtcbiAgICAgIGV2ZW50UGF0dGVybjoge1xuICAgICAgICBzb3VyY2U6IFsnYXdzLmNvZGVwaXBlbGluZSddLFxuICAgICAgICByZXNvdXJjZXM6IFtwcm9wcy5waXBlbGluZS5waXBlbGluZUFybl0sXG4gICAgICAgIGRldGFpbFR5cGU6IFtcbiAgICAgICAgICAnQ29kZVBpcGVsaW5lIEFjdGlvbiBFeGVjdXRpb24gU3RhdGUgQ2hhbmdlJyxcbiAgICAgICAgICAnQ29kZVBpcGVsaW5lIFBpcGVsaW5lIEV4ZWN1dGlvbiBTdGF0ZSBDaGFuZ2UnLFxuICAgICAgICBdLFxuICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICBzdGF0ZTogWydGQUlMRUQnLCAnU1VDQ0VFREVEJ10sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgdGFyZ2V0czogW25ldyBldmVudHNfdGFyZ2V0cy5MYW1iZGFGdW5jdGlvbihwaXBlbGluZVdhdGNoZXIpXSxcbiAgICB9KTtcblxuICAgIHRoaXMuYWxhcm0gPSBuZXcgY2xvdWR3YXRjaC5BbGFybSh0aGlzLCAnQWxhcm0nLCB7XG4gICAgICBhbGFybURlc2NyaXB0aW9uOiBgUGlwZWxpbmUgJHtwcm9wcy50aXRsZSB8fCBwcm9wcy5waXBlbGluZS5waXBlbGluZU5hbWV9IGhhcyBmYWlsZWQgc3RhZ2VzYCxcbiAgICAgIG1ldHJpYzogbmV3IGNsb3Vkd2F0Y2guTWV0cmljKHtcbiAgICAgICAgbWV0cmljTmFtZTogcHJvcHMuZmFpbHVyZU1ldHJpY05hbWUsXG4gICAgICAgIG5hbWVzcGFjZTogcHJvcHMubWV0cmljTmFtZXNwYWNlLFxuICAgICAgICBzdGF0aXN0aWM6IGNsb3Vkd2F0Y2guU3RhdGlzdGljLk1BWElNVU0sXG4gICAgICAgIGRpbWVuc2lvbnNNYXA6IHtcbiAgICAgICAgICBQaXBlbGluZTogcHJvcHMucGlwZWxpbmUucGlwZWxpbmVOYW1lLFxuICAgICAgICB9LFxuICAgICAgfSksXG4gICAgICB0aHJlc2hvbGQ6IDEsXG4gICAgICBjb21wYXJpc29uT3BlcmF0b3I6IGNsb3Vkd2F0Y2guQ29tcGFyaXNvbk9wZXJhdG9yLkdSRUFURVJfVEhBTl9PUl9FUVVBTF9UT19USFJFU0hPTEQsXG4gICAgICBldmFsdWF0aW9uUGVyaW9kczogMSxcbiAgICAgIC8vIElHTk9SRSBtaXNzaW5nIGRhdGEsIHNvIHRoZSBhbGFybSBzdGF5cyBpbiBpdHMgY3VycmVudCBzdGF0ZSwgdW50aWwgdGhlIG5leHQgZGF0YSBwb2ludC5cbiAgICAgIHRyZWF0TWlzc2luZ0RhdGE6IGNsb3Vkd2F0Y2guVHJlYXRNaXNzaW5nRGF0YS5JR05PUkUsXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import * as path from 'path';
|
|
2
2
|
import {
|
|
3
|
-
Construct,
|
|
4
3
|
aws_cloudwatch as cloudwatch,
|
|
5
4
|
aws_codepipeline as cpipeline,
|
|
6
5
|
aws_events as events,
|
|
7
6
|
aws_events_targets as events_targets,
|
|
8
7
|
aws_iam as iam,
|
|
9
8
|
aws_lambda as lambda,
|
|
10
|
-
} from '
|
|
9
|
+
} from 'aws-cdk-lib';
|
|
10
|
+
import { Construct } from 'constructs';
|
|
11
11
|
|
|
12
12
|
export interface PipelineWatcherProps {
|
|
13
13
|
/**
|
|
@@ -92,7 +92,7 @@ export class PipelineWatcher extends Construct {
|
|
|
92
92
|
metricName: props.failureMetricName,
|
|
93
93
|
namespace: props.metricNamespace,
|
|
94
94
|
statistic: cloudwatch.Statistic.MAXIMUM,
|
|
95
|
-
|
|
95
|
+
dimensionsMap: {
|
|
96
96
|
Pipeline: props.pipeline.pipelineName,
|
|
97
97
|
},
|
|
98
98
|
}),
|
package/lib/pipeline.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Duration, aws_cloudwatch as cloudwatch, aws_codebuild as cbuild, aws_codepipeline as cpipeline, aws_codepipeline_actions as cpipeline_actions, aws_iam as iam, aws_s3 as s3 } from 'aws-cdk-lib';
|
|
2
|
+
import { Construct, IConstruct } from 'constructs';
|
|
2
3
|
import { AutoBuild, AutoBuildOptions } from './auto-build';
|
|
3
4
|
import { Canary, CanaryProps } from './canary';
|
|
4
5
|
import { ChangeController } from './change-controller';
|