如何在 CodeBuild 操作之间传递 CodePipeline 中的工件
How to pass artifacts in CodePipeline between CodeBuild Actions
我正在使用 Typescript 中的 aws-cdk v0.31.0 开发 AWS CodePipeline。
尝试合成 cloudformation 模板时出现验证错误
throw new Error(`Validation failed with the following errors:\n ${errorList}`);
^
Error: Validation failed with the following errors:
[SummitCodePipelineDemoStack/Pipeline] Artifact 'compile-output' was used as input before being used as output
at Synthesizer.synthesize (/home/stefan/Private/programmieren/aws/cdk/SummitCodePipelineDemo/node_modules/@aws-cdk/cdk/lib/synthesis.ts:51:15)
at App.run (/home/stefan/Private/programmieren/aws/cdk/SummitCodePipelineDemo/node_modules/@aws-cdk/cdk/lib/app.ts:75:27)
at Object.<anonymous> (/home/stefan/Private/programmieren/aws/cdk/SummitCodePipelineDemo/bin/summit_code_pipeline_demo.ts:8:5)
at Module._compile (internal/modules/cjs/loader.js:689:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:700:10)
at Module.load (internal/modules/cjs/loader.js:599:32)
at tryModuleLoad (internal/modules/cjs/loader.js:538:12)
at Function.Module._load (internal/modules/cjs/loader.js:530:3)
at Function.Module.runMain (internal/modules/cjs/loader.js:742:12)
at startup (internal/bootstrap/node.js:283:19)
Subprocess exited with error 1
根据错误消息,我在将工件用作输出之前将其用作输入 - 不确定我是如何做到的。下面我提供了我的代码
export class SummitCodePipelineDemoStack extends Stack {
codeRepository: Repository;
imageDefinitionArtifact: Artifact = new Artifact("imagedefinition_json");
constructor(scope: App, id: string, props?: StackProps) {
super(scope, id, props);
const sourceOutput = new Artifact();
const compileOutput = new Artifact("compile-output");
this.codeRepository = this.createCodeCommitRepository();
new Pipeline(this, "Pipeline", {
pipelineName: "ThymeLeadDemoBuildPipeline",
stages: [
{
name: "Stage1",
actions: [this.SourceAction(sourceOutput)]
},
{
name: "Stage2",
actions: [
this.BuildAction(sourceOutput, compileOutput),
this.ContainerAction(compileOutput)
]
}
]
});
}
private createCodeCommitRepository(): Repository {
return new Repository(this, "CodeCommitRepository", {
repositoryName: "thymeleafdemorepository",
description: "Spring Boot Demo with Thymeleaf."
});
}
private SourceAction(output: Artifact): Action {
return new CodeCommitSourceAction({
repository: this.codeRepository,
actionName: "SourceAction",
output
});
}
private ContainerAction(input: Artifact): Action {
return new CodeBuildAction({
actionName: "CreationOfContainer",
project: new PipelineProject(
this,
"MyContainerCreationProject",
this.createProjectProperties()
),
input
});
}
private BuildAction(input: Artifact, output: Artifact): Action {
return new CodeBuildAction({
actionName: "CompileCode",
project: new PipelineProject(this, "CompileProject", {
projectName: "ThymeLeafDemoCompile",
environment: {
buildImage: LinuxBuildImage.UBUNTU_14_04_OPEN_JDK_11
}
}),
input,
output
});
}
private createProjectProperties(): PipelineProjectProps {
return {
projectName: "thymeleafdemocontainerproject",
environment: {
buildImage: LinuxBuildImage.UBUNTU_14_04_DOCKER_17_09_0
}
};
}
}
我自己想出了答案:
这似乎是 cdk 本身的一个错误,从这里两三天开始就被跟踪了
https://github.com/awslabs/aws-cdk/issues/2549
我正在使用 Typescript 中的 aws-cdk v0.31.0 开发 AWS CodePipeline。
尝试合成 cloudformation 模板时出现验证错误
throw new Error(`Validation failed with the following errors:\n ${errorList}`);
^
Error: Validation failed with the following errors:
[SummitCodePipelineDemoStack/Pipeline] Artifact 'compile-output' was used as input before being used as output
at Synthesizer.synthesize (/home/stefan/Private/programmieren/aws/cdk/SummitCodePipelineDemo/node_modules/@aws-cdk/cdk/lib/synthesis.ts:51:15)
at App.run (/home/stefan/Private/programmieren/aws/cdk/SummitCodePipelineDemo/node_modules/@aws-cdk/cdk/lib/app.ts:75:27)
at Object.<anonymous> (/home/stefan/Private/programmieren/aws/cdk/SummitCodePipelineDemo/bin/summit_code_pipeline_demo.ts:8:5)
at Module._compile (internal/modules/cjs/loader.js:689:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:700:10)
at Module.load (internal/modules/cjs/loader.js:599:32)
at tryModuleLoad (internal/modules/cjs/loader.js:538:12)
at Function.Module._load (internal/modules/cjs/loader.js:530:3)
at Function.Module.runMain (internal/modules/cjs/loader.js:742:12)
at startup (internal/bootstrap/node.js:283:19)
Subprocess exited with error 1
根据错误消息,我在将工件用作输出之前将其用作输入 - 不确定我是如何做到的。下面我提供了我的代码
export class SummitCodePipelineDemoStack extends Stack {
codeRepository: Repository;
imageDefinitionArtifact: Artifact = new Artifact("imagedefinition_json");
constructor(scope: App, id: string, props?: StackProps) {
super(scope, id, props);
const sourceOutput = new Artifact();
const compileOutput = new Artifact("compile-output");
this.codeRepository = this.createCodeCommitRepository();
new Pipeline(this, "Pipeline", {
pipelineName: "ThymeLeadDemoBuildPipeline",
stages: [
{
name: "Stage1",
actions: [this.SourceAction(sourceOutput)]
},
{
name: "Stage2",
actions: [
this.BuildAction(sourceOutput, compileOutput),
this.ContainerAction(compileOutput)
]
}
]
});
}
private createCodeCommitRepository(): Repository {
return new Repository(this, "CodeCommitRepository", {
repositoryName: "thymeleafdemorepository",
description: "Spring Boot Demo with Thymeleaf."
});
}
private SourceAction(output: Artifact): Action {
return new CodeCommitSourceAction({
repository: this.codeRepository,
actionName: "SourceAction",
output
});
}
private ContainerAction(input: Artifact): Action {
return new CodeBuildAction({
actionName: "CreationOfContainer",
project: new PipelineProject(
this,
"MyContainerCreationProject",
this.createProjectProperties()
),
input
});
}
private BuildAction(input: Artifact, output: Artifact): Action {
return new CodeBuildAction({
actionName: "CompileCode",
project: new PipelineProject(this, "CompileProject", {
projectName: "ThymeLeafDemoCompile",
environment: {
buildImage: LinuxBuildImage.UBUNTU_14_04_OPEN_JDK_11
}
}),
input,
output
});
}
private createProjectProperties(): PipelineProjectProps {
return {
projectName: "thymeleafdemocontainerproject",
environment: {
buildImage: LinuxBuildImage.UBUNTU_14_04_DOCKER_17_09_0
}
};
}
}
我自己想出了答案: 这似乎是 cdk 本身的一个错误,从这里两三天开始就被跟踪了 https://github.com/awslabs/aws-cdk/issues/2549