使用 rules_nixpkgs 的 Bazel 远程执行

Tweag 开发了 rules_nixpkgs ,让 Bazel 用户能利用 Nix 的可重现构建和丰富的包注册表。该规则集在需要复杂依赖管理和维护统一构建环境的工作中特别有利。

rules_nixpkgs 与远程执行不兼容,这是个主要限制,因为远程执行可能是人们转向 Bazel 的主要原因,而 rules_nixpkgs 提供了配置密封工具链的好方法,这是可靠远程执行的重要因素,相关长期未解决的开放问题表明没有简单的解决方案。Tweag 研究了在 Bazel eXchange 2022 上提出的有前景的解决方案(记录),但这些想法从未在公共概念验证中实现。

本文将介绍新的远程执行基础设施仓库,并指导如何理解和复制它如何与 rules_nixpkgs 实现远程执行:

  • 远程执行限制:使用 rules_nixpkgs 时,Bazel 会使用 nixpkgs 的包而不是主机系统的包,构建 C++项目时不会用 /usr/bin 下的 gcc 编译器,而是用 Nix 指定的编译器。Bazel 区分导入外部依赖的动作和常规构建动作,前者在本地执行,后者可通过远程执行分发,rules_nixpkgs 属于前者,在本地下载安装依赖,远程执行时会失败。
  • 远程执行的初始设置:使用 Buildbarn 提供远程执行端点和基础设施,使用 bb-deployments 仓库的示例测试设置,需有工作的 Buildbarn 基础设施(如 Kubernetes 集群),可参考指南在 AWS 上设置集群。

    • 不使用 rules_nixpkgs 测试远程执行:使用 @abseil-hello Bazel 目标,获取 Buildbarn 执行服务的端点,更新 .bazelrc 使用远程执行端点,尝试使用远程执行基础设施构建目标。
    • 使用 rules_nixpkgs 测试远程执行:更新 .bazelversionWORKSPACE 文件,创建新的 cc_binary 目标,更新 Buildbarn 工具链,尝试构建应用,会因执行器不识别 Nix 而失败,可通过配置执行器通过 NFS 访问共享的 /nix/store 来解决。
  • 基于 NFS 的解决方案:解决方案涉及一个 Nix 服务器,在 Bazel 构建环境中管理和同步 Nix 依赖,工作流程为在 bazel buildrules_nixpkgs 将 Nix 派生构建并复制到远程 Nix 服务器,服务器通过 NFS 挂载共享 /nix/store 目录树给执行器,构建时所需依赖已可用。实现上需对 Buildbarn 基础设施进行更改,包括一个 Nix 服务器(可通过 SSH 访问)和带有导出 NFS 共享的 Kubernetes 执行器,需在 SSH 配置中创建远程服务器条目并设置 BAZEL_NIX_REMOTE 环境变量。
  • 再次测试远程执行:设置新环境后再次尝试构建项目,应能看到与 Nix 服务器通信的信息,构建成功。
  • 结论:探讨了将 rules_nixpkgs 与 Bazel 远程执行集成的挑战和解决方案,存在缓存清除和 NFS 性能等问题,需要更紧密地与 Bazel API 集成来跟踪 Nix 路径使用等。
  1. Bazel 有一个实验性功能可使可远程执行的仓库规则动作,但能力有限无法支持 rules_nixpkgs 用例。
阅读 193
0 条评论