如何准备 Bazel 的依赖缓存目录

本文档描述了在 Apollo 项目中准备 Bazel 的依赖缓存目录 (Distribution Directory) 的方法。

Introduction

根 据Bazel 官方指南:在封闭环境中运行 Bazel 的说明,Bazel 的隐式依赖项是在 Bazel 初次运行的时候从网络上拉取的。然而,即使所 有在 WORKSPACE 中指定的依赖项均已到位,这在封闭环境或者网络连接不稳定的状况下依 然会造成问题。

为便利国内开发者,对 Apollo 中使用到的各 Bazel 版本,Apollo 均提供与之对应的 Bazel 隐式依赖压缩包文件。请注意,对不同版本的 Bazel 来说,其隐式依赖项不尽相同 。当 Bazel 版本更新后,请务必按照本文档描述的方法,重新执行一遍。

接下来,我们先熟悉把 Apollo 提供的 Bazel 隐式依赖压缩包解压到依赖缓存目录的流程 。

如何利用 Apollo 提供的 Bazel 隐式依赖压缩包

  1. 在 Apollo 容器中执行bazel version确定 Bazel 版本:

$ bazel version
Build label: 3.5.0
Build target: bazel-out/aarch64-opt/bin/src/main/java/com/google/devtools/build/lib/bazel/BazelServer_deploy.jar
Build time: Wed Sep 2 21:11:43 2020 (1599081103)
Build timestamp: 1599081103
Build timestamp as int: 1599081103

在本示例中的 Bazel 版本为3.5.0。在以下行文中,我们将以BAZEL_VERSION指代之。

  1. 运行如下命令以下载对应的 Bazel 隐式依赖压缩包

wget https://apollo-system.cdn.bcebos.com/archive/bazel_deps/bazel-dependencies-${BAZEL_VERSION}.tar.gz
  1. 将压缩包解压到由环境变量${APOLLO_BAZEL_DIST_DIR}指代的 Bazel 依赖缓存目录

tar xzf bazel-dependencies-${BAZEL_VERSION}.tar.gz
source ${APOLLO_ROOT_DIR}/cyber/setup.bash
mv bazel-dependencies-${BAZEL_VERSION}/* "${APOLLO_BAZEL_DIST_DIR}"

自己动手构建 Bazel 的隐式依赖项的方法

如果您需要的 Bazel 版本 Apollo 未能提供,除了 在GitHub Issues 页 提交 Issue 外 ,您还可以通过如下方法在一台网络连接良好的机器上自己动手构建:

# 克隆对应分支的Bazel源码
git clone --depth=1 -b "${BAZEL_VERSION}" https://github.com/bazelbuild/bazel bazel.git

cd bazel.git

# 构建对应的Bazel隐式依赖压缩文件
bazel build @additional_distfiles//:archives.tar

# 确保${APOLLO_BAZEL_DIST_DIR} 变量已定义,且对应的目录存在
source ${APOLLO_ROOT_DIR}/cyber/setup.bash
[[ -d "${APOLLO_BAZEL_DIST_DIR}" ]] || mkdir -p "${APOLLO_BAZEL_DIST_DIR}"

# 将与该Bazel版本对应的各隐式依赖项全部解压到Bazel依赖缓存目录中
tar xvf bazel-bin/external/additional_distfiles/archives.tar \
  -C "${APOLLO_BAZEL_DIST_DIR}" --strip-components=3

然后,你就可以在 Apollo 容器中顺利执行./apollo.sh build./apollo.sh test 等 命令而无需担心依赖项拉不下来的问题了。