如何为合并的 GitHub 拉取请求触发 CodePipeline?

Joh*_*ohn 5 github amazon-web-services terraform aws-codepipeline aws-codebuild

如何配置 CodePipeline 以在打开、编辑或合并拉取请求时触发?

这是一个 Terraform 配置:

resource "aws_codepipeline_webhook" "gh_to_codepipeline_integration" {
  name            = "gh_to_codepipeline_integration"
  authentication  = "GITHUB_HMAC"
  target_action   = "Source"
  target_pipeline = aws_codepipeline.mycodepipeline.name

  authentication_configuration {
    secret_token = var.github_webhook_secret
  }

  // accept pull requests
  // Is there a way to filter on the PR being closed and merged?  This isn't it...
  filter {
    json_path    = "$.action"
    match_equals = "closed"
  }

}
Run Code Online (Sandbox Code Playgroud)

CodePipeline 设置为接受具有过滤器中指定的所有条件的 webhook 事件,这对应于Pull Request Events

请注意,GitHub 文档针对actiona 字段进行了说明PullRequestEvent(我以粗体强调):

已执行的操作。可以是已分配、未分配、review_requested、review_request_removed、标记、未标记、打开、编辑、关闭、ready_for_review、锁定、解锁或重新打开之一。如果操作已关闭且合并的键为 false,则拉取请求已通过未合并的提交关闭。如果操作已关闭且合并键为真,则合并拉取请求。虽然在同步拉取请求时也会触发 webhook,但事件 API 时间线不包括拉取请求事件和同步操作。

似乎我需要同时过滤$.action==closed && $.pull_request_merged=true,但看起来我不能同时做这两个。如果我只是过滤,$.action==closed那么如果 PR 关闭而不合并,我的管道将重建。这是我的疏忽,还是 CodePipelines 的触发器不如 CodeBuild 项目灵活?

mix*_*xja 6

对于打开/更新的拉取请求,由于 CodePipeline 的 Git 集成需要分支名称,因此本机不支持此名称,因为分支名称是可变的,除非您在长时间运行的分支(例如 等)上打开 PR (例如devqa如果您使用基于 Gitflow 的工作流程)。

我们支持基于动态分支的 PR 的方式是使用 CodeBuild 进行工作流程的构建/单元测试阶段,然后打包存储库并将工件构建到 S3。从那里,我们使用 S3 工件作为源触发集成和验收环境的部署管道。使用 CodePipeline 进行部署非常强大,因为它会自动确保一次只能执行一个阶段,这意味着在任何时候给定应用程序只有一项更改会通过给定环境。

然而,这种方法相当复杂,需要大量 Lambda 魔法与 SQS FIFO 队列混合来处理并发 PR(这是为了克服 CodePipeline 的取代行为),但它是一个非常强大的模式。我们还使用 GitHub 评论来执行诸如触发接受阶段以及自动批准 CodePipeline 中的手动批准步骤等操作。

一旦您准备好合并 PR,我们只需使用从 master 触发的普通 CodePipeline 即可部署到生产环境 - 您还需要做的一件事是确保使用在 PR 上构建和测试的工件。


Yep*_*_Me 2

我不确定为什么要在拉取请求打开时触发整个管道?我通常设置的方式是:

  • CodePipeline 监视主分支并在推送时触发
  • 它将在 CodeBuild 中运行一些构建
  • 如果构建通过,它将运行部署

然后我们有 CodeBuild,它由 CodePipeline 和 GitHub 拉取请求触发:

resource "aws_codebuild_webhook" "dev" {
  project_name = aws_codebuild_project.dev.name

  filter_group {
    filter {
      type     = "EVENT"
      pattern = "PULL_REQUEST_CREATED, PULL_REQUEST_UPDATED"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用代码构建过滤器来选择何时触发构建。terraform 文档也很有帮助。

  • 我敢打赌,该场景是通过在管道中本地合并代码并运行一整套检查和测试来对 PR 实施验证检查。如果构建失败,PR 将被自动拒绝。 (5认同)