ROS构建农场
ROS构建农场是支持ROS生态系统的重要基础设施,由 Open Robotics 提供和维护。它们为ROS 1和ROS 2软件包提供源代码和二进制软件包的构建、持续集成、测试和分析。开源软件包有两个托管实例:
https://build.ros.org/ 用于ROS 1软件包
https://build.ros2.org/ 用于ROS 2软件包
如果您打算使用提供的基础设施,请考虑注册`构建农场讨论论坛 <http://discourse.ros.org/c/buildfarm>`__ 以便接收通知,例如有关任何即将到来的更改的通知。
作业和部署
ROS构建农场执行几种不同的作业。对于每种作业类型,您将找到有关它们的详细说明以及它们的工作原理:
release jobs 生成二进制软件包,例如 Debian 软件包
devel jobs 在轮询基础上构建和测试 ROS 软件包的单个存储库
pull_request jobs 通过 Webhooks 触发在单个存储库中构建和测试 ROS 软件包
CI jobs 跨存储库构建和测试 ROS 软件包,可选择使用其他 CI 作业的工件加快构建速度
「
doc jobs
」_ 生成软件包的 API 文档,并从清单中提取信息「
miscellaneous jobs
」_ 执行维护任务,并生成信息数据以可视化构建平台的状态及其生成的构件
创建和部署
上述工作是在软件包「开花」时创建和部署的,即发布到 ROS 1 或 ROS 2。一旦开花成功,并且软件包被纳入 ROS 发行版之一(通过对 rosdistro 提交拉取请求),相应的工作将会被创建。工作的名称编码了它们的类型和目的:1
发布任务:
{distro}src_{platf}__{package}__{platform}__source
构建发布的源代码包{distro}bin_{platf}__{package}__{platform}__binary
构建发布的二进制包
例如,ROS 2 Iron 上 rclcpp 的二进制打包任务(在 Ubuntu Jammy amd64 上运行)被命名为
Ibin_uJ64__rclcpp__ubuntu_jammy_amd64__binary
。开发任务:
{distro}dev__{package}__{platform}
在发布分支上执行 CI 构建
拉取请求任务:
{distro}pr__{package}__{platform}
在拉取请求上执行 CI 构建
例如,对于在Ubuntu Jammy amd64上运行的ROS 2 Iron上的rclcpp的PR工作,其名称为``Ipr__rclcpp__ubuntu_jammy_amd64``。
执行
作业的执行取决于作业的类型:
devel jobs 将根据配置的频率,每次对相应分支进行提交时触发轮询。
pull_request jobs 将由上游 2 仓库的相应拉取请求的 Webhook 触发
release jobs 将在每次发布新软件包版本时触发,即每次此软件包的新 rosdistro 拉取请求被接受时。源码作业是由 rosdistro 分发文件中的版本更改触发的,而二进制作业是由其源码作业的对应部分触发的。
常见问题解答 (FAQ) 和故障排除
我收到来自构建工作失败的 Jenkins 邮件。我该怎么办?
转到引发问题的作业。您可以在Jenkins电子邮件的顶部找到链接。一旦您点击链接进入构建作业,点击左侧的*Console Output*,然后点击*Full Log*。这将给您提供失败构建的完整控制台输出。尝试找到最顶部的错误,因为通常它是最重要的,其他错误可能是后续错误。
电子邮件底部可能会显示``'apt-src build [...]' failed. This is usually because of an error building the package.``这通常暗示缺少依赖项,请参阅2。
我似乎缺少一个依赖项,我该如何找出是哪个依赖项?
基本上有两种选择,a. 更简单,但可能需要多次迭代,b. 更详细,并且可以提供完整的了解以及本地调试。
检查引发问题的发布任务(参见 1.)并定位 cmake 依赖问题。为此,请浏览到 cmake 部分,例如,在 Ubuntu/Debian 构建任务中通过左侧菜单导航到“build binarydeb”部分。通常,CMake Error 会提示 cmake 配置所需的依赖项,在 package manifest 中缺失。修复 manifest 中的依赖项后,重新发布软件包并等待构建服务器的反馈或...
为了获得完整的了解和更快的本地调试,您可以在本地运行发布任务(run the release jobs locally)。这样可以在本地迭代 manifest,直到所有依赖项都被修复。
为什么发布任务失败,而开发任务 / 我的 GitHub Actions / 我的本地构建成功?
这可能有几个潜在原因。首先,发布任务使用最小的 ROS 安装进行构建,以检查所有依赖项是否在 package manifest 中正确声明。开发任务 / GitHub Actions / 本地构建可能在已安装了依赖项的环境中执行,因此不会注意到依赖关系问题。其次,它们可能构建不同版本的源代码。而开发任务 / GitHub Actions / 本地构建通常构建来自 upstream 2 存储库的最新版本,release jobs 则构建最新发布的源代码,即在 release 存储库 3 的相应 upstream 分支中的源代码。
进一步阅读
以下链接提供更多关于构建农场的细节和见解:
https://github.com/ros-infrastructure/ros_buildfarm/blob/master/doc/index.rst - 构建农场基础设施和生成的构建作业的常规文档
http://wiki.ros.org/regression_tests#Setting_up_Your_Computer_for_Prerelease
http://wiki.ros.org/buildfarm - ROS 1构建农场的ROS维基页面(部分*过时*)
https://github.com/ros-infrastructure/cookbook-ros-buildfarm - 安装和配置ROS构建农场机器
- 1
{distro}
是ROS发行版的首字母,{platform}``(``{platf}
)表示软件包构建的平台(及其简短代码),{package}
是正在构建的ROS软件包的名称。- 2(1,2)
“上游”存储库是包含相应ROS 1 / ROS 2软件包原始源代码的存储库。
- 3
“release”仓库是ROS 2基础设施用于发布软件包的仓库,详情请参阅 https://github.com/ros2-gbp/。