【问题标题】:Dynamically change branches on AWS CodePipeline在 AWS CodePipeline 上动态更改分支
【发布时间】:2018-07-27 12:06:00
【问题描述】:

我正在寻找一个关于如何在 CodePipeline 中运行参数化(自定义)构建的好解决方案,其中分支可以动态更改?

关于问题的一点背景知识:我需要一个将在某个分支上启动的按需环境。我们已经在部分基础架构中使用了 Bamboo CI 服务器,这在 Jenkins 中也可以通过自定义构建轻松实现。

所以基本上我需要一种方法来触发构建,其中分支作为 AWS 中 CodePipeline 上的变量。

【问题讨论】:

    标签: amazon-web-services continuous-integration aws-codepipeline


    【解决方案1】:

    目前 CodePipeline 不支持基于分支的构建。通常,CodePipeline 最适合运行验证和自动发布“发布”分支。

    合并前验证的一个选项是使用 CodeBuild 拉取请求支持来验证拉取请求,然后使用 CodePipeline 来验证合并代码:https://aws.amazon.com/about-aws/whats-new/2017/09/aws-codebuild-now-supports-building-github-pull-requests/

    【讨论】:

    • CodePipeline 现在支持为 Github 和 CodeCommit 源指定分支。我不确定该功能是何时添加的。
    • @kaliatech CodePipeline 一直支持指定分支。问题在于 CodePipeline 在任何分支而不是特定分支上动态运行。这不是 CodePipeline 当前支持的东西。
    • @TimB 我已经按照你的建议做,但这并不理想,这很好,因为我在 github 中的每个存储库都有一个完整的管道,在合并到 master\main 后运行,但它在许多方面都缺乏.当 PR 被提升(对于开发人员)时,我无法拥有一个可以动态构建和销毁临时环境的管道,并且跨多个 repos 管道协调部署并不容易。我选择了一种策略,我修复转发并从 master 部署到测试环境,并尝试组织我的代码,以便任何一个 repo 都可以独立部署,而不是依赖于其他 repo。
    【解决方案2】:

    对于您的用例,最好专门为每个分支创建一个管道,因为听起来您的分支对于给定的环境会有一个固定的名称。

    这在分支代表环境的情况下非常有效,而 CodePipeline 正在努力为更多动态分支执行持续交付,例如功能分支/拉取请求。

    对于后一种情况,我使用 CodeBuild 处理拉取请求,然后在 S3 存档中发布构建工件,然后我使用它来触发 CodePipeline 运行集成测试和分段部署。在此过程中存在一些陷阱,但它允许您利用 CodePipeline 的一些更强大的功能(例如,一次只能运行一个阶段执行的能力,这对于具有共享资源的环境很重要)。

    【讨论】:

      【解决方案3】:

      我们可以通过以下方法很好地支持动态分支。

      我们在我们的组织中遵循这种方法并且效果很好。

      AWS 代码管道的限制之一是我们必须在创建管道时指定分支名称。然而,我们可以使用如下所示的架构来解决这个问题。

      flow diagram

      创建一个 Lambda 函数,它将 GitHub web-hook 数据作为输入,使用 boto3 将其与 AWS 管道集成(拉管道并更新),有一个 API 网关来调用 Lambda 函数作为休息调用,并且最后创建一个到 GitHub 存储库的 web-hook。

      外部链接:

      【讨论】:

      • 我正在使用这个工作流程,但目前我为每个发布分支都有 Codepipelines(我们为不同的帐户使用不同的发布分支)。我认为使用一个 Codepipeline 进行这项工作的唯一方法是每次运行时更改 Codepipeline 配置。我不喜欢这种方法,因为如果您不验证配置中的分支,点击 GUI 中的释放按钮将会产生不可预知的结果。在我的情况下,我只是取消了 Codepipeline,并使用处理钩子的 lambda 函数提供的“源版本”直接触发 Codebuild。
      • 您好,您可以使用 AWS lambda 更新管道中的分支详细信息,webhook 将具有必要的分支详细信息,您可以使用 AWS Lambda 中的 python boto3 库来更新管道中的分支详细信息每当创建新分支时都会自动管道。
      • 只需使用命名约定来标识发布分支,我们使用 'release/*' 其中 * 表示发布名称,这有助于仅从 AWS Lambda 中的 webhook 响应中识别发布分支。
      • 嘿,我喜欢这个主意。我想知道您是否可以在另一个构建运行时更新管道的分支。有这方面的经验吗?这会造成竞争条件吗?
      【解决方案4】:

      在做了一些研发得到答案后,我有同样的要求,在 AWS 代码构建部分没有条件基础触发器,有一个用于调度 cron 基础作业的触发器,它只在一分钟后运行.. 所以如果需要在检查条件后运行触发器或动态运行代码构建,则必须使用 aws sdk

      我使用 aws cli 和 nodejs

      对于命令(cli):

      aws codebuild start-build --project-name project1
      
      --environment-variables-override name=variablename,value=variablevalue
      

      对于节点js

           var AWS = require("aws-sdk");
            var codebuild = new AWS.CodeBuild();
      
           var params = {
          projectName: machineName, /* required */
          environmentVariablesOverride: [
              {
                name: 'APPID', /* required */
                value: appid, /* required */
              },
               {
                name: 'BUILDID', /* required */
                value: buildidnew, /* required */
              },{
                name: 'REBUILD', /* required */
                value: rebuildid, /* required */
              }
      
            ],
          };
      
          codebuild.startBuild(params, function(err, data) {
      
            if (err) {
             callback(err, null);
      
            }
            else {
      
           callback(null, data);
            }  
      
      
      
          });
      

      记住变量值应该是一个字符串

      【讨论】:

        猜你喜欢
        • 2020-11-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-13
        • 1970-01-01
        • 2018-07-01
        相关资源
        最近更新 更多