Bazel远程缓存API - Bitrise博客

作者:API传播员 · 2025-11-10 · 阅读时间:4分钟

欢迎阅读我们关于 Bazel 远程缓存的系列文章。本系列将深入探讨 Bazel 的远程缓存功能,特别是其 API 规范和客户端实现,帮助您更高效地利用 Bazel 的构建和测试自动化能力。


Bazel 远程缓存 API 简介

无论您是刚接触 Bazel 的新手,还是已经熟悉其使用的老手,本系列文章都将为您提供关于 Bazel 工作原理的深入见解。即使您对文中提到的技术细节不甚了解,也完全可以使用 Bazel,但我们相信这些知识值得深入探讨。

本系列内容概览

  • Bazel 远程缓存 API 技术深度解析
  • Bitrise 远程缓存 API 的服务器端实现
  • 远程执行的相关内容

在本篇文章中,我们将重点介绍 Bazel 的远程缓存功能,特别是其 API 规范和客户端实现。通过在不同环境中复用缓存,您可以显著缩短构建时间。


远程缓存的优势与兼容性

如果您已经在使用 Bazel,借助 Bitrise 的远程构建缓存,您可以轻松快速地设置远程缓存,而无需深入了解其内部实现。无论您使用哪种 CI(持续集成)工具,Bitrise 的远程缓存都能与其兼容。此外,结合 Bitrise CI 使用,您还可以享受共享构建机器和缓存带来的性能提升和成本优化,但这并非强制要求。Bitrise 的远程缓存完全支持其他 CI 提供商或自托管的 CI 环境。


Bazel 远程缓存 API 规范与客户端实现

谷歌为 Bazel 发布了一套基于 Protobuf 的 API 规范,详细描述了缓存客户端与远程服务器之间的交互方式。虽然 Bazel 是这一规范的主要客户端,但该 API 同样适用于其他构建工具。例如,我们正在考虑更新 Gradle 插件的 Bitrise 远程构建缓存,使其符合这一规范。

核心概念与数据结构

Bazel 远程缓存的核心实体是“Action”,它表示一个将在特定平台(如 Linux、macOS 等)上执行的“Command”(包含参数、环境变量等)。以下是关键点:

  • 摘要(哈希)引用:除“ActionResult”外,所有实体都通过其摘要(哈希值)进行引用。例如,每个“Action”包含一个 command_digest 字段,指向相关“Command”的摘要。
  • ActionResult:表示已执行的“Action”的结果,包括标准输出(stdout)、标准错误(stderr)、退出码以及生成的文件和目录等。它通过“Action”的摘要进行引用。

通过缓存机制,客户端可以跳过重复执行相同的“Action”,直接从缓存中读取结果,从而提升构建效率。

客户端与服务器的交互流程

  1. 能力检查:客户端首先调用 GetCapabilities 端点,检查服务器支持的压缩算法、摘要算法和 API 版本等。
  2. 缓存查询:对于每个“Action”,客户端调用 GetActionResult 端点,检查是否已有缓存结果。
  3. 结果下载:如果缓存中存在结果,客户端通过内容寻址存储(CAS)下载相关的 Blob 数据。
  4. 结果上传:如果没有缓存结果,客户端执行“Action”,并通过以下步骤上传结果:
    • 调用 FindMissingBlobs 检查缺失的 Blob。
    • 使用 BatchUpdateBlobsByteStream 端点上传缺失的 Blob。
    • 调用 UpdateActionResult 持久化上传的结果。

Bazel 的模块化架构与远程缓存实现

Bazel 的模块化架构由多个松散耦合的模块组成,每个模块负责实现特定功能。远程缓存功能由 RemoteModule 模块实现。该模块会在已配置的远程缓存 API 上调用 GetCapabilities 端点,验证兼容性,并在后续执行过程中启用远程缓存。

构建与执行流程

在 Bazel 的执行过程中,其核心组件 Skyframe 会并行构建和执行“Action”图。对于每个“Action”,Bazel 会检查是否已有远程缓存结果:

  • 如果存在缓存结果,Bazel 会通过 GetActionResult 端点读取结果,并下载相关的 Blob 数据。
  • 如果没有缓存结果,Bazel 会在本地执行“Action”,并通过 FindMissingBlobsByteStream 等端点上传结果。

总结与展望

本文详细介绍了 Bazel 远程缓存 API 的规范及其客户端实现。通过远程缓存,您可以显著提升构建效率,同时降低资源消耗。在下一篇文章中,我们将深入探讨 Bitrise 远程缓存 API 的服务器端实现,敬请期待。

原文链接: https://bitrise.io/blog/post/bazel-remote-caching-api