Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(cli): cdk watch --concurrency #21598

Merged
merged 4 commits into from
Aug 16, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions packages/aws-cdk/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -458,6 +458,15 @@ locally to your terminal. To disable this feature you can pass the `--no-logs` o
$ cdk watch --no-logs
```

You can increase the concurrency by which `watch` will deploy and hotswap
your stacks by specifying `--concurrency N`. `--concurrency` for `watch`
acts the same as `--concurrency` for `deploy`, in that it will deploy or
hotswap your stacks while respecting inter-stack dependencies.

```console
$ cdk watch --concurrency 5
```

**Note**: This command is considered experimental, and might have breaking changes in the future.
The same limitations apply to to `watch` deployments as do to `--hotswap` deployments. See the
*Hotswap deployments for faster development* section for more information.
Expand Down
9 changes: 9 additions & 0 deletions packages/aws-cdk/lib/cdk-toolkit.ts
Original file line number Diff line number Diff line change
Expand Up @@ -737,6 +737,7 @@ export class CdkToolkit {
cacheCloudAssembly: false,
hotswap: hotswap,
extraUserAgent: `cdk-watch/hotswap-${hotswap ? 'on' : 'off'}`,
concurrency: options.concurrency,
};

try {
Expand Down Expand Up @@ -900,6 +901,14 @@ interface WatchOptions extends Omit<CfnDeployOptions, 'execute'> {
* @default - false
*/
readonly traceLogs?: boolean;

/**
* Maximum number of simulatenous deployments (dependency permitting) to execute.
* The default is '1', which executes all deployments serially.
*
* @default 1
*/
readonly concurrency?: number;
}

export interface DeployOptions extends CfnDeployOptions, WatchOptions {
Expand Down
4 changes: 3 additions & 1 deletion packages/aws-cdk/lib/cli.ts
Original file line number Diff line number Diff line change
Expand Up @@ -216,7 +216,8 @@ async function parseCommandLineArguments() {
default: true,
desc: 'Show CloudWatch log events from all resources in the selected Stacks in the terminal. ' +
"'true' by default, use --no-logs to turn off",
}),
})
.option('concurrency', { type: 'number', desc: 'Maximum number of simulatenous deployments (dependency permitting) to execute.', default: 1, requiresArg: true }),
)
.command('destroy [STACKS..]', 'Destroy the stack(s) named STACKS', (yargs: Argv) => yargs
.option('all', { type: 'boolean', default: false, desc: 'Destroy all available stacks' })
Expand Down Expand Up @@ -516,6 +517,7 @@ async function initCommandLine() {
rollback: configuration.settings.get(['rollback']),
hotswap: args.hotswap,
traceLogs: args.logs,
concurrency: args.concurrency,
});

case 'destroy':
Expand Down
12 changes: 12 additions & 0 deletions packages/aws-cdk/test/cdk-toolkit.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -642,6 +642,18 @@ describe('watch', () => {
expect(excludeArgs[1]).toBe('**/my-dir2');
});

test('allows watching with deploy concurrency', async () => {
cloudExecutable.configuration.settings.set(['watch'], {});
const toolkit = defaultToolkitSetup();
const cdkDeployMock = jest.fn();
toolkit.deploy = cdkDeployMock;

await toolkit.watch({ selector: { patterns: [] }, concurrency: 3 });
fakeChokidarWatcherOn.readyCallback();

expect(cdkDeployMock).toBeCalledWith(expect.objectContaining({ concurrency: 3 }));
});

describe('with file change events', () => {
let toolkit: CdkToolkit;
let cdkDeployMock: jest.Mock;
Expand Down