如何让Google Cloud Build触发器识别分支内所有提交的变更
Google Cloud Build 推送触发全提交变更匹配配置方案
问题现象
使用Google Cloud Build(GCB)为GitHub仓库配置推送触发的测试流程时,原生包含文件过滤规则仅识别分支内最新提交的变更内容,以此判定需要运行的触发器,无法覆盖本次推送包含的所有提交改动。
典型复现场景:
仓库目录结构如下:
./client/<client code> ./server/<server code>
预先配置两个带包含文件过滤规则的触发器:
- 触发器1:包含文件匹配规则为
client/** - 触发器2:包含文件匹配规则为
server/**
当推送的分支包含两个提交时:提交1修改client/foo.js,提交2修改server/bar.scala,按照现有判定逻辑最终仅触发器2会被执行,预期效果为两个触发器都运行,覆盖分支引入的所有变更对应的测试流程。
目前已知临时方案为每个分支仅保留单个提交,可触发所有对应构建,但该方案不符合常规Git工作流的使用需求。
解决方法
GCB原生的推送触发器文件过滤逻辑没有提供可直接配置的开关,无法直接修改为遍历本次推送的所有提交做匹配,默认逻辑就是仅校验最新单次提交的变更文件。想要覆盖本次推送所有提交的改动触发对应构建,可以按以下方式调整配置绕开原生限制:
- 移除原有两个触发器上配置的
Included files filter(包含文件过滤)规则,避免原生单提交校验逻辑拦截构建 - 配置通用推送触发器,分支推送事件触发后,在构建的初始化步骤通过Git命令拉取本次推送覆盖的提交区间的全量变更文件列表。GCB触发构建时会自动注入提交相关环境变量,可直接使用:
如果是PR触发场景,可直接对比PR目标分支和当前分支的分叉点与最新提交,拿到PR全量改动文件。# 对比推送前的最后一个提交和当前最新提交,拿到全量改动文件清单 CHANGED_FILES=$(git diff --name-only ${PREVIOUS_COMMIT_ID} ${COMMIT_SHA}) - 在构建流程中增加路径判断逻辑,根据
CHANGED_FILES的命中结果执行对应测试流程:- 若改动文件命中
client/**匹配规则,执行客户端相关测试步骤 - 若改动文件命中
server/**匹配规则,执行服务端相关测试步骤
- 若改动文件命中
- 如果需要保留原有两个独立触发器的拆分逻辑,可在通用触发器的判断步骤中,检测到对应路径改动时,直接调用GCB接口手动触发对应独立触发器运行即可。
内容的提问来源于stack exchange,提问作者simen-andresen
相关产品推荐
相关产品推荐

