Kubernetes

通过 Incredibuild 您可以将 CI 进程分发到可用的 Incredibuild Helper 机器上,从而加快 CI 进程。您可以构建服务器容器映像中安装一个 Incredibuild Initiator,并将其连接到一个Incredibuild Coordinator,该 Coordinator 连接到 Kubernetes (K8S) 外部的 Incredibuild Helper 机器。

本文将介绍使用 K8S 的典型 CI 环境,并说明如何在构建过程中集成 Incredibuild。我们假设您已经有了一个正常运行的 CI 环境(不含 Incredibuild)。

备注:本文档的受众是 DevOps 工程师,需在管理 K8S 集群、pods 和容器方面有足够的经验。我们还假设读者熟悉 Incredibuild,并在 K8S 之外使用过它。

限制

  • 只有 Incredibuild Coordinator 和启动代理服务能在 K8S 中运行。Incredibuild Coordinator 既可以在 K8S 内运行,也可以在 K8S 外运行。Incredibuild Helper Agent 不能进入 K8S。

  • 在 K8S 中运行的 Initiator 不支持 Build Cache 构建缓存。

  • 使用 K8S 启动的 Initiator 将自动与默认 Build Group 关联。可以使用 CLI 为 K8S 机器使用其他 Build Group。

  • 通常情况下,在 CI 中运行的构建服务器在构建作业完成后后会被销毁(即被删除),这意味着:

    • 构建历史数据库和构建日志会丢失,除非您将它们收集并存储在某个日志收集存储库中。

    • 构建监控器仅在构建过程中可用,一旦容器终止,Agent 就会从 Coordinator 代理列表中消失。

设置 Incredibuild 环境

  1. 获得 SUVM 许可证。

    1. 由于在 CI 中运行的构建服务器在构建作业完成后通常会被销毁(即被删除),因此您需要足够多的 SUVM 许可证核心数来支持最大并发构建作业。有关详细信息,请参阅 一次性虚拟机 (SUVM) 许可证

  2. 在您的环境中部署 Incredibuild:

    1. 部署一个 Incredibuild Coordinator(可以在 K8S 内或 K8S 外)。

    2. 在 K8S 集群外部署一组 Incredibuild Helper 机器,又称 Helper 网格(可以是裸机、虚拟机或云)。

    3. Incredibuild 启动代理服务(在 K8S 内部)需要通过网络访问 Coordinator 和所有 Helper Agent。确保相关 TCP/IP 端口已打开,请参阅硬件和网络要求。

备注:避免过度配置编译服务器 pod:即使 Incredibuild 加速正在运行,CPU 和其他资源的短缺也可能会损害编译性能。

修改或创建一个 Kubernetes 映像以部署 Incredibuild Initiator

您可能已经有了一个构建服务器黄金映像,其中包含 Linux 发行版、编译器和 make 系统。下面的 Dockerfile 表示一个典型的构建服务器黄金映像(不含 Incredibuild):

复制
#######################################################
# build-image.Dockerfile
#######################################################
FROM ubuntu:20.04
ARG DEBIAN_FRONTEND=noninteractive
ENV TZ=Etc/GMT 
RUN apt-get update
RUN apt-get install -y gcc make git bzip2

#######################################################
# The compilation commands executed during each CI job
#######################################################
CMD bash -c " \
  git clone https://github.com/gilnadel/Sample.git; \
  cd Sample; \
  make -j 10 ALL; "

上面的 Dockerfile 以创建黄金映像的命令开始,以编译命令(获取源代码并编译)结束。

  1. 在 Dockerfile 中添加以下几行,以便在编译命令之前安装 Incredibuild,但要修改 IB_VERSION 和 IB_COORDINATOR 以匹配您的 Incredibuild Coordinator:

    复制
    #######################################################
    # Install IB4Linux
    #######################################################
    ENV IB_VERSION=4.0
    ENV IB_COORDINATOR=192.168.10.50
    EXPOSE 8080
    EXPOSE 8081
    WORKDIR /root
    ADD https://www.incredibuild.com/downloads/incredibuild_$IB_VERSION.run ./incredibuild.run
    RUN chmod a+x ./incredibuild.run
    RUN sudo ./incredibuild.run --action install --initiator enabled --coordinator-machine $IB_COORDINATOR --data-dir /etc/ --license-type SUVM
  2. 如果要在容器上使用启动代理服务的用户界面(构建监控、构建历史等),请确保容器上的 HTTP 和/或 HTTPS 端口已开放,以便外部访问。更多信息,请参阅 Modifying Ports(修改端口)。

  3. 在编译命令中添加以下一行(这将在 CI 期间运行 pod 时启动 Incredibuild Agent)。这些命令可确保您启动的 Incredibuild Agent 消耗 SUVM 许可证限制中固定数量的 CPU 核心。将第 1 个命令中的值 8 更改为您希望容器化构建服务器实际用于构建的核心数(通常应该与分配给容器的 CPU 数量相匹配)。

    复制
    # Change the parameters below to fit the size of your pod
    /opt/incredibuild/management/set_agent_params.py max-initiator-cores 8;
    /opt/incredibuild/etc/init.d/incredibuild start; 
    sleep 10;
  4. make 命令包装在 ib_console 命令中,并根据您的项目潜力和 Helper 核心的可用性增加构建的并行度。

    复制
    ib_console -f make -j 100 ALL;
  5. 为了让 Incredibuild 诊断构建操作,请按照 Collecting Build Logs 中的说明将构建输出上传到 Kubernetes 以外的位置(例如您的日志收集库)。如果不导出和保存日志,Incredibuild 将无法为失败或性能不佳的构建提供支持。

使用 Incredibuild 的完整 Dockerfile 示例

每个环境都不同,因此这个示例可能需要根据您的环境进行调整

复制
#######################################################
# build-image.Dockerfile
#######################################################
FROM ubuntu:20.04
ARG DEBIAN_FRONTEND=noninteractive
ENV TZ=Etc/GMT 
RUN apt-get update
RUN apt-get install -y gcc make git

#######################################################
# Install IB4Linux
#######################################################
ENV IB_VERSION=4.0            
ENV IB_COORDINATOR=192.168.10.50  
EXPOSE 8080
EXPOSE 8081
WORKDIR /root
ADD https://www.incredibuild.com/downloads/incredibuild_$IB_VERSION.run ./incredibuild.run
RUN chmod a+x ./incredibuild.run
RUN sudo ./incredibuild.run --action install --initiator enabled --coordinator-machine $IB_COORDINATOR --data-dir /etc/ --license-type SUVM

#######################################################
# Compilation step, including IB agent startup
#######################################################
CMD bash -c -x " \
  /opt/incredibuild/management/set_agent_params.py max-initiator-cores 8; \
  /opt/incredibuild/etc/init.d/incredibuild start; sleep 10; \
  git clone https://github.com/gilnadel/Sample.git; \
  cd Sample; \
  ib_console -f -p gcc.xml --no-cgroups make -j 100 ALL; \  "

构建黄金映像

构建容器黄金映像并将其推送到映像存储库。请参阅以下示例 Docker 命令:

复制
docker build -f build-image.Dockerfile -t build-image:latest --ulimit nofile=100000:100000 .

注意必要的 ulimit 构建选项。

更新 Incredibuild

  1. 升级您的 Incredibuild Coordinator。在此过程结束时,与 Coordinator 连接的所有 Helper Agent 都将自动升级。

  2. 更新您的 Kubernetes 黄金映像,以便今后使用最新版本的 Incredibuild 安装 Helper Agent。
    如果不这样做,一旦与 Coordinator 连接,它们就会升级。然而,这将大大降低其部署速度。