首页 > 解决方案 > 使用 AWS codebuild 实施多个构建,以及相关的工件

问题描述

我目前正在处理一个将 AWS CodeBuild 用于我们的 CI 工作流程的项目。目前有一个大型构建,它需要相当多的时间,因为它包含一个需要一些时间运行的 e2e 测试套件,有时可能会不稳定,导致整个构建失败并需要重新启动。

我希望我们可以将构建拆分成更小的模块化构建,这些构建可以独立运行(并且还可以向 GitHub 上的相关 PR 提供独立的状态反馈)。

我正在考虑使用 CodePipeline 来实现这一点,但是似乎 CodePipeline 只能配置为针对 master(或指定的分支)运行,而不是基于每个 PR。我们希望我们的测试能够针对 PR 运行,并首先防止错误代码被合并到 master 中。

我在想,是否有可能只使用 codebuild 来实现这一点,多个构建器负责不同的构建任务(例如,linting/unit testing 可能发生在一个构建器中,与编译应用程序和运行 e2e 测试分开)。

我会喜欢这样的东西:

 |----------|     |---------|
 | Compiler |     | Linter  |
 | Builder  |     | Builder | 
 |----------|     |---------|
      |      \
      |       \
|-----------|  |----------|
| Unit Test |  | E2E Test |
| Builder   |  | Builder  |
|-----------|  |----------|

其中每个框代表一个 CodeBuild 构建器/构建规范,而该行代表一个人工制品依赖项。

在这里,“Compiler Builder”和“Linter Builder”在推送到 PR 时启动。当“Compiler Builder”完成时,它将已编译代码的构建工件传输到“Unit Test Builder”,以及用于运行每个测试套件的“e2e Builder”,它们都向 PR 报告独立状态。

看起来 CodePipeline 是处理这类事情的理想工具,只是它不适用于我们团队的兼容工作流。

我不清楚如何为 CodeBuild 设置这样的东西,尽管我看到人们在其他帖子/SO 问题上提到它,你可以使用其他 AWS 服务来编排这种事情(AWS Lambda/ AWS 步骤函数)。我对 AWS 服务并不是特别了解,什么是可能的,什么是不可能的,这就是我在这里问的原因。我只想确认我上面描述的内容是可能的,以及需要使用哪些服务来实现这一点。

我认为我正在努力解决的关键障碍之一是如何使一个 codebuild 构建的输出成为另一个的输入,我已经研究过使用 S3 来存储构建工件,尽管我不确定如何在另一个中使用它build,然后连接到 GitHub,并能够将状态报告回 PR。

标签: amazon-web-servicescontinuous-integration

解决方案


在 CodePipeline 中,每个动作(在每个阶段内)都有一个输入工件和输出工件。这可以用来解决您的特定障碍。

正如您所描述的,一些作业(操作)应该并行运行(即在同一阶段)并且应该将它们的工件输出到输出工件。

其他作业应该串行运行,因此它们应该发生在另一个阶段(例如之后),并且这些作业(动作)可以使用先前的输出工件作为它们的输入工件。

AWS CodePipeline 编辑操作


推荐阅读