我正在尝试找到一种从亚马逊 Codecommit 发送 PR 事件的方法。我有一个 CI 解决方案,我想在 PR 打开/修改时启动它们的构建。
我没有找到在触发器下做到这一点的方法:
但这似乎很奇怪,因为我确实在通知下看到了 PR 事件
有没有办法为 PR 创建 webhook 事件? 谢谢!
我建议不要使用 CodeCommit 的触发器功能,而是查看它们与 CloudWatch Events 的集成。
除此之外,您还可以为以下操作创建通知/触发工作流程:
基本上,您可以创建一个 CloudWatch 事件规则,其中包含一些针对您想要的操作类型的过滤器,然后选择在这些事件发生时要向哪些服务传递通知,例如 CodeBuild 或 Lambda。
文档:https://docs.aws.amazon.com/codecommit/latest/userguide/monitoring-events.html
您可以使用命令动态启动代码构建。您可以在 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文件中使用它
lambda.py
复制到 lambda 函数codebuild-dynamic-communicator-role-py375219
) 以触发代码构建项目 {
"Effect": "Allow",
"Action": "codebuild:StartBuild",
"Resource": "arn:aws:codebuild:xx-region-y:xxxxxxxxxxxxxx:project/*"
}
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
$ 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
[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
$ 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
[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 并且具有最新提交
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")
}
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"