推送代码之后:怎么自动跑代码安全扫描
这篇讲怎么让分支上一有新提交,就自动做安全扫描。看完你可以让系统管理员先接入 AngusSecurity,再由仓库管理员打开 本仓自动安全扫描,并分清 git push、网页提交和合并拉取请求会不会触发扫描、结果在哪看。 配置分两层:系统管理员先为整个实例接入 AngusSecurity,仓库管理员再为单个仓库打开 本仓自动安全扫描。下文以仓库 xlliu/e2e-license-gate 为例对照,这个实例的系统集成已经开通,该仓库
这篇讲怎么让分支上一有新提交,就自动做安全扫描。看完你可以让系统管理员先接入 AngusSecurity,再由仓库管理员打开 本仓自动安全扫描,并分清 git push、网页提交和合并拉取请求会不会触发扫描、结果在哪看。
配置分两层:系统管理员先为整个实例接入 AngusSecurity,仓库管理员再为单个仓库打开 本仓自动安全扫描。下文以仓库 xlliu/e2e-license-gate 为例对照,这个实例的系统集成已经开通,该仓库的 本仓自动安全扫描 也已经打开。
1. 系统管理员:接入 AngusSecurity
这一步整个实例只需要做一次。入口是 管理 → 安全设置,地址是 https://git.anguskit.com/management?tab=security,页面标题是 AngusSecurity 集成。
以这个实例为例,页面上的状态是:
-
配置启用:已启用。它对应部署配置里的
angus.git.external-security.enabled。 - 平台可达:正常,表示 AngusGit 能连上 AngusSecurity。
- 最近回调:1 小时前,也就是 AngusSecurity 最近一次回传扫描结果的时间。
- 页面上还有 开通集成 和 轮换 Secret 两个按钮。开通集成会注册一个用来发送扫描任务的客户端,并保存密钥;轮换 Secret 会让旧密钥失效。集成已经启用时,不必再点它们。
如果部署配置还没打开,页面会提示先设置 angus.git.external-security.enabled=true,对应的环境变量名是 ANGUS_GIT_EXTERNAL_SECURITY_ENABLED。没有修改过服务地址时,页面说明里的默认地址是 http://127.0.0.1:1811。改完配置后要重启 AngusGit。
同一页下方是 租户安全策略默认值,新建的仓库会沿用这些设置。这个实例当前的默认值是:
- 新仓库默认打开全部五项检测能力:代码安全、依赖/制品漏洞、密钥检查、许可证合规、代码质量。
- 未通过时拒绝合并 是关闭的。
- 漏洞门禁阈值 是 低危,许可证门禁 是 不兼容时拒绝。这里的门禁指达到条件就拦住合并的规则,具体配法见文末参考里的两篇门禁文章。
-
定时扫描 是关闭的。关闭时页面不显示 Cron 输入框;打开之后,输入框旁会出现说明「使用 Quartz Cron,例如每天 02:00:
0 0 2 * * ?」。Cron 是一种用几段字段描述执行时间的写法,Quartz Cron 共六段,第一段是秒。如果并不打算启用定时扫描,不要为了看输入框而打开开关并保存。
仓库自己的设置可以覆盖这些默认值。例如 e2e-license-gate 就把漏洞阈值改成了高危,并打开了拒绝合并。
2. 仓库管理员:打开本仓自动扫描
自动扫描需要每个仓库单独打开。进入 仓库设置 → 安全(地址带 ?tab=settings§ion=security),这一节的标题是 安全,右侧的 仓安全详情 可以跳到仓库安全详情页。
xlliu/e2e-license-gate 当前的开关如下:
| 开关 | 状态 | 作用 |
|---|---|---|
| 本仓自动安全扫描 | 开 | 总开关,见表后说明 |
| 代码安全 | 开 | 推送时检查源码里的安全问题,参与漏洞门禁 |
| 依赖/制品漏洞 | 关 | 推送时检查依赖里的已知漏洞,参与漏洞门禁 |
| 密钥检查 | 开 | 推送时检查代码里的密钥和凭证,参与漏洞门禁 |
| 许可证合规 | 开 | 识别依赖许可证,参与许可证门禁 |
| 代码质量 | 关 | 检查代码质量,不参与合并门禁 |
| 未通过时拒绝合并 | 开 | 检查没完成时等待,门禁没通过时拒绝合并 |
本仓自动安全扫描 是总开关,页面说明是「默认关闭。关闭后推送不再自动检查;手动检查和已启用的定时检查仍可用。」
自动扫描打开时,至少要保留一种检测能力,否则保存会被拦下,提示「已开启自动扫描时,请至少选择一种能力。」保存成功时提示「安全设置已保存」。修改这些设置需要 SecurityScans:EXECUTE 权限。如果页面上已经是想要的值,就不必再点 保存更改。
另外,仓库安全详情页顶部的能力标识只点亮了密钥检查和许可证合规,而设置页里代码安全的开关是打开的:两处读取的不是同一组字段,所以显示可能不一致。
3. 哪些操作会触发扫描
自动扫描监听的是「分支上有了新提交」这件事,命令行 git push 只是其中一种。在网页上修改文件并提交、在拉取请求页点击合并,同样会让分支上有新提交,从而把扫描任务发给 AngusSecurity。
| 操作 | 会不会扫描 | 说明 |
|---|---|---|
git push 推送分支 |
会 | 扫描这次推上来的最新提交 |
| 网页上编辑文件并提交 | 会 | 和命令行推送的处理方式相同 |
| 拉取请求页点合并 | 会 | 扫描目标分支上的新提交 |
| 只是新建一个拉取请求 | 不会为这个动作再扫一遍 | 已有扫描结论时直接挂上 |
| 默认 10 分钟内同一提交再次出现 | 不再发送 | 记一条跳过 |
| 仓库已归档 | 不会 | 归档仓库是只读的,推送不进去 |
表里有几行需要展开说明:
- 在拉取请求页合并时,目标分支上的新提交会被发给 AngusSecurity。如果用的是变基合并,而源分支也有了新提交,还会再发一次。
- 只新建拉取请求时,不会为这个动作重新扫描。如果源分支已经有一次已完成的扫描,拉取请求的状态检查(拉取请求页面上汇总各项自动检查结果的区域)会直接挂上已有的结论。
- 同一提交、同样的检测能力、同样的门禁设置,在默认 10 分钟内再次出现时,不会重复发送扫描任务,只在历史里记一条跳过,这就是去重。修改过门禁阈值后,同一提交不会被这次去重拦下。
扫描在 AngusSecurity 上异步执行,推送本身不用等扫描结束。如果希望新建拉取请求时就带上扫描结论,要么让源分支先被扫描过,要么打开 未通过时拒绝合并;打开后,还没有结论的拉取请求会先显示「等待对提交 … 的安全检查」。
4. 手动扫描和定时扫描
手动扫描 不受 本仓自动安全扫描 开关影响。在仓库安全详情页点 立即扫描,会打开标题为 触发安全扫描 的对话框,说明是「选择能力与扫描级别后投递至 AngusSecurity。」
对话框会按仓库当前的安全画像预先勾选能力。以这个仓库为例,预勾的是 密钥检查 和 许可证合规,代码安全、依赖/制品漏洞、代码质量没有勾选。扫描级别 是 标准,另外还可以选快速或深度;分支 是 main;强制重扫(忽略去重) 默认不勾。只想查看选项时点 取消,确认要补扫时再点 开始扫描。
如果这次扫描和近期的扫描相同,会提示「与近期扫描相同,已跳过(可勾选强制重扫)」。确实需要重扫时,再勾选 强制重扫(忽略去重)。
定时扫描 配置在租户策略里,同样不受仓库自动扫描开关影响。到了设定的时间,系统会扫描已有安全画像的仓库的默认分支,每次最多发起 20 个仓库的扫描。这个实例的 定时扫描 是关闭的,所以页面上没有出现 Cron 输入框。
5. 扫描结果在哪看
每次扫描的触发方式和状态,都能在仓库安全详情页的 扫描历史 里看到。以 e2e-license-gate 为例,最近几条记录是:
| 状态 | 触发 | 门禁结果 | 分支 |
|---|---|---|---|
| 已完成 | 推送 | 未通过 | e2e-git07@591d671 |
| 已完成 | 手动 | 通过 | main@d3ebc5a |
| 已完成 | 推送 | 未通过 | e2e-x03@d3ebc5a |
| 不完整 | 推送 | 已跳过 | e2e-x03@cb1dc56 |
| 已完成 | 推送 | 通过 | e2e-git08@1f78310 |
状态列显示 已完成 或 不完整,门禁结果列显示 未通过、通过 或 已跳过。较早的记录旁边会注明「同一分支已有更新的检查,更早的结果可能已被清理」。每一行都有 打开扫描任务,点进去可以看这次任务的明细。
拉取请求上的 AngusSecurity 行,采用的是该提交最新一次参与判定的扫描。对照上表:e2e-git08@1f78310 的推送扫描门禁结果是通过,对应 #1 的成功说明;e2e-x03@d3ebc5a 的推送扫描是未通过,但之后同一提交又做了一次手动扫描,结果是通过,所以 #4 的检查行写的是漏洞门禁已通过。
侧栏 安全 里的 扫描历史 是跨仓库的同类列表,触发方式除了推送和手动,还有 定时。这个仓库的历史里目前没有定时扫描的记录。
6. 配了却没有扫描时怎么排查
| 你看到的 | 原因 | 怎么处理 |
|---|---|---|
| 「尚未接入 AngusSecurity」 | 集成没开通 | 系统管理员按第 1 节开通 |
| 配置启用 为 未启用 | 部署配置没打开 | 设 angus.git.external-security.enabled=true 后重启 |
| 平台可达 为 不可达 | AngusGit 连不上 AngusSecurity | 检查 AngusSecurity 是否在运行、地址和网络是否通 |
| 有了新提交,历史里却没有新记录 | 本仓自动安全扫描 关着,或一种能力都没开 | 打开总开关,并至少保留一种能力 |
| 历史里是跳过 | 默认 10 分钟内,同一提交和同样设置已经扫过 | 用手动扫描并勾选强制重扫 |
| 历史里状态是 失败 | AngusSecurity 拉取代码或执行扫描出错 | 点 打开扫描任务,到 AngusSecurity 查看原因 |
| 历史里是 不完整 | 这次扫描结果没收全 | 再扫描一次 |
扫描结果不完整时,对应拉取请求上的说明会是「检查结果不完整,请重新检查」。
常见问题
每次推送都扫描,会不会很慢?
推送不会变慢,因为扫描是异步进行的,不会挡住推送。而且同一提交在默认 10 分钟内、检测能力和门禁都没变时,不会重复发起扫描。
能不能只扫描 main,不扫功能分支?
目前做不到。自动扫描跟着有新提交的那条分支走,没有按分支排除的开关。而且功能分支的扫描结果,正是拉取请求上 AngusSecurity 那一行的来源。
打开了自动扫描,合并会被拦住吗?
不会自动拦住。自动扫描只负责发起扫描和记录结果;要拦住合并,还需要打开 未通过时拒绝合并。示例仓库这两个开关都已打开。注意租户默认值里拒绝合并是关闭的,所以新建的仓库一开始也是关闭的。
小结
让推送后自动扫描,需要实例和仓库两层配置都到位。在这个实例里,管理 → 安全设置 已经显示配置启用、平台可达;xlliu/e2e-license-gate 的 本仓自动安全扫描 也已打开,其中代码安全、密钥检查、许可证合规开启,依赖/制品漏洞和代码质量关闭。之后无论是 git push、网页提交还是拉取请求合并,只要分支上有了新提交,就会把扫描任务发给 AngusSecurity;只新建拉取请求不会额外扫描,定时扫描目前也是关闭的。需要补扫时,打开手动扫描对话框,确认能力和分支后点 开始扫描。
安全扫描在团队版、企业版和云服务中提供,社区版没有 安全 菜单。
结论: 实例接入 AngusSecurity、仓库打开本仓自动安全扫描之后,分支上每有一次新提交,最新提交就会交给 AngusSecurity 扫描;合并会不会被拦住,取决于是否打开「未通过时拒绝合并」。
参考文章
Originally published by Dev.to Security. Aggregated on AIWithGhost for educational purposes — full credit and traffic to the original publisher.



