在本地复现 CI

概述

本页概述了关于在本地复现 CI 构建和测试的一些有用信息。

目前,这些信息仅适用于与 conda 相关的构建和测试。

目标受众

运维人员

开发者

目录

  1. 复现 CI 作业
  2. 其他注意事项
    1. GPU 驱动程序版本
    2. 下载用于测试的构建产物
  3. 局限性
    1. 本地产物无法上传
    2. VPN 访问
    3. 某些构建依赖于 Git 标签中的版本信息

复现 CI 作业

为 RAPIDS CI 提供支持的 GitHub Actions 作业只是一组在我们的 CI 容器内运行的 shell 脚本。

这使得在本地机器上轻松复现 CI 中的构建和测试问题成为可能。

首先,你应该确定特定 GitHub Actions 作业中使用的镜像。

这可以通过检查初始化容器(Initialize Containers)步骤来完成,如下面的截图所示。

确定容器镜像后,可以使用下面的命令将本地仓库挂载到容器中

docker run \
  --rm \
  -it \
  --gpus all \
  --pull=always \
  --network=host \
  --volume $PWD:/repo \
  --workdir /repo \
  rapidsai/ci-conda:cuda11.8.0-ubuntu22.04-py3.10

容器启动后,可以在其中运行任何 CI 脚本

# to build cpp...
./ci/build_cpp.sh

# to test cpp...
./ci/test_cpp.sh

# to build python...
./ci/build_python.sh

# to test python...
./ci/test_python.sh

# to test notebooks...
./ci/test_notebooks.sh

# to build docs...
./ci/build_docs.sh

上述 docker 命令基于以下假设

  • 当前目录是你希望排查故障的仓库
  • 当前目录已检出(checkout)与你正在调试其作业的拉取请求(pull-request)相同的提交(commit)

关于 docker 命令参数的一些说明

  • 大多数 RAPIDS conda 构建在不含 GPU 的机器上进行。只有测试需要 GPU。因此,在本地运行 conda 构建时,可以省略 --gpus 参数
  • --network 参数确保容器可以访问宿主机上的 VPN 连接。测试作业需要 VPN 连接,因为它们需要访问 downloads.rapids.ai 以下载特定拉取请求的构建产物。构建作业可以省略此参数

其他注意事项

在本地运行 CI 作业还有一些额外的注意事项。

GPU 驱动程序版本

RAPIDS CI 测试作业可能在多种 GPU 驱动程序版本之一上运行。在本地复现 CI 测试失败时,重要的是要注意 CI 中使用的驱动程序版本以及本地机器上的驱动程序版本。

这些版本的不一致可能导致测试结果不一致。

通常可以在 CI 机器的作业输出中找到驱动程序版本。

下载用于测试的构建产物

在 RAPIDS CI 工作流程中,构建和测试在不同的机器上进行。

不含 GPU 的机器用于构建,而测试在含 GPU 的机器上进行。

由于这个过程,构建作业的产物必须从 downloads.rapids.ai 下载,测试作业才能运行。

在 CI 中,这个过程是透明发生的。

本地构建缺乏 CI 环境提供的上下文,因此需要用户输入以确保下载正确的产物。

在本地测试运行时,每当遇到 rapids-download-conda-from-s3 命令(例如此处),用户将被提示输入任何缺失的必要环境变量。

下面的截图显示了一个示例。

你可以提前输入这些值以抑制提示。例如

export RAPIDS_BUILD_TYPE=pull-request # or "branch" or "nightly"
export RAPIDS_REPOSITORY=rapidsai/cugraph

export RAPIDS_REF_NAME=pull-request/3258 # use this type of value for "pull-request" builds
export RAPIDS_REF_NAME=branch-25.06 # use this type of value for "branch"/"nightly" builds

export RAPIDS_NIGHTLY_DATE=2023-06-20 # this variable is only necessary for "nightly" builds

./ci/test_python.sh

局限性

在本地运行 CI 脚本时,需要记住一些局限性。

本地产物无法上传

本地作业的构建产物无法上传到 downloads.rapids.ai

如果构建在 CI 中失败,开发者应该在本地修复问题,然后将更改推送到拉取请求。

然后 CI 作业可以运行,修复后的构建产物将可供测试作业下载和使用。

要在本地尝试完整的构建和测试工作流程,你可以手动更新任何使用 rapids-download-conda-from-s3CPP_CHANNELPYTHON_CHANNEL 实例(例如1,2),将其替换为 在我们的 CI 镜像中设置的 RAPIDS_CONDA_BLD_OUTPUT_DIR 环境变量的值。

此值用于设置我们的 CI 镜像中使用的 .condarc 文件的 output_folder(参阅文档)。因此,任何本地构建的包(packages)都将位于此目录中。

例如

# Replace all local uses of `rapids-download-conda-from-s3`
sed -ri '/rapids-download-conda-from-s3/ s/_CHANNEL=.*/_CHANNEL=${RAPIDS_CONDA_BLD_OUTPUT_DIR}/' ci/*.sh

# Run the sequence of build/test scripts
./ci/build_cpp.sh
./ci/build_python.sh
./ci/test_cpp.sh
./ci/test_python.sh
./ci/test_notebooks.sh
./ci/build_docs.sh

VPN 访问

目前,downloads.rapids.ai 仅可通过 NVIDIA VPN 访问。

如果你想在本地运行任何测试作业,需要连接到 VPN 以下载 CI 构建产物。

某些构建依赖于 Git 标签中的版本信息

一些 RAPIDS 项目依赖于存储在 git 标签中的版本信息。

例如,有些项目使用依赖于 conda-build 文档中“Git 环境变量”所述机制的 conda recipe。

当这些标签不可用时,构建可能会因类似以下错误而失败

Error: Failed to render jinja template in /repo/conda/recipes/libcudf/meta.yaml: ‘GIT_DESCRIBE_NUMBER’ is undefined conda returned exit code: 1

要解决此问题,请从上游仓库拉取最新的标签集。

例如,对于 cudf

git fetch \
  git@github.com:rapidsai/cudf.git \
  --tags