SelfMutate 阶段因 CodePipeline 而失败

问题描述 投票:0回答:1

我正在尝试使用 CDK 管道以及 Java 中的导入

software.amazon.awscdk.pipelines.CodePipeline
创建 CI/CD。 该管道创建另一个名为 xxxJavaxxxStack 的堆栈。 管道能够连接到外部 github,当检测到更改时,会触发管道。

在班级

xxxPipelinexxxApp.java
中,我将两个堆栈称为
xxxJavaxxxStack
xxxPipelinexxxStack
。我已经成功地能够分别 cdk 合成器cdk 分别部署

这会创建 2 个不同的 cloudformation 模板,它还会创建管道和前两个阶段。 然而,管道在SelfMutate阶段失败。

管道阶段是:

  • 来源 - 成功
  • 构建 - 成功
    • 合成器 - 成功
  • 自我变异 - 失败

错误:

Error: No stacks match the name(s) xxxPipelinexxxStack

at CdkToolkit.validateStacksSelected (/usr/local/lib/node_modules/aws-cdk/lib/cdk-toolkit.ts:545:13)
    at CdkToolkit.selectStacksForDeploy (/usr/local/lib/node_modules/aws-cdk/lib/cdk-toolkit.ts:492:10)
    at CdkToolkit.deploy (/usr/local/lib/node_modules/aws-cdk/lib/cdk-toolkit.ts:120:20)
    at initCommandLine (/usr/local/lib/node_modules/aws-cdk/bin/cdk.ts:267:9)

Command did not exit successfully cdk -a . deploy xxxPipelinexxxStack --require-approval=never --verbose exit status 1
Phase complete: BUILD State: FAILED
Phase context status code: COMMAND_EXECUTION_ERROR Message: Error while executing command: cdk -a . deploy xxxPipelinexxxStack --require-approval=never --verbose. Reason: exit status 1

命令:

sudo cdk bootstrap
结果:

@aws-cdk/core:newStyleStackSynthesis' context set, using new-style bootstrapping  ⏳  Bootstrapping environment aws://xxxxxx729/us-east-1... Trusted accounts for deployment: xxxxxx729 Trusted accounts for lookup: (none) Execution policies: arn:aws:iam::aws:policy/AdministratorAccess  Environment aws://xxxxxx729/us-east-1 bootstrapped (no changes).

应用程序代码 -


public class xxxxPipelinexxxApp {
    public static void main(final String[] args) {
        App app = new App();
        final xxxJavaxxxStack javaStack = new xxxJavaxxxStack(
            app,
            "xxxJavaxxxStack",
            StackProps.builder()
                .env(
                    new Environment.Builder()
                        .account("xxxxxx5729")
                        .region("us-east-1")
                        .build()
                )
                .build()
        );
        final xxxPipelinexxxStack pipelineStack = new xxxPipelinexxxStack(
                app,
                "xxxPipelinexxxStack",
                StackProps.builder()
                    .env(
                        new Environment.Builder()
                            .account("xxxxxx5729")
                            .region("us-east-1")
                            .build()
                    )
                    .build()
        );
        app.synth();
    }
}

堆栈代码-

public class xxxPipelinexxxStack extends Stack {
    public xxxPipelinexxxStack(final Construct scope, final String id) {
        this(scope, id, null);
    }

    public xxxPipelinexxxStack(final Construct scope, final String id, final StackProps props) {
        super(scope, id, props);
        CodePipeline pipeline = CodePipeline.Builder
                .create(this, "pipeline")
                .pipelineName("xxxPipelineXXX")
                .synth(
                        ShellStep.Builder.create("Synth")
                            .input(
                                    CodePipelineSource.connection("<git-owner>/<git-repo>", "main",
                                        ConnectionSourceOptions.builder().connectionArn("<git-repo-connection-arn>").build()
                                    )
                            )
                            .commands(
                                    Arrays.asList("mvn clean install", "npx cdk synth")
                            ).build()
                ).build();
        final xxxPipelineXXXStage deploy = new xxxPipelineXXXStage(this, "Deploy");
        pipeline.addStage(deploy);
    }
}

P.S:我使用与 root 用户不同的 IAM 用户进行部署,因为尝试使用 root 用户部署管道时显然存在问题。

非常感谢任何帮助。

java amazon-web-services aws-cdk aws-codepipeline aws-codebuild
1个回答
1
投票

问题的存在是因为我使用了 2 个不同的 github 存储库 (repos)。第一个是

xxxJava
存储库,其中包含
xxxJavaxxxApp.java
xxxJavaxxxStack.java
类以及其他必要的文件。 第二个是一个
xxxPipeline
存储库,其中包含
xxxPipelinexxxApp.java
xxxPipelinexxxStack.java
以及其他必要的文件。

最初,我在

git-repo
中使用 xxxJava 存储库作为代码
<git-owner>/<git-repo>
是错误的,该代码是 synthesising
xxxJavaxxxStack
并且管道期望
xxxPipelinexxxStack
来部署它。 解决方案是在创建与 github 的连接时添加管道存储库。 由于该阶段无法找到该堆栈,因此它在“selfmutate”阶段失败。

当 @gshpychka 提到将

cdk ls
添加到我的 synth 步骤以查看哪些堆栈正在合成时,我发现了黄金!
commands(Arrays.asList("mvn clean install", "npx cdk synth", "npx cdk ls"))

要记住的一点 - 直到“selfmutate”阶段,管道相关的更改得到部署,之后添加的任何阶段,实际的堆栈/AWS服务得到部署。

© www.soinside.com 2019 - 2024. All rights reserved.