From e7dc40ae365dd193a281105e8e5bad9e38188f63 Mon Sep 17 00:00:00 2001 From: Shiv Lakshminarayan Date: Thu, 6 Aug 2020 11:47:01 -0700 Subject: [PATCH 1/6] wip --- packages/aws-cdk/bin/cdk.ts | 5 ++++- .../aws-cdk/lib/api/cloudformation-deployments.ts | 11 +++++++++++ packages/aws-cdk/lib/api/deploy-stack.ts | 10 ++++++++++ .../util/cloudformation/stack-activity-monitor.ts | 13 ++++++++++++- packages/aws-cdk/lib/cdk-toolkit.ts | 11 +++++++++++ 5 files changed, 48 insertions(+), 2 deletions(-) diff --git a/packages/aws-cdk/bin/cdk.ts b/packages/aws-cdk/bin/cdk.ts index 3fd3dd1170531..6ed3320282348 100644 --- a/packages/aws-cdk/bin/cdk.ts +++ b/packages/aws-cdk/bin/cdk.ts @@ -89,11 +89,13 @@ async function parseCommandLineArguments() { .option('force', { alias: 'f', type: 'boolean', desc: 'Always deploy stack even if templates are identical', default: false }) .option('parameters', { type: 'array', desc: 'Additional parameters passed to CloudFormation at deploy time (STACK:KEY=VALUE)', nargs: 1, requiresArg: true, default: {} }) .option('outputs-file', { type: 'string', alias: 'O', desc: 'Path to file where stack outputs will be written as JSON', requiresArg: true }) - .option('previous-parameters', { type: 'boolean', default: true, desc: 'Use previous values for existing parameters (you must specify all parameters on every deployment if this is disabled)' }), + .option('previous-parameters', { type: 'boolean', default: true, desc: 'Use previous values for existing parameters (you must specify all parameters on every deployment if this is disabled)' }) + .option('trunc', { type: 'boolean', desc: 'Display only stack activity events for the resource currently being updated', default: false}), ) .command('destroy [STACKS..]', 'Destroy the stack(s) named STACKS', yargs => yargs .option('exclusively', { type: 'boolean', alias: 'e', desc: 'Only destroy requested stacks, don\'t include dependees' }) .option('force', { type: 'boolean', alias: 'f', desc: 'Do not ask for confirmation before destroying the stacks' })) + .option('trunc', { type: 'boolean', desc: 'Display only stack activity events for the resource currently being updated', default: false}) .command('diff [STACKS..]', 'Compares the specified stack with the deployed stack or a local template file, and returns with status 1 if any difference is found', yargs => yargs .option('exclusively', { type: 'boolean', alias: 'e', desc: 'Only diff requested stacks, don\'t include dependencies' }) .option('context-lines', { type: 'number', desc: 'Number of context lines to include in arbitrary JSON diff rendering', default: 3, requiresArg: true }) @@ -279,6 +281,7 @@ async function initCommandLine() { parameters: parameterMap, usePreviousParameters: args['previous-parameters'], outputsFile: args.outputsFile, + trunc: args.trunc, }); case 'destroy': diff --git a/packages/aws-cdk/lib/api/cloudformation-deployments.ts b/packages/aws-cdk/lib/api/cloudformation-deployments.ts index 0ee09812629c9..1bb0e9e636cb3 100644 --- a/packages/aws-cdk/lib/api/cloudformation-deployments.ts +++ b/packages/aws-cdk/lib/api/cloudformation-deployments.ts @@ -88,6 +88,16 @@ export interface DeployStackOptions { * @default true */ usePreviousParameters?: boolean; + + /** + * Whether to truncate stack events to display only the + * resource currently being deployed + * + * If not set, the stack history with all stack events will be displayed + * + * @default false + */ + trunc?: boolean; } export interface DestroyStackOptions { @@ -156,6 +166,7 @@ export class CloudFormationDeployments { force: options.force, parameters: options.parameters, usePreviousParameters: options.usePreviousParameters, + trunc: options.trunc, }); } diff --git a/packages/aws-cdk/lib/api/deploy-stack.ts b/packages/aws-cdk/lib/api/deploy-stack.ts index b0090ec1770e9..e3cbcf6248165 100644 --- a/packages/aws-cdk/lib/api/deploy-stack.ts +++ b/packages/aws-cdk/lib/api/deploy-stack.ts @@ -153,6 +153,16 @@ export interface DeployStackOptions { */ usePreviousParameters?: boolean; + /** + * Whether to truncate stack events to display only the + * resource currently being deployed + * + * If not set, the stack history with all stack events will be displayed + * + * @default false + */ + trunc?: boolean; + /** * Deploy even if the deployed template is identical to the one we are about to deploy. * @default false diff --git a/packages/aws-cdk/lib/api/util/cloudformation/stack-activity-monitor.ts b/packages/aws-cdk/lib/api/util/cloudformation/stack-activity-monitor.ts index 49025b9c8df60..7802f0f50d8b6 100644 --- a/packages/aws-cdk/lib/api/util/cloudformation/stack-activity-monitor.ts +++ b/packages/aws-cdk/lib/api/util/cloudformation/stack-activity-monitor.ts @@ -35,6 +35,16 @@ export interface StackActivityMonitorProps { * @default - Use value from logging.logLevel */ readonly logLevel?: LogLevel; + + /** + * Whether to truncate stack events to display only the + * resource currently being deployed + * + * If not set, the stack history with all stack events will be displayed + * + * @default false + */ + trunc?: boolean; } export class StackActivityMonitor { @@ -80,8 +90,9 @@ export class StackActivityMonitor { const isWindows = process.platform === 'win32'; const verbose = options.logLevel ?? logLevel; const fancyOutputAvailable = !isWindows && stream.isTTY; + const trunc = options.trunc ?? false; - this.printer = fancyOutputAvailable && !verbose + this.printer = fancyOutputAvailable && !trunc && !verbose ? new CurrentActivityPrinter(props) : new HistoryActivityPrinter(props); } diff --git a/packages/aws-cdk/lib/cdk-toolkit.ts b/packages/aws-cdk/lib/cdk-toolkit.ts index 14071b05a0833..99e811976ea1b 100644 --- a/packages/aws-cdk/lib/cdk-toolkit.ts +++ b/packages/aws-cdk/lib/cdk-toolkit.ts @@ -190,6 +190,7 @@ export class CdkToolkit { force: options.force, parameters: Object.assign({}, parameterMap['*'], parameterMap[stack.stackName]), usePreviousParameters: options.usePreviousParameters, + trunc: options.trunc, }); const message = result.noOp @@ -578,6 +579,16 @@ export interface DeployOptions { */ usePreviousParameters?: boolean; + /** + * Whether to truncate stack events to display only the + * resource currently being deployed + * + * If not set, the stack history with all stack events will be displayed + * + * @default false + */ + trunc?: boolean; + /** * Path to file where stack outputs will be written after a successful deploy as JSON * @default - Outputs are not written to any file From c4d34872f001c419da5c33c946fc84e74a1d4789 Mon Sep 17 00:00:00 2001 From: Shiv Lakshminarayan Date: Wed, 12 Aug 2020 01:36:02 -0700 Subject: [PATCH 2/6] feat(cli): add a switch to display all stack events closes #8696 --- packages/aws-cdk/bin/cdk.ts | 5 ++--- packages/aws-cdk/lib/api/cloudformation-deployments.ts | 6 +++--- packages/aws-cdk/lib/api/deploy-stack.ts | 5 +++-- .../lib/api/util/cloudformation/stack-activity-monitor.ts | 8 ++++---- packages/aws-cdk/lib/cdk-toolkit.ts | 6 +++--- 5 files changed, 15 insertions(+), 15 deletions(-) diff --git a/packages/aws-cdk/bin/cdk.ts b/packages/aws-cdk/bin/cdk.ts index 6ed3320282348..57e3db6938dd2 100644 --- a/packages/aws-cdk/bin/cdk.ts +++ b/packages/aws-cdk/bin/cdk.ts @@ -90,12 +90,11 @@ async function parseCommandLineArguments() { .option('parameters', { type: 'array', desc: 'Additional parameters passed to CloudFormation at deploy time (STACK:KEY=VALUE)', nargs: 1, requiresArg: true, default: {} }) .option('outputs-file', { type: 'string', alias: 'O', desc: 'Path to file where stack outputs will be written as JSON', requiresArg: true }) .option('previous-parameters', { type: 'boolean', default: true, desc: 'Use previous values for existing parameters (you must specify all parameters on every deployment if this is disabled)' }) - .option('trunc', { type: 'boolean', desc: 'Display only stack activity events for the resource currently being updated', default: false}), + .option('all-events', { type: 'boolean', desc: 'Display all stack activity events. Default setting displays events for the resource currently being updated', default: false}), ) .command('destroy [STACKS..]', 'Destroy the stack(s) named STACKS', yargs => yargs .option('exclusively', { type: 'boolean', alias: 'e', desc: 'Only destroy requested stacks, don\'t include dependees' }) .option('force', { type: 'boolean', alias: 'f', desc: 'Do not ask for confirmation before destroying the stacks' })) - .option('trunc', { type: 'boolean', desc: 'Display only stack activity events for the resource currently being updated', default: false}) .command('diff [STACKS..]', 'Compares the specified stack with the deployed stack or a local template file, and returns with status 1 if any difference is found', yargs => yargs .option('exclusively', { type: 'boolean', alias: 'e', desc: 'Only diff requested stacks, don\'t include dependencies' }) .option('context-lines', { type: 'number', desc: 'Number of context lines to include in arbitrary JSON diff rendering', default: 3, requiresArg: true }) @@ -281,7 +280,7 @@ async function initCommandLine() { parameters: parameterMap, usePreviousParameters: args['previous-parameters'], outputsFile: args.outputsFile, - trunc: args.trunc, + allEvents: args.allEvents, }); case 'destroy': diff --git a/packages/aws-cdk/lib/api/cloudformation-deployments.ts b/packages/aws-cdk/lib/api/cloudformation-deployments.ts index 1bb0e9e636cb3..b7d4218212710 100644 --- a/packages/aws-cdk/lib/api/cloudformation-deployments.ts +++ b/packages/aws-cdk/lib/api/cloudformation-deployments.ts @@ -90,14 +90,14 @@ export interface DeployStackOptions { usePreviousParameters?: boolean; /** - * Whether to truncate stack events to display only the + * Whether to display all stack events or to display only the events for the * resource currently being deployed * * If not set, the stack history with all stack events will be displayed * * @default false */ - trunc?: boolean; + allEvents?: boolean; } export interface DestroyStackOptions { @@ -166,7 +166,7 @@ export class CloudFormationDeployments { force: options.force, parameters: options.parameters, usePreviousParameters: options.usePreviousParameters, - trunc: options.trunc, + allEvents: options.allEvents, }); } diff --git a/packages/aws-cdk/lib/api/deploy-stack.ts b/packages/aws-cdk/lib/api/deploy-stack.ts index e3cbcf6248165..c0801f3cf8a9e 100644 --- a/packages/aws-cdk/lib/api/deploy-stack.ts +++ b/packages/aws-cdk/lib/api/deploy-stack.ts @@ -154,14 +154,14 @@ export interface DeployStackOptions { usePreviousParameters?: boolean; /** - * Whether to truncate stack events to display only the + * Whether to display all stack events or to display only the events for the * resource currently being deployed * * If not set, the stack history with all stack events will be displayed * * @default false */ - trunc?: boolean; + allEvents?: boolean; /** * Deploy even if the deployed template is identical to the one we are about to deploy. @@ -270,6 +270,7 @@ export async function deployStack(options: DeployStackOptions): Promise Date: Thu, 27 Aug 2020 00:07:23 -0700 Subject: [PATCH 3/6] change option from all-events to progress so display modes can be added in the future for stack deplyoments --- packages/aws-cdk/bin/cdk.ts | 5 +++-- .../lib/api/cloudformation-deployments.ts | 17 +++++++-------- packages/aws-cdk/lib/api/deploy-stack.ts | 14 ++++++------- .../cloudformation/stack-activity-monitor.ts | 21 ++++++++++++++++--- packages/aws-cdk/lib/cdk-toolkit.ts | 13 ++++++------ packages/aws-cdk/lib/settings.ts | 1 + 6 files changed, 42 insertions(+), 29 deletions(-) diff --git a/packages/aws-cdk/bin/cdk.ts b/packages/aws-cdk/bin/cdk.ts index 57e3db6938dd2..d874758e24a08 100644 --- a/packages/aws-cdk/bin/cdk.ts +++ b/packages/aws-cdk/bin/cdk.ts @@ -10,6 +10,7 @@ import { SdkProvider } from '../lib/api/aws-auth'; import { CloudFormationDeployments } from '../lib/api/cloudformation-deployments'; import { CloudExecutable } from '../lib/api/cxapp/cloud-executable'; import { execProgram } from '../lib/api/cxapp/exec'; +import { StackActivityProgress } from '../lib/api/util/cloudformation/stack-activity-monitor'; import { CdkToolkit } from '../lib/cdk-toolkit'; import { RequireApproval } from '../lib/diff'; import { availableInitLanguages, cliInit, printAvailableTemplates } from '../lib/init'; @@ -90,7 +91,7 @@ async function parseCommandLineArguments() { .option('parameters', { type: 'array', desc: 'Additional parameters passed to CloudFormation at deploy time (STACK:KEY=VALUE)', nargs: 1, requiresArg: true, default: {} }) .option('outputs-file', { type: 'string', alias: 'O', desc: 'Path to file where stack outputs will be written as JSON', requiresArg: true }) .option('previous-parameters', { type: 'boolean', default: true, desc: 'Use previous values for existing parameters (you must specify all parameters on every deployment if this is disabled)' }) - .option('all-events', { type: 'boolean', desc: 'Display all stack activity events. Default setting displays events for the resource currently being updated', default: false}), + .option('progress', { type: 'string', choices: [StackActivityProgress.Bar, StackActivityProgress.Events], desc: 'Display mode for stack activity events.', default: StackActivityProgress.Bar }), ) .command('destroy [STACKS..]', 'Destroy the stack(s) named STACKS', yargs => yargs .option('exclusively', { type: 'boolean', alias: 'e', desc: 'Only destroy requested stacks, don\'t include dependees' }) @@ -280,7 +281,7 @@ async function initCommandLine() { parameters: parameterMap, usePreviousParameters: args['previous-parameters'], outputsFile: args.outputsFile, - allEvents: args.allEvents, + progress: configuration.settings.get(['progress']), }); case 'destroy': diff --git a/packages/aws-cdk/lib/api/cloudformation-deployments.ts b/packages/aws-cdk/lib/api/cloudformation-deployments.ts index b7d4218212710..3e3b5cb50c4a3 100644 --- a/packages/aws-cdk/lib/api/cloudformation-deployments.ts +++ b/packages/aws-cdk/lib/api/cloudformation-deployments.ts @@ -7,6 +7,7 @@ import { Mode, SdkProvider } from './aws-auth'; import { deployStack, DeployStackResult, destroyStack } from './deploy-stack'; import { ToolkitInfo } from './toolkit-info'; import { CloudFormationStack, Template } from './util/cloudformation'; +import { StackActivityProgress } from './util/cloudformation/stack-activity-monitor'; export interface DeployStackOptions { /** @@ -90,14 +91,12 @@ export interface DeployStackOptions { usePreviousParameters?: boolean; /** - * Whether to display all stack events or to display only the events for the - * resource currently being deployed - * - * If not set, the stack history with all stack events will be displayed - * - * @default false - */ - allEvents?: boolean; + * Display mode for stack deployment progress. + * + * @default - StackActivityProgress.Bar - stack events will be displayed for + * the resource currently being deployed. + */ + progress?: StackActivityProgress; } export interface DestroyStackOptions { @@ -166,7 +165,7 @@ export class CloudFormationDeployments { force: options.force, parameters: options.parameters, usePreviousParameters: options.usePreviousParameters, - allEvents: options.allEvents, + progress: options.progress, }); } diff --git a/packages/aws-cdk/lib/api/deploy-stack.ts b/packages/aws-cdk/lib/api/deploy-stack.ts index c0801f3cf8a9e..a5faa3b6d4091 100644 --- a/packages/aws-cdk/lib/api/deploy-stack.ts +++ b/packages/aws-cdk/lib/api/deploy-stack.ts @@ -11,7 +11,7 @@ import { contentHash } from '../util/content-hash'; import { ISDK, SdkProvider } from './aws-auth'; import { ToolkitInfo } from './toolkit-info'; import { changeSetHasNoChanges, CloudFormationStack, StackParameters, TemplateParameters, waitForChangeSet, waitForStackDeploy, waitForStackDelete } from './util/cloudformation'; -import { StackActivityMonitor } from './util/cloudformation/stack-activity-monitor'; +import { StackActivityMonitor, StackActivityProgress } from './util/cloudformation/stack-activity-monitor'; // We need to map regions to domain suffixes, and the SDK already has a function to do this. // It's not part of the public API, but it's also unlikely to go away. @@ -154,14 +154,12 @@ export interface DeployStackOptions { usePreviousParameters?: boolean; /** - * Whether to display all stack events or to display only the events for the - * resource currently being deployed + * Display mode for stack deployment progress. * - * If not set, the stack history with all stack events will be displayed - * - * @default false + * @default StackActivityProgress.Bar stack events will be displayed for + * the resource currently being deployed. */ - allEvents?: boolean; + progress?: StackActivityProgress; /** * Deploy even if the deployed template is identical to the one we are about to deploy. @@ -270,7 +268,7 @@ export async function deployStack(options: DeployStackOptions): Promise Date: Thu, 27 Aug 2020 03:03:06 -0700 Subject: [PATCH 4/6] resolve merge conflicts --- packages/aws-cdk/bin/cdk.ts | 2 +- .../lib/api/util/cloudformation/stack-activity-monitor.ts | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/aws-cdk/bin/cdk.ts b/packages/aws-cdk/bin/cdk.ts index 5332fea43be95..3a7214f6ff70a 100644 --- a/packages/aws-cdk/bin/cdk.ts +++ b/packages/aws-cdk/bin/cdk.ts @@ -91,7 +91,7 @@ async function parseCommandLineArguments() { .option('parameters', { type: 'array', desc: 'Additional parameters passed to CloudFormation at deploy time (STACK:KEY=VALUE)', nargs: 1, requiresArg: true, default: {} }) .option('outputs-file', { type: 'string', alias: 'O', desc: 'Path to file where stack outputs will be written as JSON', requiresArg: true }) .option('previous-parameters', { type: 'boolean', default: true, desc: 'Use previous values for existing parameters (you must specify all parameters on every deployment if this is disabled)' }) - .option('progress', { type: 'string', choices: [StackActivityProgress.Bar, StackActivityProgress.Events], desc: 'Display mode for stack activity events.', default: StackActivityProgress.Bar }), + .option('progress', { type: 'string', choices: [StackActivityProgress.Bar, StackActivityProgress.Events], desc: 'Display mode for stack activity events.' }), ) .command('destroy [STACKS..]', 'Destroy the stack(s) named STACKS', yargs => yargs .option('exclusively', { type: 'boolean', alias: 'e', desc: 'Only destroy requested stacks, don\'t include dependees' }) diff --git a/packages/aws-cdk/lib/api/util/cloudformation/stack-activity-monitor.ts b/packages/aws-cdk/lib/api/util/cloudformation/stack-activity-monitor.ts index 8e76155bddca5..db7ece436d98f 100644 --- a/packages/aws-cdk/lib/api/util/cloudformation/stack-activity-monitor.ts +++ b/packages/aws-cdk/lib/api/util/cloudformation/stack-activity-monitor.ts @@ -106,8 +106,9 @@ export class StackActivityMonitor { // need an individual check for whether we're running on CI. // see: https://discuss.circleci.com/t/circleci-terminal-is-a-tty-but-term-is-not-set/9965 const fancyOutputAvailable = !isWindows && stream.isTTY && !options.ci; + const progress = options.progress ?? StackActivityProgress.Bar; - const printer = fancyOutputAvailable && !verbose + const printer = fancyOutputAvailable && !verbose && (progress === StackActivityProgress.Bar) ? new CurrentActivityPrinter(props) : new HistoryActivityPrinter(props); From 96ecb77b61a7caefa0bfef2b63796caddb914eeb Mon Sep 17 00:00:00 2001 From: Shiv Lakshminarayan Date: Thu, 27 Aug 2020 03:05:00 -0700 Subject: [PATCH 5/6] update enum values to be ALL_CAPS --- packages/aws-cdk/bin/cdk.ts | 2 +- .../lib/api/util/cloudformation/stack-activity-monitor.ts | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/aws-cdk/bin/cdk.ts b/packages/aws-cdk/bin/cdk.ts index 3a7214f6ff70a..d1b0418a86c4a 100644 --- a/packages/aws-cdk/bin/cdk.ts +++ b/packages/aws-cdk/bin/cdk.ts @@ -91,7 +91,7 @@ async function parseCommandLineArguments() { .option('parameters', { type: 'array', desc: 'Additional parameters passed to CloudFormation at deploy time (STACK:KEY=VALUE)', nargs: 1, requiresArg: true, default: {} }) .option('outputs-file', { type: 'string', alias: 'O', desc: 'Path to file where stack outputs will be written as JSON', requiresArg: true }) .option('previous-parameters', { type: 'boolean', default: true, desc: 'Use previous values for existing parameters (you must specify all parameters on every deployment if this is disabled)' }) - .option('progress', { type: 'string', choices: [StackActivityProgress.Bar, StackActivityProgress.Events], desc: 'Display mode for stack activity events.' }), + .option('progress', { type: 'string', choices: [StackActivityProgress.BAR, StackActivityProgress.EVENTS], desc: 'Display mode for stack activity events.' }), ) .command('destroy [STACKS..]', 'Destroy the stack(s) named STACKS', yargs => yargs .option('exclusively', { type: 'boolean', alias: 'e', desc: 'Only destroy requested stacks, don\'t include dependees' }) diff --git a/packages/aws-cdk/lib/api/util/cloudformation/stack-activity-monitor.ts b/packages/aws-cdk/lib/api/util/cloudformation/stack-activity-monitor.ts index db7ece436d98f..ad8a21d1ab46b 100644 --- a/packages/aws-cdk/lib/api/util/cloudformation/stack-activity-monitor.ts +++ b/packages/aws-cdk/lib/api/util/cloudformation/stack-activity-monitor.ts @@ -23,12 +23,12 @@ export enum StackActivityProgress { /** * Displays a progress bar with only the events for the resource currently being deployed */ - Bar = 'bar', + BAR = 'bar', /** * Displays complete history with all CloudFormation stack events */ - Events = 'events', + EVENTS = 'events', } export interface WithDefaultPrinterProps { @@ -106,9 +106,9 @@ export class StackActivityMonitor { // need an individual check for whether we're running on CI. // see: https://discuss.circleci.com/t/circleci-terminal-is-a-tty-but-term-is-not-set/9965 const fancyOutputAvailable = !isWindows && stream.isTTY && !options.ci; - const progress = options.progress ?? StackActivityProgress.Bar; + const progress = options.progress ?? StackActivityProgress.BAR; - const printer = fancyOutputAvailable && !verbose && (progress === StackActivityProgress.Bar) + const printer = fancyOutputAvailable && !verbose && (progress === StackActivityProgress.BAR) ? new CurrentActivityPrinter(props) : new HistoryActivityPrinter(props); From 2d926108a9d3ce223985c11f894ff80aeb05ae0b Mon Sep 17 00:00:00 2001 From: Shiv Lakshminarayan Date: Thu, 27 Aug 2020 03:27:28 -0700 Subject: [PATCH 6/6] update README --- packages/aws-cdk/README.md | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/packages/aws-cdk/README.md b/packages/aws-cdk/README.md index 7a4695cf8280c..e6fc465932013 100644 --- a/packages/aws-cdk/README.md +++ b/packages/aws-cdk/README.md @@ -227,6 +227,33 @@ Example `outputs.json` after deployment of multiple stacks } ``` +##### Deployment Progress + +By default, stack deployment events are displayed as a progress bar with the events for the resource +currently being deployed. + +Set the `--progress` flag to request the complete history which includes all CloudFormation events +```console +$ cdk deploy --progress events +``` + +Alternatively, the `progress` key can be specified in the project config (`cdk.json`). + +The following shows a sample `cdk.json` where the `progress` key is set to *events*. +When `cdk deploy` is executed, deployment events will include the complete history. +``` +{ + "app": "npx ts-node bin/myproject.ts", + "context": { + "@aws-cdk/core:enableStackNameDuplicates": "true", + "aws-cdk:enableDiffNoFail": "true", + "@aws-cdk/core:stackRelativeExports": "true" + }, + "progress": "events" +} +``` +The `progress` key can also be specified as a user setting (`~/.cdk.json`) + #### `cdk destroy` Deletes a stack from it's environment. This will cause the resources in the stack to be destroyed (unless they were configured with a `DeletionPolicy` of `Retain`). During the stack destruction, the command will output progress