Bazel测试依赖本地OpenSSL包失败,沙箱运行问题排查
这种情况完全不正常——Bazel的核心特性之一就是通过沙箱隔离构建/测试环境,避免依赖本地系统的未管理依赖。你的测试报错直接指向/usr/lib/python3/dist-packages/OpenSSL/SSL.py,说明测试过程中Python没有使用Bazel为目标构建的封闭依赖环境,而是偷偷加载了本地系统的OpenSSL模块,这大概率是依赖管理配置出了问题。
为什么会出现这个问题?
你的测试代码依赖的requests、urllib3间接引入了pyopenssl,但这个pyopenssl没有被Bazel纳入依赖管理范围。当Bazel构建测试目标时,没有把正确的pyopenssl包放进测试的runfiles目录,导致Python在找不到Bazel提供的依赖时, fallback到了系统的site-packages路径。而系统安装的pyopenssl和cryptography版本不匹配,才触发了AttributeError: module 'lib' has no attribute 'Cryptography_HAS_TLSEXT_HOSTNAME'这个具体错误。
如何修复并确保测试在沙箱中运行?
这里有几个关键步骤来解决问题:
用Bazel管理所有Python依赖
确保你的项目通过pip_parse(推荐现代Bazel版本)或pip_install规则管理所有Python依赖,包括间接依赖的pyopenssl。把pyopenssl明确添加到你的requirements.txt中,然后重新生成Bazel依赖规则,让Bazel负责拉取、构建并提供这个包给测试目标。检查测试目标的依赖配置
打开你的BUILD文件,确认//master:master_impl_test目标的deps包含了所有必要的依赖,包括py_deps//pypi__pyopenssl(具体标签根据你的依赖规则生成路径调整),确保Bazel会把这个包放进测试的runfiles里。验证沙箱是否正常启用
Bazel在Linux上默认启用沙箱,但有时候可能被命令行参数或配置文件禁用。你可以通过以下命令强制启用沙箱并调试:bazel test --sandbox_debug --nocache_test_results //master:master_impl_test查看输出中的沙箱执行日志,确认测试是在沙箱环境中运行的。如果之前有
--no-sandbox参数,要移除它。清理缓存并重新构建
旧的缓存可能残留了错误的依赖路径,执行以下命令彻底清理后重新测试:bazel clean --expunge bazel test //master:master_impl_test确保Python版本兼容
检查你的Bazel Python规则配置的python_version是否和依赖包兼容,比如如果pyopenssl需要Python 3.8+,而你的Bazel配置用了更低版本,也可能导致依赖加载异常。
内容的提问来源于stack exchange,提问作者Piotr Jachowicz

