【问题标题】:AWS CodePipeline track multiple repositories as a single sourceAWS CodePipeline 将多个存储库作为单一来源进行跟踪
【发布时间】:2018-12-18 23:31:56
【问题描述】:

我正在调查 CodePipeline 是否适用于我们的用例:

我们有数百个存储库,全部由 CodeCommit 托管。所有这些的构建/测试/发布过程都是相同的,除了较小的配置。

我想做的是建立一个管道,用于构建/测试/发布在任何这些存储库中所做的更改。我不想构建所有存储库,只构建已更改的存储库。

我宁愿不使用不同的源存储库创建 100 个相同的管道...

这可能吗?如果没有,是否有任何解决方法?

【问题讨论】:

    标签: amazon-web-services aws-codepipeline


    【解决方案1】:

    CodePipeline 是围绕每个项目/服务一个管道的模型设计的。

    尝试将多个独立的发布流程组合到一个管道中是具有挑战性的,因为在等待阶段释放以避免不必要的发布时,新的更改可以替换旧的更改。

    它还会使发布历史记录等某些功能变得不那么有用。

    在您的场景中,100 条管道可能是最好的方法。 CodePipeline 最近将每个区域每个帐户的管道默认限制提高到 300,因此您应该没有限制方面的问题。

    您可以使用 CloudFormation 等工具来简化许多类似管道的设置和配置。另请记住,CodePipeline 不对在给定月份内没有发布的管道收费,因此,如果您有许多管道但实际上每个月只在其中几个中发布,那么它不会花费您太多。

    【讨论】:

    • 这也是我得出的结论。该服务非常明确地面向单个项目/应用程序,这很棒,但不适用于我的用例。我们可以解决一两件事,但最终我们会与服务作斗争,并在未来给自己带来更多的麻烦。目前的计划是利用 CodeCommit、CodeBuild、Lambda、SQS 和 ECS 来运行我们自己的自定义管道。如果这行不通,我们将按照您的建议走每个项目一条管道的路线。干杯!
    • @TimB 当您说代码管道是围绕每个项目一个管道的模型设计时,您的意思是什么?假设我有一个项目,但它使用 poly\micro repo 方法,我在一个 repo 中有一些 terraform,在 10 个 repo 中有服务,我有 11 个代码管道,每个 repo 一个。 AWS 建议您如何协调所有 11 个管道的发布?或者这是代码管道并不是真正打算解决的问题?以一个简单的 3 层应用程序为例,我在 4 个存储库中进行了存储过程更改、平台更改、API 更改和 UI 更改,并且需要一次部署 4 个管道?
    【解决方案2】:

    您可能必须混合使用 CloudWatch 规则 + AWS Lambda + CodePipeline

    CloudWatch 规则

    1. CodeCommit 状态更改 --> CloudWatch 规则 --> 调用 Lambda(创建一个文件,其中包含有关哪个 repo 和分支等的信息 (例如:state-change.json)。 -> 将文件上传到 S3 存储桶(例如:pipeline_source)。

    2. S3 (pipeline_source) 事件 -> CloudWatch --> 触发管道

    代码管道

    [ 源(S3 state-change.json、BuildSpec.yml 等)] --> [ 构建(CodeBuild,自定义脚本读取 statechange.json 文件以确定要构建和部署的内容] -->
    [部署(...)]

    方法 #2 并行执行(不同repos同时更新)

    由于管道运行修订的方式,我认为不可能连接单个管道来满足您的需求。 另一种方法是用步进函数状态机替换 codePipeline。它允许并行执行。 您可以使用适合您的 CI/CD 需求的操作来连接 step 函数。我快速浏览了一下 aws 服务集成 支持的不多。您需要使用 lambda 函数来调用其他 aws 服务,例如:codebuild

    CodeCommit 状态更改 --> CloudWatch 规则 --> 调用 Step 函数状态机

    【讨论】:

    • 谢谢,我也有类似的想法。问题是 CodePipeline 将对修订进行批处理/排队,直到下一阶段空闲为止。如果更高版本到达批处理/队列中,则会被替换。
    • 来自文档:因为一次只能运行一个修订版,CodePipeline 会批处理已完成前一阶段的所有修订版,直到下一阶段可用。如果更新的修订版完成了整个阶段的运行,则批处理的修订版将被最新的修订版替换。这意味着如果五个存储库都同时推送一个修订版,那么只有第一个和最后一个修订版可能会通过。
    猜你喜欢
    • 1970-01-01
    • 2017-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多