在 AWS 上从零开始设置 Incredibuild 构建系统

Blog
Author:
Ori HochOri Hoch
Published On:
3月 14, 2022
Estimated reading time:
2 minutes

Incredibuild 构建系统包括多个组件,它们相互作用以加速构建。在这篇文章中,我将描述如何在 AWS 上设置该系统。对于想要了解更多有关 AWS Incredibuild 系统的人而言,这会非常有用。

这是我们关注使用按需 AWS EC2 机器的两篇文章的第一部分。在第二部分中,我们将学习如何使用竞价实例来实现自动化资源管理和更好的成本效益。

先决条件

要完成本文中列出的步骤,您需要拥有一个具有完全管理员权限的 AWS 帐户和一个 Incredibuild 许可证。

假定您对 Linux 和命令行了解很少。

高级架构概述

  • VPC所有 Incredibuild 服务器都将位于专用的虚拟私有云 (VPC) 下。
  • Incredibuild-coordinator唯一一个在互联网上公开的组件,用于协调代理服务器之间的工作负载。我们将使用此服务器来启动构建,它本身也将充当代理。
  • Incredibuild 代理:代理服务器处理构建工作负载。我们将使用一个自动缩放组,以便我们根据要求动态分配这些服务器。

VPC 和网络组件

我们将从创建托管所有支持网络组件的 VPC 开始。我们将创建以下网络组件:

  • VPC:指定 AWS 区域中的孤立虚拟网络
  • Subnet:VPC 区域内指定可用区中的子网
  • Internet Gateway:允许访问公共互联网
  • Route to the internet gateway:处理从子网到互联网网关的路由
  • Security Group:定义允许访问实例的端口和 IP 地址

第一步是登录 AWS 帐户。在顶部搜索框中键入 “VPC” 并单击 VPC 服务。在右上角,检查您是否选择了希望在其中创建所有组件的区域。

在左侧边栏中,单击 “Your VPCs”,然后选择 “Create VPC” 并输入以下内容:

  • 名称: “Incredibuild”
  • IPv4 CIDR 块: “10.0.0.0/16”
  • 这允许您为此 VPC 分配 65534 个内部 IP 地址
  • 单击 “Create VPC”

接下来,单击 “Subnets” 并选择 “Create subnet.”,然后输入以下内容:

  • VPC:选择 “Incredibuild” VPC
  • 子网名称: “incredibuild-01”
  • IPv4 CIDR 块: “10.0.0.0/24”
  • 这允许您为此子网分配 254 个内部 IP 地址
  • 单击 “Create subnet”

最后,单击 “Internet Gateways”,然后单击 “Create internet gateway” 并输入以下内容:

  • 名称: “incredibuild”

互联网网关为您的实例提供对外部互联网的访问。

在您创建的互联网网关页面中,单击 “Actions” 并选择 “Attach to VPC”。然后,选择 “Incredibuild” VPC 并单击 “Attach internet gateway”

在左侧边栏中,单击 “Route Tables”。在路由表中,查看连接到 “Incredibuild” VPC 的路由表的 VPC 列。右键单击该列并选择 “edit routes”。单击 “Add route” 并为新路由填写以下内容:

  • 目的地: “0.0.0.0/0”
  • 目标:键入 “Internet Gateway” 并选择 “Incredibuild” 互联网网关
  • 单击 “Save changes”

此操作用于指示将所有非内部流量路由到外部互联网。

在左侧边栏中,单击 “Security Groups”,然后选择 “Create security group” 并输入以下内容:

  • 安全组名称: “Incredibuild”
  • 范围: “VPC”,选择 “Incredibuild” VPC
  • 入站规则:单击 “Add Rule” 并输入以下规则:
  • 类型:“All TCP”,来源: “My IP”
  • 类型: “SSH”,来源: “Custom”: “0.0.0.0/0”
  • 单击 “Create security group”

在左侧边栏中,单击 “Security Groups”,然后右键单击 “Incredibuild” 安全组并选择 “Edit inbound rules”。单击 “Add Rule” 并输入以下内容:

  • 类型: “All TCP”
  • 来源:“custom”,然后在搜索框中键入 “Incredibuild” 并选择 Incredibuild 安全组。
  • 单击 “Save rules”

此安全组将允许从您的外部 IP 地址访问实例上的任何端口,还允许此安全组内的实例之间进行内部通信(以便 coordinator 和代理之间进行通信)。我们还允许从任何 IP 进行 SSH 访问,这样我们能够使用 AWS 连接功能轻松连接到实例,而无需设置 SSH 客户端和密钥。

Incredibuild coordinator 实例

coordinator 实例是将工作分配给代理的主要实例。为简单起见,我们将使用同一台服务器来启动构建并作为代理。

在 AWS 控制台顶部的搜索栏中键入 “EC2” 并单击 EC2 服务。

在左侧边栏中,单击 “Instances”,然后选择 “Launch instances” 并输入以下内容:

  • 实例类型: “Ubuntu Server 20.04 LTS (HVM), SSD Volume Type 64-bit”
  • 实例类型: “t2.medium”
  • 网络 VPC: “Incredibuild”
  • 子网: “incredibuild-01”
  • 自动分配公共 IP: “Enable”
  • 存储根大小:增加到 “20”
  • 标签: “Name” = “incredibuild-coordinator”
  • 分配现有安全组: “Incredibuild”
  • 启动(出现提示时,选择创建新密钥对并安全保存)

在左侧边栏中,单击 “Instances” 并等待实例状态变为 “Running”。开始运行后,右键单击 incredibuild-coordinator 实例并单击 “Connect”,在连接屏幕中再次单击 “Connect” 按钮。终端窗口应在服务器上打开一个 shell 会话。

安装 Incredibuild coordinator 时,需要从 Incredibuild 获取 Incredibuild 安装二进制文件的链接(查看此链接以获取免费试用版)。

获得该链接后,输入以下命令:

wget -Oincredibuild.ubin URL

输入以下命令以安装 coordinator:

sudo bash ./incredibuild.ubin install -i -C -S -A /etc/Incredibuild

安装参数说明:

  • install -i:指示安装 IncredBuild 组件
  • -C -S:安装 coordinatorinitiator helper 组件
  • 这包括所有 Incredibuild 组件,它们将允许我们从该服务器启动构建并将该服务器用作构建任务的代理。也可以将每个组件安装在专用服务器上,有关详细信息,请参阅 Incredibuild 文档
  • -A /etc/Incredibuild:指定 Incredibuild 数据目录

您现在可以关闭终端窗口并返回实例列表,复制 incredibuild-coordinator 实例的公共 IP,并使用以下 URL 访问 Incredibuild 网页用户界面(将 COORDINATOR_IP 替换为公共 IP):http://COORDINATOR_IP :8080

  • 请注意,我们在安全组中添加了一条允许您的 IP 访问此实例上的任何端口的规则。这仅允许您访问 8080 端口。如果您的 IP 更改,您应该编辑安全组并更新为您的新 IP。

注册 Incredibuild 许可证时,单击 “Coordinator Monitor” 并等待,直到 “Checking Status…” 消息被替换为 “Coordinator Settings” 按钮。单击该按钮,然后单击 “License” 选项卡,再单击 “Generate Key File”。下载密钥文件并将其发送给您的 Incredibuild 代表进行注册。您应该获得一个许可证文件,您应该通过单击 “Choose File”,然后单击 “Load File” 从同一位置上传该文件

您现在应该能够看到您的许可证注册详细信息,并且可以开始使用 Incredibuild 系统。

构建 C++ 项目示例

Incredibuild 安装包括一个 C++ 项目示例,我们可以使用它来测试 Incredibuild Coordinator 并确保一切正常。

首先,我们需要减少 Incredibuild 系统默认需要的最小 CPU 内核数量,以适应我们使用的较小实例。在 Incredibuild 网页用户界面中,单击 “Agent Settings” 并在 “General” 选项卡下将 “minimum local cores for build” 修改为 “2”

连接到 Incredibuild-coordinator 实例 (AWS EC2 -> instances -> connect) 并运行以下命令来安装所需的构建依赖项:

sudo apt-get update && sudo apt-get install -y build-essential

build-essential 软件包中包括编译 C++ 项目示例所需的全部构建工具。

要使用 Incredibuild 系统启动编译,可运行以下命令:

cd /opt/incredibuild/samples/make_build
ib_console make -j 20
  • ib_console make -j 20这就是 Incredibuild 魔法发生的地方。“ib_console make” 命令是标准 make 命令的封装器,它将 make 任务分配给 Incredibuild 代理。-j 20 指示 Make 运行 Incredibuild 分配给代理的 20 个并行编译进程。对于实际项目,应该根据可用的代理和编译任务测试理想的并行进程数量。

编译应该很快完成,因为它只是一个用于验证安装的非常小的示例项目。

登录到 coordinator 网页用户界面并单击 “Build History”,此时您应该会看到名为 “Build 1” 的构建:

单击该构建的操作按钮 -> 打开 -> 新选项卡。您可以查看构建详细信息,单击不同的选项卡可以查看可用的详细信息。

Incredibuild 代理实例

代理实例处理从 coordinator 分配给它们的工作负载。我们将使用 AWS 自动缩放组根据需要动态分配代理。这样,在不使用时可以缩小到 0,并在需要时轻松扩展到所需的尽可能多的代理。

首先,我们将创建一个代理实例,然后我们将使用它来创建一个映像,将其用作自动缩放组的模板。

前往 AWS Console -> EC2 -> Instances -> 单击 “Launch Instances” 并输入以下内容:

  • 实例类型: “Ubuntu Server 20.04 LTS (HVM), SSD Volume Type 64-bit”
  • 实例类型: “t2.medium”
  • 网络 VPC: “Incredibuild”
  • 子网: “incredibuild-01”
  • 自动分配公共 IP: “Enable”
  • 存储根大小:增加到 “20”
  • 标签: “Name” = “incredibuild-agent”
  • 分配现有安全组: “Incredibuild”
  • 启动(出现提示时,选择您为 coordinator 创建的密钥对)

通过单击实例列表中的 incredibuild-coordinator 实例获取 coordinator 内部 IP。

等待代理实例状态变为 “Running”,然后连接到代理实例并运行以下命令:

在环境变量中设置 coordinator 内部 IP(将 “IP” 替换为 coordinator 的实际内部 IP):

COORDINATOR_INTERNAL_IP=IP

安装 Incredibuild coordinator 时,需要从 Incredibuild 获取 Incredibuild 安装二进制文件的链接。获得该链接后,输入以下命令(将 url 替换为下载 url)

wget -Oincredibuild.ubin URL

输入以下命令安装代理:

sudo bash ./incredibuild.ubin install -i -H -O $COORDINATOR_INTERNAL_IP -A /etc/Incredibuild

安装参数说明:

  • install -i指示安装 incredibuild 组件
  • -H安装 Incredibuild helper 组件
  • 这是使用此实例作为代理处理来自 coordinator 的构建任务的相关组件。
  • -O $COORDINATOR_INTERNAL_IP将 helper 连接到此 coordinator
  • -A /etc/Incredibuild:指定 Incredibuild 数据目录

您现在应该能够在 coordinator 网页用户界面 -> Coordinator Monitor 中看到此代理:

现在代理实例已准备就绪,我们可以创建一个映像和自动缩放组,以根据需要动态创建/终止多个代理。

右键单击 ‘incredibuild-agent’ 实例并单击 “Stop instance” 来停止代理实例。停止后,再次右键单击实例并单击 “Image and templates” -> “Create Image”。对于 “Image name”,输入 ‘incredibuild-agent’ 并单击 “Create Image”

等待映像在 EC2 -> Images -> AMIs 上可用。

映像可用后,您可以在实例列表中右键单击 ‘incredibuild-agent’ 并单击 “Terminate instance”来终止该实例。

EC2 -> Instances -> Launch Templates.单击 “Create launch template” 并填写以下详细信息:

  • 启动模板名称: “incredibuild-agent”
  • AMI:搜索 “incredibuild-agent” 并选择您创建的映像
  • 实例类型: “t2.medium”
  • 密钥对:选择您之前创建的现有密钥对
  • 网络接口:添加网络接口:
    • 子网: “incredibuild-01”
    • 安全组: “Incredibuild”
    • 自动分配公共 IP: “enable”
  • “Create launch template”

EC2 -> Instances -> Auto Scaling -> Auto Scaling Groups.单击 “Create an Auto Scaling group” 并填写以下详细信息:

  • 名称: “incredibuild-agents”
  • 启动模板: “incredibuild-agent”
  • VPC: “Incredibuild”
  • 子网: “incredibuild-01”
  • 组大小:
    • 期望值: “3”
    • 最大值: “3”
  • 标签: “name” = “incredibuild-agent”
  • “Create Autoscaling Group”

现在您可以前往实例列表,您应该会看到正在创建 3 个 incredibuild-agent 实例。启动后,您可以登录到 incredibuild-coordinator 网页用户界面并在 “Coordinator Monitor” 选项卡下查看它们。

使用代理实例构建大型项目

现在一切准备就绪,可以使用我们创建的代理实例构建一个大型项目。我们将构建一个大型 C++ 项目 opencv

为简单起见,我们将使用 coordinator 服务器来启动构建,但这可以通过不同的专用服务器或您的 CI 系统轻松完成。查看 Incredibuild Linux 文件了解更多详细信息。

将 SSH 应用到 coordinator 服务器并运行以下命令:

安装构建 opencv 所需的构建依赖项:

sudo apt-get update &&\
sudo apt-get install -y python3-dev libiberty-dev cmake

克隆 opencv GitHub 仓库并准备运行构建:

cd ~
git clone https://github.com/opencv/opencv.git
cd opencv
mkdir build

运行构建:

cd ~/opencv/build
cmake ..
ib_console make -j 20
  • cmake 是用于准备构建的标准工具
  • ib_console make -j 20通过 Incredibuild 帮助器运行 make,其中包含 Incredibuild 在代理之间无缝分配的 20 个并行进程。

在构建时,登录到 coordinator 网页用户界面并在 “Coordinator Monitor” 选项卡下检查代理中的 CPU 负载。您可以在 “Build History” 下跟踪构建进度和任务,就像我们之前创建的示例构建一样。

放大或缩小

完成构建后,您可以通过编辑自动缩放组并将期望值设置为 “0” 来终止代理实例:

EC2 -> Auto Scaling -> Auto Scaling Groups -> 单击 “Incredibuild agent” 组 -> 单击组详细信息标题旁边的 “edit” 按钮并设置以下内容:

  • 所需容量: “0”
  • 最小容量: “0”
  • 单击 “Update”

您现在可以在 EC2 Instances 列表中看到正在终止的实例。它们被终止后,您还可以在 coordinator 监视器中看到它们被禁用。

当您需要再次使用 agent 时,可以通过编辑组详细信息并根据需要设置所需容量和最大容量来进行扩展。

总结

在本文中,我们了解了如何设置一个完整的生产就绪动态分配 Incredibuild 系统,您可以开始使用它来提高构建性能。但是我们仍可以做一些改进:

  • 限制内部网络端口——为了提高组件之间内部组网的安全性,您可以定义更严格的安全组规则。有关不同 Incredibuild 组件使用的端口列表,请参阅配置网络和安全设置
  • 使用 SSH 隧道访问 coordinator——要加密和验证对 coordinator 网页用户界面的访问,请参阅 SSH 隧道
  • initiator 组件使用专用服务器——在我们的示例中,我们在 coordinator 服务器上安装了initiator Incredibuild 组件。该组件允许启动构建,并且可以安装在单独的专用服务器上。有关更多详细信息,请参阅安装 Initiator Agents

这个难题的另一个重要缺失部分是与 CI 系统的集成。在另一篇文章中,我们介绍了我们刚刚设置的 Incredibuild 环境如何与 GitHub 操作集成,从而允许我们从 GitHub 推送事件启动构建。

在本文中,我们使用了按需 AWS EC2 机器。这需要手动处理资源,在许多情况下,这些资源仅在一定时间内使用,因此用户应处理资源的启动和终止。此外,在云上使用按需机器还有一个成本效益更高的替代方案,即竞价实例。在第二部分中,我们将介绍将竞价实例与 Incredibuild Cloud 结合使用的优势。