You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AWS CDK V2:CodePipeline多微服务仓库部署目录结构问题求助

多微服务场景下CodePipeline+CodeBuild实现CDK部署的目录结构问题

我正尝试用CodePipeline和CodeBuild实现CDK部署,GitHub仓库包含/microservice1、/microservice2两个微服务项目。卡了很久,想问问有没有人遇到过类似问题。

我的CDK代码如下:

const pipeline = new CodePipeline(this, `${id}-code-pipline`, {        
  pipelineName: `${id}-code-pipline`,       
  role,                                    
  synth: new ShellStep(`${id}-code-pipeline-synth`, {
    input: CodePipelineSource.gitHub('joeMama123/stupid', 'master', {
      authentication:  SecretValue.secretsManager('stackoverflow', {
        jsonField: "WHY_AWS_DO_THIS_TO_ME_ON_EVERY_NEW_SERVICE_I_USE"
      }),            
    }),           
    env: {
      stage: "dev",
    },                    
    commands: [            
      'cd microservice1 && npm ci && npx cdk synth',
      'cd microservice2 && npm ci && npx cdk synth',                         
    ],
    primaryOutputDirectory: '', // 这里需要指定多个输出目录?
  }),            
});

问题:Shell执行命令时无法保留初始GitHub检出的目录结构,第一个命令执行后目录似乎消失,没法切换到另一个微服务执行构建合成。想知道怎么保留目录结构,实现单个流水线里对多个微服务分别执行构建、合成并部署。


解决办法

1. 修正命令的目录切换逻辑

每个微服务的操作要么从根目录出发,要么执行完后切回根目录,避免目录上下文错乱:

# 执行完microservice1的操作后切回根目录
cd microservice1 && npm ci && npx cdk synth && cd ..
# 再从根目录进入microservice2执行操作
cd microservice2 && npm ci && npx cdk synth && cd ..

更稳妥的是用--prefix参数直接指定工作目录,不需要切换目录:

npm ci --prefix microservice1
npx cdk synth --app "npx ts-node microservice1/bin/app.ts"
npm ci --prefix microservice2
npx cdk synth --app "npx ts-node microservice2/bin/app.ts"

2. 统一合成产物输出目录

CodePipeline的Synth步骤需要明确的主输出目录,不能留空。可以把每个微服务的合成产物统一放到一个目录下,方便后续部署步骤读取:

# 处理microservice1,指定合成产物输出到根目录的cdk.out/microservice1
npm ci --prefix microservice1
npx cdk synth --app "npx ts-node microservice1/bin/app.ts" -o cdk.out/microservice1

# 处理microservice2,同理输出到cdk.out/microservice2
npm ci --prefix microservice2
npx cdk synth --app "npx ts-node microservice2/bin/app.ts" -o cdk.out/microservice2

然后设置primaryOutputDirectory: 'cdk.out',让流水线能读取到所有微服务的合成结果。

3. 拆分部署阶段

在Synth步骤完成所有微服务的合成后,给每个微服务单独添加部署阶段,实现独立部署:

const pipeline = new CodePipeline(this, `${id}-code-pipeline`, {
  pipelineName: `${id}-code-pipeline`,
  role,
  synth: new ShellStep(`${id}-code-pipeline-synth`, {
    input: CodePipelineSource.gitHub('joeMama123/stupid', 'master', {
      authentication: SecretValue.secretsManager('stackoverflow', {
        jsonField: "WHY_AWS_DO_THIS_TO_ME_ON_EVERY_NEW_SERVICE_I_USE"
      }),
    }),
    env: { stage: "dev" },
    commands: [
      'npm ci --prefix microservice1',
      'npm ci --prefix microservice2',
      'npx cdk synth --app "npx ts-node microservice1/bin/app.ts" -o cdk.out/microservice1',
      'npx cdk synth --app "npx ts-node microservice2/bin/app.ts" -o cdk.out/microservice2',
    ],
    primaryOutputDirectory: 'cdk.out',
  }),
});

// 添加microservice1的部署阶段
pipeline.addStage(new Microservice1Stage(this, 'Microservice1Dev', { 
  stage: 'dev',
  cloudAssemblyFileSet: pipeline.synthOutput.atPath('microservice1')
}));

// 添加microservice2的部署阶段
pipeline.addStage(new Microservice2Stage(this, 'Microservice2Dev', { 
  stage: 'dev',
  cloudAssemblyFileSet: pipeline.synthOutput.atPath('microservice2')
}));

内容的提问来源于stack exchange,提问作者joker1979

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 14:40:48