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
相关产品推荐
相关产品推荐

