bazel远程构建(Remote Execution) -- Buildfarm介绍和部署测试

2023-10-24 07:44

本文主要是介绍bazel远程构建(Remote Execution) -- Buildfarm介绍和部署测试,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Buildfarm是什么?

Buildfarm是一个基于 Python 的分布式编译系统,支持多种语言,包括 C、C++、Java、Python、Ruby 等。BuildFarm 的设计比较灵活,可以根据实际需求进行定制和扩展。它使用一个中心控制节点来管理多个编译服务器,中心控制节点会将编译任务分发给空闲的服务器。BuildFarm 还提供了 Web 界面来方便用户管理编译任务。

目标

通过buildfarm实现bazel远程缓存和远程执行。

要求

buildfarm需要一个backplane 来存储集群成员之间共享的信息。可以使用 redis 服务器来满足此要求。下载/安装 redis-server 实例并在本地主机上运行它。默认的 redis 端口 6379 将由默认的构建场配置使用。redis安装方式参考bazel远程构建(Remote Execution) --- linux安装Redis-CSDN博客。需提前安装和运行redis,否则buildfarm运行时会报找不到可用的redis。

bazel示例工程

从当个文件编译为可执行文件方式,搭建bazel构建工程

创建新目录作为工作区,并添加以下文件:

文件main.cc及内容

#include <iostream>int main( int argc, char *argv[] )
{std::cout << "Hello, World!" << std::endl;
}

文件BUILD及内容

cc_binary(name = "main",srcs = ["main.cc"],
)

一个空的WORKSPACE文件,标识当前目录为bazel工作区

构建bazel的HelloWorld示例,运行如下命令:

bazel run :main

运行构建产物可执行二进制观察输出是否为预期的Hello, World

./bazel-bin/main

上述正常确保机器已正确安装bazel和C++编译器, 这个也是后续测试远程缓存和远程执行的一个工作目标。

Buildfarm下载部署

创建一个目录,然后在下面clone Bazel Buildfarm项目:

mkdir buildfarm
cd buildfarm
git clone https://github.com/bazelbuild/bazel-buildfarm.git
cd bazel-buildfarm

这时候进入了对应的bazel buildfarm目录。 需修改buildfarm项目的.bazelversion文件,将其默认版本号改为当前机器安装的bazel版本号(运行bazel --version即可查看,但需退出buildfarm项目目录再执行查看)。

远程缓存

Buildfarm 群集可以严格用作 ActionCache (AC) 和 ContentAddressableStorage (CAS),以提高构建性能。如下是运行 bazel 客户端的示例

切换到目录bazel-buildfarm,然后执行如下命令:

bazel run src/main/java/build/buildfarm:buildfarm-server $PWD/examples/config.minimal.yml

若是正常,则将在服务器运行时等待,指示它已准备好接收请求。

服务器本身不存储操作结果的内容。它充当提供存储的任意数量的工作线程的端点,因此我们还必须启动单个工作线程。

重新打开一个交互界面,然后执行如下命令:

bazel run src/main/java/build/buildfarm:buildfarm-shard-worker -- --prometheus_port=9091 $PWD/examples/config.minimal.yml

-- option是 bazel 约定,将所有后续参数视为正在运行的应用程序的参数,例如上述的----prometheus_port,而不是使用run。该选项--prometheus_port=9091允许该工作线程与我们的服务器一起运行,该服务器将启动并记录它已在端口9090上启动服务。您还可以为服务器或辅助角色关闭此选项--prometheus_option=0。这也将在工作线程运行时等待,指示它将可用于存储缓存内容。

重新打开一个交互界面,切换到bazel示例工作区目录

bazel clean
bazel run :main --remote_cache=grpc://localhost:8980

执行clean操作是为了清除历史执行的本地工作区缓存,由于我们正在验证重新执行和缓存,因此这可确保我们将执行步骤中的任何操作并与远程缓存进行交互。我们应该尝试检索缓存的结果,然后当我们没有命中时,因为是首次启动了这个内存驻留服务器。 bazel 将上传执行结果供以后使用。如果一切正常,此 bazel 运行的输出不会有任何变化,因为 bazel 不会在每次上传结果时提供输出。

为了证明远端缓存已存储了构建结果,我们需要再次执行以下操作:

bazel clean
bazel run :main --remote_cache=grpc://localhost:8980

现在,这应该在行上打印统计信息,指示您已从缓存中检索操作的结果:

bazel clean
bazel run :main --remote_cache=grpc://localhost:8980

现在,这应该在行上打印统计信息,指示您已从缓存中检索操作的结果:

INFO: 2 processes: 2 remote cache hit.

或者可以换个执行机器,将localhost替换部署远端缓存的上述机器IP即可

远程执行(和缓存)

下面示例中,在本机上只搭建一个worker,使用最少量的配置,保证其在工作区上调用bazel能单次执行一个进程即可

首先,要清除先前缓存操作的结果,请刷新本地 redis 数据库:

redis-cli flushdb

接下来,重新启动 buildfarm 服务器,并删除 worker 的 cas 存储,以确保能执行远程构建(这也可通过在客户端强制指定参数--noremote_accept_cached达到同样效果)。buildfarm server窗口和目录执行如下操作:

  • 中断buildfarm-server运行(即按键 Ctrl+C)
  • 重新启动buildfarm-server
  • bazel run src/main/java/build/buildfarm:buildfarm-server $PWD/examples/config.minimal.yml

您可以从远程缓存步骤让工作线程运行,它不需要重新启动

在其它窗口,客户端工作区中执行如下命令:

bazel clean
bazel run :main --remote_executor=grpc://localhost:8980

运行后窗口打印应该包含如下信息

INFO: 2 processes: 2 remote.

其中的“2 remote”表明您的编译和链接是远程运行的。恭喜,您刚刚通过远程执行构建了一些东西!

容器快速启动

上述方式启动buildfarm较为复杂,需要手动启动redis、buildfarm-server、buildfarm-worker三个服务。可通过如下命令最小化快速启动buildfarm集群:

./examples/bf-run start

备注:examples/bf-run是个shell文件,查看其内容发现,其是封装了buildfarm-redis、buildfarm-server、buildfarm-worker三个docker container的部署、启动和停止等操作。

上述命令将在最新版本上启动所有必要的容器。容器启动后,可以使用如下命令进行构建。

bazel clean
bazel run :main --remote_executor=grpc://localhost:8980

 备注:按容器方式启动后,执行bazel构建报错,提示没有可用的workers, 具体原因不明,后续空闲再定位其原因。

要停止容器,请运行如下命令:

./examples/bf-run stop

下一步工作

我们已经在单台机器上启动了worker 、server和构建bazel,但这些服务可以分布在不同的机器上,以实现“远程”。一般采用大量的workers和少量的servers (在实践中使用了 10:1 和 100:1 的比率),充分整合workers上的大型存储和强大的多核 CPU/GPU能力,使其更高效且专业的为bazel构建执行服务(或其他服务的客户端),并且有专门servers具有大量的网络连接来汇集内容流量。一个全套的buildfarm 部署可以为数百或数千名开发人员或 CI 构建提供服务,使他们能够从 AC/CAS 中彼此的共享其它人构建结构,以及在大量的workers执行并交付构建结果。

Buildfarm 管理器

现在,您可以使用开源的 Buildfarm Manager 在本地或在 AWS 中轻松启动新的 Buildfarm 集群。

wget https://github.com/80degreeswest/bfmgr/releases/download/1.0.7/bfmgr-1.0.7.jar
java -jar bfmgr-1.0.7.jar

打开http://localhost,观察。

参考文件:

Home | Buildfarm (bazelbuild.github.io)

这篇关于bazel远程构建(Remote Execution) -- Buildfarm介绍和部署测试的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/273734

相关文章

闲置电脑也能活出第二春?鲁大师AiNAS让你动动手指就能轻松部署

对于大多数人而言,在这个“数据爆炸”的时代或多或少都遇到过存储告急的情况,这使得“存储焦虑”不再是个别现象,而将会是随着软件的不断臃肿而越来越普遍的情况。从不少手机厂商都开始将存储上限提升至1TB可以见得,我们似乎正处在互联网信息飞速增长的阶段,对于存储的需求也将会不断扩大。对于苹果用户而言,这一问题愈发严峻,毕竟512GB和1TB版本的iPhone可不是人人都消费得起的,因此成熟的外置存储方案开

性能测试介绍

性能测试是一种测试方法,旨在评估系统、应用程序或组件在现实场景中的性能表现和可靠性。它通常用于衡量系统在不同负载条件下的响应时间、吞吐量、资源利用率、稳定性和可扩展性等关键指标。 为什么要进行性能测试 通过性能测试,可以确定系统是否能够满足预期的性能要求,找出性能瓶颈和潜在的问题,并进行优化和调整。 发现性能瓶颈:性能测试可以帮助发现系统的性能瓶颈,即系统在高负载或高并发情况下可能出现的问题

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

Hadoop数据压缩使用介绍

一、压缩原则 (1)运算密集型的Job,少用压缩 (2)IO密集型的Job,多用压缩 二、压缩算法比较 三、压缩位置选择 四、压缩参数配置 1)为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器 2)要在Hadoop中启用压缩,可以配置如下参数

字节面试 | 如何测试RocketMQ、RocketMQ?

字节面试:RocketMQ是怎么测试的呢? 答: 首先保证消息的消费正确、设计逆向用例,在验证消息内容为空等情况时的消费正确性; 推送大批量MQ,通过Admin控制台查看MQ消费的情况,是否出现消费假死、TPS是否正常等等问题。(上述都是临场发挥,但是RocketMQ真正的测试点,还真的需要探讨) 01 先了解RocketMQ 作为测试也是要简单了解RocketMQ。简单来说,就是一个分

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

阿里开源语音识别SenseVoiceWindows环境部署

SenseVoice介绍 SenseVoice 专注于高精度多语言语音识别、情感辨识和音频事件检测多语言识别: 采用超过 40 万小时数据训练,支持超过 50 种语言,识别效果上优于 Whisper 模型。富文本识别:具备优秀的情感识别,能够在测试数据上达到和超过目前最佳情感识别模型的效果。支持声音事件检测能力,支持音乐、掌声、笑声、哭声、咳嗽、喷嚏等多种常见人机交互事件进行检测。高效推

Retrieval-based-Voice-Conversion-WebUI模型构建指南

一、模型介绍 Retrieval-based-Voice-Conversion-WebUI(简称 RVC)模型是一个基于 VITS(Variational Inference with adversarial learning for end-to-end Text-to-Speech)的简单易用的语音转换框架。 具有以下特点 简单易用:RVC 模型通过简单易用的网页界面,使得用户无需深入了

【测试】输入正确用户名和密码,点击登录没有响应的可能性原因

目录 一、前端问题 1. 界面交互问题 2. 输入数据校验问题 二、网络问题 1. 网络连接中断 2. 代理设置问题 三、后端问题 1. 服务器故障 2. 数据库问题 3. 权限问题: 四、其他问题 1. 缓存问题 2. 第三方服务问题 3. 配置问题 一、前端问题 1. 界面交互问题 登录按钮的点击事件未正确绑定,导致点击后无法触发登录操作。 页面可能存在

业务中14个需要进行A/B测试的时刻[信息图]

在本指南中,我们将全面了解有关 A/B测试 的所有内容。 我们将介绍不同类型的A/B测试,如何有效地规划和启动测试,如何评估测试是否成功,您应该关注哪些指标,多年来我们发现的常见错误等等。 什么是A/B测试? A/B测试(有时称为“分割测试”)是一种实验类型,其中您创建两种或多种内容变体——如登录页面、电子邮件或广告——并将它们显示给不同的受众群体,以查看哪一种效果最好。 本质上,A/B测