如何让Bazel使用自定义PyPi镜像源获取Python工具以构建Envoy?
问题
在无法访问公共PyPi的机器上自定义构建Envoy,公司要求使用指定内部代理URL访问PyPi仓库。运行bazel build ...时出现以下错误:
ERROR: An error occurred during the fetch of repository 'pypi__pip_tools': Traceback (most recent call last): File "/home/ubuntu/.cache/bazel/_bazel_ubuntu/b4e0fd0e207e6fdf5e33997b6741cf2d/external/bazel_tools/tools/build_defs/repo/http.bzl", line 132, column 45, in _http_archive_impl download_info = ctx.download_and_extract( Error in download_and_extract: java.io.IOException: Error downloading [https://files.pythonhosted.org/packages/0d/dc/38f4ce065e92c66f058ea7a368a9c5de4e702272b479c0992059f7693941/pip_tools-7.4.1-py3-none-any.whl] to /home/ubuntu/.cache/bazel/_bazel_ubuntu/b4e0fd0e207e6fdf5e33997b6741cf2d/external/pypi__pip_tools/temp12252431299166532778/pip_tools-7.4.1-py3-none-any.whl.zip: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
核心需求是将Bazel获取Python工具时的https://files.pythonhosted.org替换为自定义内部域名。命令行pip已通过python3 -m pip config set global.index-url <new_url_here>完成配置,但该配置对Bazel无效,且错误发生在pip安装阶段(早于pip_install调用)。
解决方案
以下是几种让Bazel使用自定义PyPi源的可行方法:
通过命令行传递pip配置
运行bazel build时,用--repo_env参数直接指定pip的索引URL,让Bazel拉取Python依赖时使用内部源:bazel build --repo_env=PIP_INDEX_URL=<你的内部PyPi地址> ...若内部源需要信任主机配置,可一并添加:
bazel build --repo_env=PIP_INDEX_URL=<你的内部PyPi地址> --repo_env=PIP_TRUSTED_HOST=<内部源域名> ...配置Bazel全局文件
在用户目录下创建或编辑.bazelrc文件,写入pip配置参数,后续构建会自动应用:build --repo_env=PIP_INDEX_URL=<你的内部PyPi地址> build --repo_env=PIP_TRUSTED_HOST=<内部源域名>重定义Python工具仓库
针对pip_tools的拉取错误,可在WORKSPACE文件中重新定义该仓库,指定从内部源下载:http_archive( name = "pypi__pip_tools", urls = ["<内部源地址>/pip_tools-7.4.1-py3-none-any.whl"], sha256 = "对应内部包的SHA256哈希值", type = "zip", )需确保内部源存在对应版本的
pip_tools包,且哈希值匹配。解决证书信任问题
针对次要的PKIX错误,可通过Bazel的JVM参数指定内部CA证书:bazel build --jvmopt=-Djavax.net.ssl.trustStore=/path/to/your/ca-cert.jks ...也可将CA证书添加到系统信任存储,让Bazel的Java环境识别内部证书。
内容的提问来源于stack exchange,提问作者merlin2011
相关产品推荐
相关产品推荐

