尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

如何用 Bazel 从源码构建 Envoy 二进制

如何用 Bazel 从源码构建 Envoy 二进制 如何用 Bazel 从源码构建 Envoy 二进制【免费下载链接】envoyCloud-native high-performance edge/middle/service proxy项目地址: https://gitcode.com/GitHub_Trending/en/envoy当你需要修改 Envoy 源码、裁剪扩展或验证自己的改动时需要把源码编译出一个可运行的 Envoy 二进制。Envoy 的官方构建系统就是 Bazel仓库文档提供了两条完成这一任务的路径直接在宿主机上用 Bazel 构建以及通过 CI Docker 镜像在容器内构建。本文按宿主机直建为主路径展开Docker 路径作为可选分支。适用前提以 docs/root/start/building.rst 为准Linux 目标平台需要较新的发行版文档以 Ubuntu 20.04 LTS 为参照内存约需每核心 2GB例如 8 个超线程核心对应 32GB RAM编译器要求 Clang 18C20 与 tcmalloc 的要求GCC 13 也可用当前 CI 运行 Clang 22见 bazel/README.md 的 Supported compiler versions 一节依赖来自 MODULE.bazel 声明及 Bazel 注册表。安装 Bazelisk 作为 bazel 命令文档建议使用 Bazelisk 安装为bazel以避免 Bazel 版本兼容问题。Linux 上执行sudo wget -O /usr/local/bin/bazel https://github.com/bazelbuild/bazelisk/releases/latest/download/bazelisk-linux-$([ $(uname -m) aarch64 ] echo arm64 || echo amd64) sudo chmod x /usr/local/bin/bazelmacOS 上则是brew install bazelisk。安装构建所需的外部依赖宿主机直建前需要安装一批外部依赖。Ubuntu 上sudo apt-get install \ autoconf \ curl \ libxml2-dev \ libtool \ patch \ python3-pip \ unzip \ virtualenvFedora及其他 Red Hat 系发行版dnf install \ aspell-en \ libatomic \ libstdc \ libstdc-static \ libtool \ libxml2-devel \ lld \ patch \ python3-pipmacOS 上对应brew install coreutils wget libtool go bazelisk clang-format autoconf aspell并且需要安装完整版 Xcode不是仅 Command Line Tools若编译时出现xcrun: error: SDK ... cannot be located文档建议用xcrun --show-sdk-version检查 SDK 版本并按文档命令升级 Command Line Tools。另外两点值得注意Clang 工具链本身不必手装Envoy 使用 Bazel 自动下载的 hermetic Clang 工具链但libxml2必须装在宿主机上上面的包列表已包含。需要 Go 1.24 或更高版本用于构建 BoringSSL 以及格式化 BUILD 文件的 Buildifergo install github.com/bazelbuild/buildtools/buildifierlatest go install github.com/bazelbuild/buildtools/buildozerlatest如果GOPATH未设置默认是$HOME/go可能需要把BUILDIFIER_BIN、BUILDOZER_BIN指到$GOPATH/bin/下对应文件。执行 Bazel 构建在 Envoy 源码根目录执行bazel build envoy即可构建。三个编译模式通过-c控制缺省为fastbuild-O0面向开发速度-c opt-O2 -DNDEBUG -ggdb3 -gsplit-dwarf用于生产构建和性能基准测试-c dbg-O0 -ggdb3 -gsplit-dwarf用于带调试信息的构建。编译器配置上推荐显式加上--configclangbazel build --configclang envoy--configclang使用 Clang 编译器并自动链接 libcLinux 下不需要额外配置--configgcc则使用 GCC 加 libstdc。clang 配 libstdc 的组合没有经过测试文档明确不支持。如果想让 clang 成为默认可追加到源码根目录的user.bazelrcecho build --configclang user.bazelrc内存或 CPU 紧张的机器上可以用--jobsN限制并行任务数例如bazel build --jobs2 envoy也可以把build --jobsX/2写进user.bazelrcX 是系统 GB 数8GB 内存对应build --jobs4防止构建过程因内存不足而崩溃。运行并验证构建出的二进制构建完成后可以从项目根目录直接执行产物。以优化模式构建静态二进制为例bazel build -c opt //source/exe:envoy-static $(bazel info bazel-genfiles)/source/exe/envoy-static --config-path /path/to/your/envoy/config.yaml其中--config-path后面是文档给出的占位路径替换成你自己准备的一个 Envoy YAML 配置文件仓库configs/目录下有大量可直接参考的示例配置后该命令就会用这份配置启动 Envoy能正常启动即说明二进制可用。如果要验证测试套件是否通过用 Bazel 直接跑bazel test //test/...也可以只跑单个测试目标并输出详细日志例如bazel test --test_outputstreamed //test/common/http:async_client_impl_test测试默认同时验证 IPv4 与 IPv6只有单栈环境时用--test_envENVOY_IP_TEST_VERSIONSv4only或v6only收窄。可选分支用 CI Docker 镜像构建如果不想在宿主机上装依赖可以用 CI 同款 Docker 镜像构建文档将其作为快速起步的推荐方式。前提是已安装 Docker在源码根目录执行./ci/run_envoy_docker.sh ./ci/do_ci.sh devdev目标按fastbuild模式构建静态二进制并运行测试产物位于宿主机的/tmp/envoy-docker-build/envoy/source/exe/envoy-fastbuild。要控制产物目录设置ENVOY_DOCKER_BUILD_DIR例如ENVOY_DOCKER_BUILD_DIR~/build ./ci/run_envoy_docker.sh ./ci/do_ci.sh dev此时二进制在~/build/envoy/source/exe/envoy-fastbuild。其他常用目标./ci/run_envoy_docker.sh ./ci/do_ci.sh release.server_only按-c opt构建发布版产物在/tmp/envoy-docker-build/envoy/source/exe/envoy./ci/run_envoy_docker.sh ./ci/do_ci.sh debug.server_only按-c dbg构建调试版产物在/tmp/envoy-docker-build/envoy/source/exe/envoy-debug。两个注意点该脚本在宿主机上以有效 root 身份运行envoyproxy/envoy-build-ubuntu镜像本身需要 4–5GB 磁盘空间。完整的 CI 目标列表见 ci/README.md。可选从发布 tarball 构建如果你手里是发布 tarball 而不是 git 检出构建前多一步版本戳生成。步骤下载并解压发布 tarball如 v1.39.0 对应的 release 资源在解压后的仓库根目录运行python3 tools/github/write_current_source_version.py该脚本生成 bazel/get_workspace_status 在非 git 目录盖章二进制所需的SOURCE_VERSION。为避免 GitHub API 限流可以给GITHUB_TOKEN环境变量提供有效 tokenGITHUB_TOKEN你的token python3 tools/github/write_current_source_version.py再执行bazel build -c opt envoy。构建时定制扩展Envoy 采用模块化构建扩展可以在命令行上增删这对接手二次开发时裁剪二进制最直接。扩展清单在 source/extensions/extensions_build_config.bzlcontrib 扩展在 contrib/contrib_build_config.bzlcontrib 扩展默认只在构建 contrib 可执行文件时才包含。默认禁用的扩展可以显式打开例如启用envoy.filters.http.kill_requestbazel build envoy --//source/extensions/filters/http/kill_request:enabled默认启用的扩展可以显式关闭例如禁用envoy.wasm.runtime.v8bazel build envoy --//source/extensions/wasm_runtime/v8:enabledfalse文档提醒并非所有扩展都可以禁用。这些参数可以持久化到仓库的user.bazelrc或你的.bazelrc。构建 contrib 可执行文件时同理例如bazel build //contrib/exe:envoy-static --//contrib/dynamo/filters/http/source:enabledfalse会在 contrib 构建中关掉 dynamo 扩展。若要产出可复现的发布二进制文档给出的做法是忽略本地.bazelrc、以 opt 模式构建并 strip 符号bazel --bazelrc/dev/null build -c opt envoy.stripped常见问题与限制首次构建很慢文档 docs/root/faq/build/speed.rst 解释了 C 模板与测试框架导致编译开销大建议用本地 SSD 而非远程块存储核心数和每核心 2 GiB 内存的配置可以明显缩短时间。陈旧构建状态bazel clean清除 Envoy 自身的构建/测试产物bazel clean --expunge连同外部依赖产物一起清除两者都不行时文档提到可以手动删除 Bazel 缓存目录通常在~/.cache/bazel删除前确认没有其他项目依赖它。极旧编译器Clang/LLVM 8 及更早版本可能无法编译新版 tcmalloc需要加--define tcmallocgperftools当前支持的编译器要求是 Clang 18 / GCC 13此条主要针对旧工具链环境。Windows项目自 2023 年 8 月起已结束官方 Windows 支持Windows 构建被排除在 CI、发布与安全流程之外构建文档中的 Windows 章节仅描述目标平台要求。完成上述任一路径并看到二进制按预期目录出现或成功执行--config-path启动后构建即告完成后续改动循环就是修改源码 →bazel build envoy→ 运行产物/bazel test这一固定流程。【免费下载链接】envoyCloud-native high-performance edge/middle/service proxy项目地址: https://gitcode.com/GitHub_Trending/en/envoy创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表