SelfMutate 阶段因 CodePipeline 而失败
SelfMutate stage failing with CodePipeline
我正在尝试使用 CDK 管道在 Java 中导入 software.amazon.awscdk.pipelines.CodePipeline
创建一个 CI/CD。
此管道创建另一个名为 xxxJavaxxxStack 的堆栈。
管道能够连接到外部 github,当检测到变化时,它会触发管道。
在 class xxxPipelinexxxApp.java
中,我同时调用堆栈 xxxJavaxxxStack
和 xxxPipelinexxxStack
。我已经成功地能够分别 cdk synth 和 cdk deploy 它们。
这会创建 2 个不同的 cloudformation 模板,它还会创建管道并完成前 2 个阶段。
但是,管道在 SelfMutate 阶段失败。
流水线阶段是:
- 来源 - 成功
- 构建 - 成功
- 合成器 - 成功
- 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 用户部署管道时显然存在问题。
非常感谢任何帮助。
问题存在是因为我使用了 2 个不同的 github 存储库 (repos)。第一个是 xxxJava
存储库,其中包含 xxxJavaxxxApp.java
和 xxxJavaxxxStack.java
类 以及其他必要的文件。
第二个是 xxxPipeline
存储库,其中包含 xxxPipelinexxxApp.java
和 xxxPipelinexxxStack.java
以及其他必要的文件。
最初我错误地使用 git-repo 中的 xxxJava
代码 <git-owner>/<git-repo>
代码 合成 xxxJavaxxxStack
并且管道期望 xxxPipelinexxxStack
部署它。
解决方案是在创建与 github 的连接时添加管道存储库。
由于该阶段无法找到此堆栈,因此它在 'selfmutate' 阶段失败。
当@gshpychka 提到要将 cdk ls
添加到我的 synth 步骤以查看哪些堆栈正在合成时,我获得了成功!
commands(Arrays.asList("mvn clean install", "npx cdk synth", "npx cdk ls"))
要记住的一点 - 在 'selfmutate' 阶段之前,管道相关的更改得到部署,之后添加的任何阶段,实际的 stack/AWS-services 得到部署。
我正在尝试使用 CDK 管道在 Java 中导入 software.amazon.awscdk.pipelines.CodePipeline
创建一个 CI/CD。
此管道创建另一个名为 xxxJavaxxxStack 的堆栈。
管道能够连接到外部 github,当检测到变化时,它会触发管道。
在 class xxxPipelinexxxApp.java
中,我同时调用堆栈 xxxJavaxxxStack
和 xxxPipelinexxxStack
。我已经成功地能够分别 cdk synth 和 cdk deploy 它们。
这会创建 2 个不同的 cloudformation 模板,它还会创建管道并完成前 2 个阶段。 但是,管道在 SelfMutate 阶段失败。
流水线阶段是:
- 来源 - 成功
- 构建 - 成功
- 合成器 - 成功
- 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 用户部署管道时显然存在问题。
非常感谢任何帮助。
问题存在是因为我使用了 2 个不同的 github 存储库 (repos)。第一个是 xxxJava
存储库,其中包含 xxxJavaxxxApp.java
和 xxxJavaxxxStack.java
类 以及其他必要的文件。
第二个是 xxxPipeline
存储库,其中包含 xxxPipelinexxxApp.java
和 xxxPipelinexxxStack.java
以及其他必要的文件。
最初我错误地使用 git-repo 中的 xxxJava
代码 <git-owner>/<git-repo>
代码 合成 xxxJavaxxxStack
并且管道期望 xxxPipelinexxxStack
部署它。
解决方案是在创建与 github 的连接时添加管道存储库。
由于该阶段无法找到此堆栈,因此它在 'selfmutate' 阶段失败。
当@gshpychka 提到要将 cdk ls
添加到我的 synth 步骤以查看哪些堆栈正在合成时,我获得了成功!
commands(Arrays.asList("mvn clean install", "npx cdk synth", "npx cdk ls"))
要记住的一点 - 在 'selfmutate' 阶段之前,管道相关的更改得到部署,之后添加的任何阶段,实际的 stack/AWS-services 得到部署。