在验证 PR #305 时,注意到 Gitleaks hook 的环境依赖与这次调整的两个本地 hook 有所不同,单独记录一下现状,方便后续讨论。
当前配置与依赖
- repo: https://github.com/gitleaks/gitleaks
rev: v8.24.2
hooks:
- id: gitleaks
entry: python .pre-commit-hooks/gitleaks_tracked.py
always_run: true
pass_filenames: false
这里虽然将 entry 覆盖成了本地 Python 脚本,但没有覆盖上游的 language: golang,所以仍有两层依赖:
- 安装 Gitleaks 需要 Go。 pre-commit 仍会按 Go hook 的方式,通过
go install ./... 安装 Gitleaks。缺少 Go 时,pre-commit 3.0.0 及以上支持自动准备 Go 工具链;已有合适的 Go 或缓存环境时可以复用,并非每次运行都会重新安装。参见上游 hook 配置和 pre-commit 文档。
- 运行包装脚本需要 Python。 Go hook 环境不会为这个脚本创建 Python 虚拟环境,
entry: python ... 仍要求 PATH 中存在 python。在未激活 Python 虚拟环境、系统仅提供 python3 命令时,即使 pre-commit 本身能运行,这个入口也会因找不到 python 而失败。激活提供 python 的虚拟环境可以满足这一依赖,但当前 hook 配置本身并未管理该解释器。
本地验证情况
本次使用 pre-commit 4.6.2,在未激活 Python 虚拟环境时运行检查;此时本机 PATH 中有 python3,但没有 python:
pre-commit run --all-files --show-diff-on-failure
两个已调整的本地 hook 通过,Gitleaks 的输出如下:
check-conflict-markers...................................................Passed
format-ascii-boxes.......................................................Passed
Detect hardcoded secrets.................................................Failed
- hook id: gitleaks
- exit code: 1
Executable `python` not found
将已有 pre-commit Python 环境的 bin 目录加入 PATH 后,全量检查通过。也就是说,这里的 python 入口仍有与此前两个本地 hook 相同的命令可用性依赖。
本次没有清空缓存验证 Go 的首次安装,也没有遇到 Go 安装失败;上面的 Go 依赖说明依据上游配置和 pre-commit 的安装机制。本次只验证了本地 pre-commit,尚未验证 CI 使用的 prek 是否有相同表现。
PR #305 的范围与后续讨论
PR #305 目前只将以下两个本地 hook 改为 language: python,并指定 language_version: python3:
check-conflict-markers
format-ascii-boxes
Gitleaks 配置在该 PR 中保持不变。它的包装脚本还需要调用 gitleaks 程序,因此不能只照搬上述两个 hook 的语言配置,还需要一起考虑扫描器的安装方式。
期望后续通过发布 Python 包的方式,结合 language: python 解决这部分环境依赖:由 Python 包封装扫描入口,并提供或管理所需的 Gitleaks 可执行程序,让 pre-commit 在独立的 Python 环境中安装和运行,避免依赖外部 PATH 中的 python,同时免去本地 Go 工具链的准备。调整时需要保留当前包装脚本对 Git 跟踪文件工作区快照的扫描行为。
在验证 PR #305 时,注意到 Gitleaks hook 的环境依赖与这次调整的两个本地 hook 有所不同,单独记录一下现状,方便后续讨论。
当前配置与依赖
这里虽然将
entry覆盖成了本地 Python 脚本,但没有覆盖上游的language: golang,所以仍有两层依赖:go install ./...安装 Gitleaks。缺少 Go 时,pre-commit 3.0.0 及以上支持自动准备 Go 工具链;已有合适的 Go 或缓存环境时可以复用,并非每次运行都会重新安装。参见上游 hook 配置和 pre-commit 文档。entry: python ...仍要求 PATH 中存在python。在未激活 Python 虚拟环境、系统仅提供python3命令时,即使 pre-commit 本身能运行,这个入口也会因找不到python而失败。激活提供python的虚拟环境可以满足这一依赖,但当前 hook 配置本身并未管理该解释器。本地验证情况
本次使用 pre-commit 4.6.2,在未激活 Python 虚拟环境时运行检查;此时本机 PATH 中有
python3,但没有python:两个已调整的本地 hook 通过,Gitleaks 的输出如下:
将已有 pre-commit Python 环境的 bin 目录加入 PATH 后,全量检查通过。也就是说,这里的
python入口仍有与此前两个本地 hook 相同的命令可用性依赖。本次没有清空缓存验证 Go 的首次安装,也没有遇到 Go 安装失败;上面的 Go 依赖说明依据上游配置和 pre-commit 的安装机制。本次只验证了本地 pre-commit,尚未验证 CI 使用的 prek 是否有相同表现。
PR #305 的范围与后续讨论
PR #305 目前只将以下两个本地 hook 改为
language: python,并指定language_version: python3:check-conflict-markersformat-ascii-boxesGitleaks 配置在该 PR 中保持不变。它的包装脚本还需要调用
gitleaks程序,因此不能只照搬上述两个 hook 的语言配置,还需要一起考虑扫描器的安装方式。期望后续通过发布 Python 包的方式,结合
language: python解决这部分环境依赖:由 Python 包封装扫描入口,并提供或管理所需的 Gitleaks 可执行程序,让 pre-commit 在独立的 Python 环境中安装和运行,避免依赖外部 PATH 中的python,同时免去本地 Go 工具链的准备。调整时需要保留当前包装脚本对 Git 跟踪文件工作区快照的扫描行为。