如何使用最新版本的CodePipeline进行S3部署



我正在尝试用最新版本的AWS CDK为typescript(1.128)设置一个全新的管道。

管道的创建非常简单。我已经添加了源代码和构建阶段没有问题。这里的目标是自动部署一个静态登陆页面。

到目前为止,我有这段代码:
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。在以前的管道版本中,大量使用了工件对象和CodePipelineActions,类似于这里sourceOutput是一个工件对象:

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对象,显然构建步骤是用于嵌套输出,如上面的例子。每个输出文件都保存在一个桶中,文件名很难看,所以也不打算直接访问。

我已经看到了一些hack的方法代替ShellStep CodeBuildStep和使用后构建命令在buildspec。像这样的Yml文件:

aws s3 sync out s3://cicd-codebuild-static-website/

但是它是在构建阶段解决的,而不是在部署阶段解决的,在部署阶段它将是理想的存在。

我在文档中没有看到任何有见地的东西,所以欢迎任何建议。谢谢!

可以扩展Step,实现ICodePipelineActionFactory。这是一个界面,获得codepipeline.IStage和添加任何你需要添加的动作。

一旦您有了工厂步骤,您将其作为addStage()方法选项的prepost选项传递。

类似下面的代码应该可以工作:

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函数,但使用起来更简单。

最新更新