如何使用现代版本的 CodePipeline 进行 S3 部署
How to make a S3 deployment with the modern version of CodePipeline
我正在尝试使用最新版本的 AWS CDK for typescript (1.128) 设置一个全新的管道。
管道的创建非常简单。我已经毫无问题地添加了源代码和构建阶段。这里的objective是自动部署静态登陆页面
到目前为止我有这段代码:
const landingPageStep = new ShellStep(`${PREFIX}LandingPageCodeBuildStep`, {
input: CodePipelineSource.connection(`${GIT_ORG}/vicinialandingpage`, GIT_MAIN, {
connectionArn: GIT_CONNECTION_ARN, // Created using the AWS console
}),
installCommands: [
'npm ci',
],
commands: [
'npm run build',
],
primaryOutputDirectory: 'out',
})
const pipeline = new CodePipeline(this, `${PREFIX}Pipeline`, {
pipelineName: `${PREFIX}Pipeline`,
synth: new ShellStep(`${PREFIX}Synth`, {
input: CodePipelineSource.connection(`${GIT_ORG}/viciniacdk`, GIT_MAIN, {
connectionArn: GIT_CONNECTION_ARN, // Created using the AWS console
}),
commands: [
'npm ci',
'npm run build',
'npx cdk synth',
],
additionalInputs: {
'landing_page': landingPageStep,
},
}),
});
我不确定如何实现的步骤是如何使用“landing_page”的输出部署到 S3。在以前版本的 Pipelines 中,大量使用了 Artifacts 对象和 CodePipelineActions,与此类似,其中 sourceOutput 是一个 Artifact 对象:
const targetBucket = new s3.Bucket(this, 'MyBucket', {});
const pipeline = new codepipeline.Pipeline(this, 'MyPipeline');
const deployAction = new codepipeline_actions.S3DeployAction({
actionName: 'S3Deploy',
stage: deployStage,
bucket: targetBucket,
input: sourceOutput,
});
const deployStage = pipeline.addStage({
stageName: 'Deploy',
actions: [deployAction],
});
现在完全不同了,因为您可以访问 FileSet 对象,而且显然构建步骤旨在用于嵌套输出,如上例所示。每个输出文件都保存在一个文件名丑陋的桶中,因此也不打算直接访问它。
我看到一些 hacky 方法用 CodeBuildStep 替换 ShellStep 并在 buildspec.yml 文件中用作构建后命令,如下所示:
aws s3 sync out s3://cicd-codebuild-static-website/
但它是在构建阶段解决的,而不是在理想存在的部署阶段。
我没有在文档中看到任何有见地的内容,因此欢迎提出任何建议。谢谢!
您可以扩展 Step
and implement ICodePipelineActionFactory
. It's an interface that gets codepipeline.IStage
并添加您需要添加的任何操作。
完成工厂步骤后,将其作为 addStage()
方法选项的 pre
或 post
选项传递。
接近以下的内容应该有效:
class S3DeployStep extends Step implements ICodePipelineActionFactory {
constructor(private readonly provider: codepipeline_actions.JenkinsProvider, private readonly input: FileSet) {
}
public produceAction(stage: codepipeline.IStage, options: ProduceActionOptions): CodePipelineActionFactoryResult {
stage.addAction(new codepipeline_actions.S3DeployAction({
actionName: 'S3Deploy',
stage: deployStage,
bucket: targetBucket,
input: sourceOutput,
runOrder: options.runOrder,
}));
return { runOrdersConsumed: 1 };
}
}
// ...
pipeline.addStage(stage, {post: [new S3DeployStep()]});
但更简单的方法是使用 BucketDeployment
将其作为堆栈部署的一部分。它创建一个自定义资源,将数据从您的资产或另一个存储桶复制到一个存储桶。它不会在管道中获得自己的步骤,它会在后台创建一个 Lambda 函数,但使用起来更简单。
我正在尝试使用最新版本的 AWS CDK for typescript (1.128) 设置一个全新的管道。
管道的创建非常简单。我已经毫无问题地添加了源代码和构建阶段。这里的objective是自动部署静态登陆页面
到目前为止我有这段代码:
const landingPageStep = new ShellStep(`${PREFIX}LandingPageCodeBuildStep`, {
input: CodePipelineSource.connection(`${GIT_ORG}/vicinialandingpage`, GIT_MAIN, {
connectionArn: GIT_CONNECTION_ARN, // Created using the AWS console
}),
installCommands: [
'npm ci',
],
commands: [
'npm run build',
],
primaryOutputDirectory: 'out',
})
const pipeline = new CodePipeline(this, `${PREFIX}Pipeline`, {
pipelineName: `${PREFIX}Pipeline`,
synth: new ShellStep(`${PREFIX}Synth`, {
input: CodePipelineSource.connection(`${GIT_ORG}/viciniacdk`, GIT_MAIN, {
connectionArn: GIT_CONNECTION_ARN, // Created using the AWS console
}),
commands: [
'npm ci',
'npm run build',
'npx cdk synth',
],
additionalInputs: {
'landing_page': landingPageStep,
},
}),
});
我不确定如何实现的步骤是如何使用“landing_page”的输出部署到 S3。在以前版本的 Pipelines 中,大量使用了 Artifacts 对象和 CodePipelineActions,与此类似,其中 sourceOutput 是一个 Artifact 对象:
const targetBucket = new s3.Bucket(this, 'MyBucket', {});
const pipeline = new codepipeline.Pipeline(this, 'MyPipeline');
const deployAction = new codepipeline_actions.S3DeployAction({
actionName: 'S3Deploy',
stage: deployStage,
bucket: targetBucket,
input: sourceOutput,
});
const deployStage = pipeline.addStage({
stageName: 'Deploy',
actions: [deployAction],
});
现在完全不同了,因为您可以访问 FileSet 对象,而且显然构建步骤旨在用于嵌套输出,如上例所示。每个输出文件都保存在一个文件名丑陋的桶中,因此也不打算直接访问它。
我看到一些 hacky 方法用 CodeBuildStep 替换 ShellStep 并在 buildspec.yml 文件中用作构建后命令,如下所示:
aws s3 sync out s3://cicd-codebuild-static-website/
但它是在构建阶段解决的,而不是在理想存在的部署阶段。
我没有在文档中看到任何有见地的内容,因此欢迎提出任何建议。谢谢!
您可以扩展 Step
and implement ICodePipelineActionFactory
. It's an interface that gets codepipeline.IStage
并添加您需要添加的任何操作。
完成工厂步骤后,将其作为 addStage()
方法选项的 pre
或 post
选项传递。
接近以下的内容应该有效:
class S3DeployStep extends Step implements ICodePipelineActionFactory {
constructor(private readonly provider: codepipeline_actions.JenkinsProvider, private readonly input: FileSet) {
}
public produceAction(stage: codepipeline.IStage, options: ProduceActionOptions): CodePipelineActionFactoryResult {
stage.addAction(new codepipeline_actions.S3DeployAction({
actionName: 'S3Deploy',
stage: deployStage,
bucket: targetBucket,
input: sourceOutput,
runOrder: options.runOrder,
}));
return { runOrdersConsumed: 1 };
}
}
// ...
pipeline.addStage(stage, {post: [new S3DeployStep()]});
但更简单的方法是使用 BucketDeployment
将其作为堆栈部署的一部分。它创建一个自定义资源,将数据从您的资产或另一个存储桶复制到一个存储桶。它不会在管道中获得自己的步骤,它会在后台创建一个 Lambda 函数,但使用起来更简单。