一、背景介绍
今天,折腾了下 circleci 自动化测试的东西,发现现存的 CI 脚本每次都是全量检查,效率很低。
由于每次提交的内容关联不大,没必要每次都检查所有文件,最佳方案是只检查变化的文件。
要获取 pull request 改变的文件,高级语言实现当然不难,但 shell 方案你知道如何编写吗?
二、 获得 PR 更新文件列表
[注意]:该脚本适用于 circleci 场景,其他场景原理通用,但可能需要稍作改变!
circleci 默认提供了一些环境变量,我这里主要应用到了 $CIRCLE_PULL_REQUEST
这个变量保存了 PR 的 URL 全路径,形如:https://github.com/xxx/xxx/pull/100
# 构造请求 URL
CIRCLE_PR_NUMBER=${CIRCLE_PULL_REQUEST##*/}
OWNER=$(echo $CIRCLE_PULL_REQUEST | cut -d / -f 4)
REPO=$(echo $CIRCLE_PULL_REQUEST | cut -d / -f 5)
URL="https://api.github.com/repos/$OWNER/$REPO/pulls/$CIRCLE_PR_NUMBER/files"
# 请求 GitHub api 接口,解析变更的文件
# 这里用 jq 过滤了部分文件
CHANGED_MARKDOWN_FILES=( $(curl -s -X GET -G $URL | jq -r '.[] | select(.status != "removed") | select(.filename | endswith(".md")) | .filename') )