如何查询Bitbucket PR触发的AWS CodePipeline对应提交的更新文件
需求实现方案
该需求完全可以实现,推荐优先通过CodeBuild内置的Git能力获取变更文件列表,操作步骤如下:
- 利用CodeBuild默认注入的环境变量获取必要的提交/分支信息:
CODEBUILD_RESOLVED_SOURCE_VERSION:本次触发管道的对应提交哈希值CODEBUILD_WEBHOOK_BASE_REF:PR触发时的目标分支名CODEBUILD_WEBHOOK_EVENT:触发事件类型,可用来区分PR触发还是普通分支推送
- 拉取完整Git历史:CodeBuild默认采用浅克隆拉取代码,需先执行
git fetch --unshallow获取完整提交记录,避免对比差异时报错 - 执行Git命令提取变更文件列表:
PR触发场景下使用三点diff对比目标分支和当前提交,可准确获取本次PR所有新增/修改的文件:git diff --name-only origin/$CODEBUILD_WEBHOOK_BASE_REF...$CODEBUILD_RESOLVED_SOURCE_VERSION
普通分支推送场景下对比当前提交和上一次提交即可:git diff --name-only $CODEBUILD_RESOLVED_SOURCE_VERSION^ $CODEBUILD_RESOLVED_SOURCE_VERSION - 过滤提取DAG名称:根据你的DAG文件存放目录,用grep过滤对应路径下的文件,提取文件名即可得到和文件名完全一致的DAG名称。
完整buildspec配置示例
version: 0.2 pre_build: commands: # 拉取全量Git历史避免浅克隆导致提交记录缺失 - git fetch --unshallow # 区分场景获取变更文件列表 - | if [ "$CODEBUILD_WEBHOOK_EVENT" = "PULL_REQUEST" ]; then CHANGED_FILES=$(git diff --name-only origin/$CODEBUILD_WEBHOOK_BASE_REF...$CODEBUILD_RESOLVED_SOURCE_VERSION) else CHANGED_FILES=$(git diff --name-only $CODEBUILD_RESOLVED_SOURCE_VERSION^ $CODEBUILD_RESOLVED_SOURCE_VERSION) fi # 过滤dags目录下的.py文件,提取无后缀的文件名作为DAG名称 - DAG_NAMES=$(echo "$CHANGED_FILES" | grep '^dags/.*\.py$' | xargs basename -s .py | uniq) # 输出结果供后续步骤使用,也可写入环境变量文件传递到下游 - echo "待触发DAG列表:$DAG_NAMES"
补充说明
- 如果需要把提取到的DAG名称传递到后续CodePipeline阶段,可以将结果写入到文件,通过CodeBuild的输出制品传递到下游步骤
- 该方案不需要调用额外的CodePipeline CLI接口,实现成本低、稳定性高
内容的提问来源于stack exchange,提问作者Diana Kerrala
相关产品推荐
相关产品推荐

