无需克隆仓库,获取指定日期提交SHA优化TruffleHog扫描
增量扫描实现方案
核心思路
通过持久化追踪每个仓库的扫描状态,结合GitHub API无需克隆即可获取指定时间后的首个提交SHA,同时自动适配仓库的新增与删除。
1. 存储仓库扫描状态
需要一个持久化存储(比如CI/CD流水线的缓存存储、轻量数据库,甚至是JSON文件),记录每个仓库的以下信息:
- 仓库全名(格式:
org/repo) - 上次扫描的结束时间(ISO 8601格式,如
2024-05-01T00:00:00Z) - 上次扫描覆盖的最新提交SHA
处理规则:
- 新增仓库:首次扫描时无历史记录,直接执行全量扫描,扫描完成后记录当前时间和仓库最新SHA。
- 删除仓库:每次获取组织仓库列表后,对比状态记录,移除已不存在的仓库条目。
2. 无需克隆获取目标提交SHA
使用GitHub CLI调用REST API,直接查询指定仓库在上次扫描时间之后的首个提交SHA:
# 定义变量:替换为实际值 REPO_FULL_NAME="your-org/your-repo" LAST_SCAN_END_TIME="2024-05-01T00:00:00Z" # 获取目标SHA TARGET_SHA=$(gh api repos/$REPO_FULL_NAME/commits \ --method GET \ --per-page 1 \ --since "$LAST_SCAN_END_TIME" \ --jq '.[0].sha')
- 如果
TARGET_SHA为空,说明上次扫描后无新提交,直接跳过该仓库。 - 如果是新仓库,跳过此步骤,直接执行全量扫描。
3. 流水线执行流程
每月执行时按以下步骤运行:
- 步骤1:获取组织仓库列表
# 替换为你的组织名 ORG_NAME="your-enterprise-org" CURRENT_REPO_LIST=$(gh api orgs/$ORG_NAME/repos --jq '.[].full_name') - 步骤2:加载历史扫描状态
从持久化存储中读取之前保存的扫描状态(比如从CI缓存中读取scan-state.json)。 - 步骤3:遍历仓库执行扫描
对每个仓库:- 若仓库不在历史状态中:执行全量扫描
trufflehog github --repo=https://github.com/$REPO_FULL_NAME,扫描完成后记录当前时间和仓库最新SHA(可通过gh api repos/$REPO_FULL_NAME/commits --per-page=1 --jq '.[0].sha'获取)。 - 若仓库在历史状态中:
- 用上述API命令获取
TARGET_SHA。 - 若
TARGET_SHA存在,执行增量扫描:trufflehog github --repo=https://github.com/$REPO_FULL_NAME --since-commit=$TARGET_SHA。 - 若
TARGET_SHA为空,跳过扫描。
- 用上述API命令获取
- 若仓库不在历史状态中:执行全量扫描
- 步骤4:更新扫描状态
移除历史状态中不在当前仓库列表的条目,新增/更新已扫描仓库的状态,重新保存到持久化存储。
4. 边界情况处理
- 默认分支变更:如果仓库默认分支不是
main,在调用GitHub API时添加--branch=your-default-branch参数指定分支。 - 时间格式兼容:确保所有时间参数使用ISO 8601格式,避免GitHub API解析错误。
- 权限配置:确保GitHub CLI拥有组织仓库的
repo权限,能正常访问提交历史。
内容的提问来源于stack exchange,提问作者Emilian Cebuc
相关产品推荐
相关产品推荐

