Skip to content

Commit 3b8979f

Browse files
committed
fix(deploy): pass stack selection to diff and deploy for --target filtering (#980)
1 parent ec92d3f commit 3b8979f

2 files changed

Lines changed: 75 additions & 19 deletions

File tree

src/cli/commands/deploy/__tests__/deploy.test.ts

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
import { runCLI } from '../../../../test-utils/index.js';
2+
import { runDeploy, runDiff } from '../actions.js';
3+
import { StackSelectionStrategy } from '@aws-cdk/toolkit-lib';
24
import { randomUUID } from 'node:crypto';
35
import { mkdir, rm, writeFile } from 'node:fs/promises';
46
import { tmpdir } from 'node:os';
@@ -56,3 +58,37 @@ describe('deploy without agents', () => {
5658
expect(json.error.toLowerCase()).toContain('no resources defined');
5759
});
5860
});
61+
62+
describe('runDiff', () => {
63+
it('passes stack selection pattern to toolkit wrapper diff', async () => {
64+
let captured: unknown;
65+
const fakeWrapper = {
66+
diff: (opts?: unknown) => {
67+
captured = opts;
68+
},
69+
};
70+
71+
await runDiff(fakeWrapper as any, 'prod');
72+
73+
expect(captured).toEqual({
74+
stacks: { strategy: StackSelectionStrategy.PATTERN_MUST_MATCH, patterns: ['*-prod'] },
75+
});
76+
});
77+
});
78+
79+
describe('runDeploy', () => {
80+
it('passes stack selection pattern to toolkit wrapper deploy', async () => {
81+
let captured: unknown;
82+
const fakeWrapper = {
83+
deploy: (opts?: unknown) => {
84+
captured = opts;
85+
},
86+
};
87+
88+
await runDeploy(fakeWrapper as any, 'prod');
89+
90+
expect(captured).toEqual({
91+
stacks: { strategy: StackSelectionStrategy.PATTERN_MUST_MATCH, patterns: ['*-prod'] },
92+
});
93+
});
94+
});

src/cli/commands/deploy/actions.ts

Lines changed: 39 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@ import { ConfigIO, SecureCredentials } from '../../../lib';
22
import type { AgentCoreMcpSpec, DeployedState } from '../../../schema';
33
import { applyTargetRegionToEnv } from '../../aws';
44
import { validateAwsCredentials } from '../../aws/account';
5-
import { createSwitchableIoHost } from '../../cdk/toolkit-lib';
5+
import { CdkToolkitWrapper, createSwitchableIoHost } from '../../cdk/toolkit-lib';
6+
import type { SwitchableIoHost } from '../../cdk/toolkit-lib';
67
import {
78
buildDeployedState,
89
getStackOutputs,
@@ -41,6 +42,7 @@ import {
4142
import { setupHttpGateways } from '../../operations/deploy/post-deploy-http-gateways';
4243
import { enableOnlineEvalConfigs } from '../../operations/deploy/post-deploy-online-evals';
4344
import type { DeployResult } from './types';
45+
import { StackSelectionStrategy } from '@aws-cdk/toolkit-lib';
4446

4547
export interface ValidatedDeployOptions {
4648
target: string;
@@ -55,6 +57,40 @@ export interface ValidatedDeployOptions {
5557
const AGENT_NEXT_STEPS = ['agentcore invoke', 'agentcore status'];
5658
const MEMORY_ONLY_NEXT_STEPS = ['agentcore add agent', 'agentcore status'];
5759

60+
export async function runDiff(
61+
toolkitWrapper: CdkToolkitWrapper,
62+
targetName: string,
63+
switchableIoHost?: SwitchableIoHost
64+
): Promise<void> {
65+
const diffIoHost = switchableIoHost ?? createSwitchableIoHost();
66+
let hasDiffContent = false;
67+
diffIoHost.setOnRawMessage((code, _level, message) => {
68+
if (!message) return;
69+
// I4002: formatted diff per stack, I4001: overall diff summary
70+
if (code === 'CDK_TOOLKIT_I4002' || code === 'CDK_TOOLKIT_I4001') {
71+
hasDiffContent = true;
72+
console.log(message);
73+
}
74+
});
75+
diffIoHost.setVerbose(true);
76+
// Stack names end with the target name — see src/assets/cdk/bin/cdk.ts toStackName()
77+
await toolkitWrapper.diff({
78+
stacks: { strategy: StackSelectionStrategy.PATTERN_MUST_MATCH, patterns: [`*-${targetName}`] },
79+
});
80+
if (!hasDiffContent) {
81+
console.log('No stack differences detected.');
82+
}
83+
diffIoHost.setVerbose(false);
84+
diffIoHost.setOnRawMessage(null);
85+
}
86+
87+
export async function runDeploy(toolkitWrapper: CdkToolkitWrapper, targetName: string): Promise<void> {
88+
// Stack names end with the target name — see src/assets/cdk/bin/cdk.ts toStackName()
89+
await toolkitWrapper.deploy({
90+
stacks: { strategy: StackSelectionStrategy.PATTERN_MUST_MATCH, patterns: [`*-${targetName}`] },
91+
});
92+
}
93+
5894
export async function handleDeploy(options: ValidatedDeployOptions): Promise<DeployResult> {
5995
let toolkitWrapper = null;
6096
let restoreEnv: (() => void) | null = null;
@@ -296,23 +332,7 @@ export async function handleDeploy(options: ValidatedDeployOptions): Promise<Dep
296332
// Diff mode: run cdk diff and exit without deploying
297333
if (options.diff) {
298334
startStep('Run CDK diff');
299-
const diffIoHost = switchableIoHost ?? createSwitchableIoHost();
300-
let hasDiffContent = false;
301-
diffIoHost.setOnRawMessage((code, _level, message) => {
302-
if (!message) return;
303-
// I4002: formatted diff per stack, I4001: overall diff summary
304-
if (code === 'CDK_TOOLKIT_I4002' || code === 'CDK_TOOLKIT_I4001') {
305-
hasDiffContent = true;
306-
console.log(message);
307-
}
308-
});
309-
diffIoHost.setVerbose(true);
310-
await toolkitWrapper.diff();
311-
if (!hasDiffContent) {
312-
console.log('No stack differences detected.');
313-
}
314-
diffIoHost.setVerbose(false);
315-
diffIoHost.setOnRawMessage(null);
335+
await runDiff(toolkitWrapper, target.name, switchableIoHost);
316336
endStep('success');
317337

318338
logger.finalize(true);
@@ -339,7 +359,7 @@ export async function handleDeploy(options: ValidatedDeployOptions): Promise<Dep
339359
switchableIoHost.setVerbose(true);
340360
}
341361

342-
await toolkitWrapper.deploy();
362+
await runDeploy(toolkitWrapper, target.name);
343363

344364
// Disable verbose output
345365
if (switchableIoHost) {

0 commit comments

Comments
 (0)