AWS 代码提交 - 对 PR 事件采取行动

问题描述 投票:0回答:2

我正在尝试找到一种从亚马逊 Codecommit 发送 PR 事件的方法。我有一个 CI 解决方案,我想在 PR 打开/修改时启动它们的构建。

我没有找到在触发器下做到这一点的方法:

但这似乎很奇怪,因为我确实在通知下看到了 PR 事件

有没有办法为 PR 创建 webhook 事件? 谢谢!

webhooks pull-request aws-codecommit
2个回答
1
投票

我建议不要使用 CodeCommit 的触发器功能,而是查看它们与 CloudWatch Events 的集成。

除此之外,您还可以为以下操作创建通知/触发工作流程:

  1. 已创建拉取请求
  2. 更新了拉取请求源分支
  3. 拉取请求合并状态已更新

基本上,您可以创建一个 CloudWatch 事件规则,其中包含一些针对您想要的操作类型的过滤器,然后选择在这些事件发生时要向哪些服务传递通知,例如 CodeBuild 或 Lambda。

文档:https://docs.aws.amazon.com/codecommit/latest/userguide/monitoring-events.html


0
投票

使用 EventBridge(Lambda、动态分支)触发 PR 事件的代码构建

目标

  • codebuild 中的 PR 总是通过构建项目中硬编码的分支来提升。
  • 我们想要用 PR 分支触发代码构建,这需要 lambda 函数的参与。

具有相关信息的研究链接和文档

aws。代码构建。开始构建

您可以使用命令动态启动代码构建。您可以在 lambda 函数中使用相同的命令来触发 codebuild 项目。

docs.aws.amazon.com » 监控 Amazon EventBridge 和 Amazon CloudWatch Events 中的 CodeCommit 事件

您可以从事件中获取有效负载并在 lambda 函数中使用它进行测试。

stackoverflow.com » 使用 Nodejs 创建 Lambda 函数来触发 Codebuild 项目

使用nodejs触发lambda

docs.aws.amazon.com » 构建环境中的环境变量

您可以使用buildspec.yaml文件中的环境变量来获取源分支并在buildspec.yaml文件中使用它

测试步骤

  • 在Codecommit中创建repo-a
  • 在Codecommit中创建repo-b
  • 为 repo-a 创建一个 codebuild 项目 - codebuild-repo-a
  • 为 repo-b 创建一个 codebuild 项目 - codebuild-repo-b
  • 为 repo-a 创建 codepipeline - codepipeline-repo-a
  • 为 repo-b 创建 codepipeline - codepipeline-repo-b
  • 创建 lambda 函数来触发重复的代码构建
  • 将代码
    lambda.py
    复制到 lambda 函数
  • docs.aws.amazon.com » 监控 Amazon EventBridge 和 Amazon CloudWatch Events 中的 CodeCommit 事件 并将其粘贴到事件中
  • 将权限添加到 lambda_service_role (
    codebuild-dynamic-communicator-role-py375219
    ) 以触发代码构建项目
        {
            "Effect": "Allow",
            "Action": "codebuild:StartBuild",
            "Resource": "arn:aws:codebuild:xx-region-y:xxxxxxxxxxxxxx:project/*"
        }
  • 在EventBridge中为repo-a创建规则来触发lambda函数
  • 选择默认事件总线并创建规则
  • 将 codecommit repo-a 的 arn 作为源,事件为 PR_STATUS_CHANGE
  • 选择目标作为 lambda 函数
  • 创建规则
  • 为 repo-a 创建 PR
  • 在repo-a中添加一个
    buildspec.yaml
    文件来了解最新的提交更改并更新codebuild-project-a
$ gst
On branch feat_pr_from_repo_a
Changes not staged for commit:
        deleted:    repo_a__commit_4
Untracked files:
        repo_a__commit_5
  • 创建拉取请求
  • 创建 PR 时在 cloudwatch 中检查 lambda 日志
  • 登录codebuild-repo-一个codebuild项目
  • 将提交添加到 PR
$ gst
On branch feat_pr_from_repo_a
Changes not staged for commit:
        deleted:    repo_a__commit_5

Untracked files:
        repo_a__commit_6

# Push the changes as new commit
  • 看到构建是针对 PR 分支触发的
  • 构建日志中提供最新提交信息
[Container] 2024/04/27 04:19:26.605628 Running command ls -ltrh
total 4.0K
-rw-r--r-- 1 root root   0 Apr 27 04:19 repo_a__commit_6
-rw-r--r-- 1 root root 273 Apr 27 04:19 buildspec.yaml

注意:分支名称为 refs/heads/feat_pr_from_repo_a

  • 在EventBridge中为repo-b创建规则以触发lambda函数
  • 为 repo-b 创建 PR
$ git branch --show-current
feat_pr_from_repo_b_branch1

$ gst                      
On branch feat_pr_from_repo_b_branch1
Changes not staged for commit:
        deleted:    repo_a__test5
Untracked files:
        repo_a__test6
# commit the changes
  • codebuild-repo-b 的日志
[Container] 2024/04/27 04:38:28.453263 Running command ls -ltrh
total 4.0K
-rw-r--r-- 1 root root   0 Apr 27 04:38 repo_a__test6
-rw-r--r-- 1 root root 273 Apr 27 04:38 buildspec.yaml

注意:分支名称为 refs/heads/feat_pr_from_repo_b_branch1 并且具有最新提交

Lambda 函数

import json
import boto3

def lambda_handler(event, context):
    # Initialize the CodeBuild client
    codebuild = boto3.client('codebuild')

    # Print the raw event data
    print("Raw Event Data: for repob : 1")
    print(json.dumps(event))

    detail = event.get("detail", {})
    repository_names = detail.get("repositoryNames", [])
    source_version = detail.get("sourceReference", "")
    if source_version and repository_names:
        try:
            # If codecommit reponame is repo-a then codebuild project name will be codebuild-repo-a
            project_name = "codebuild-" + repository_names[0]
            print(f"Project Name: {project_name}")
            # Trigger the build
            response = codebuild.start_build(
                projectName=project_name,
                sourceVersion=source_version
            )
            print("CodeBuild Triggered Successfully")
            print(response)
        except Exception as e:
            print("Failed to trigger CodeBuild")
            print(str(e))
    else:
        print("No source version or project name provided, cannot trigger CodeBuild.")

    # Return a successful response
    return {
        "statusCode": 200,
        "body": json.dumps("Event processed successfully")
    }

buildspec.yaml

version: 0.2

phases:
  install:
    commands:
      - echo "Installing dependencies"

  pre_build:
    commands:
      - echo "Pre-build step"

  build:
    commands:
      - echo "Build phase"
      - ls -ltrh

  post_build:
    commands:
      - echo "Post-build step"


© www.soinside.com 2019 - 2024. All rights reserved.