openSUSE:Build Service 私有安装

跳转到:导航搜索

硬件规格

我的目标是在主要更改(例如工具链)后在不到 1/2 天内启用完整 Linux 发行版的重建,并在任何不涉及完整重建的主要更改中在不到 15 分钟内重建。
描述的配置可在 5 小时内完成完整重建,内核重建可在不到 10 分钟内完成。
注意:在最初的四核 - 4GB RAM PC 上,我用于测试,完整重建需要 7 天。

服务器

在默认配置中,obs-server 也在充当 obs-worker。 在本教程中,我假设服务器不执行任何 obs-worker 任务。

  • 四核 2Ghz,配备 8 GB RAM
  • 1 个 250GB SATA HDD
  • 2 个 >500GB SAS HDD
  • 1 个服务器级千兆以太网接口。

工作节点

obs-workers 实际上执行所有编译工作 - 您需要的原始功率。 CPU 核心 2.6Ghz 或更高。
请注意,当需要完整重建时,OBS 系统无法在构建过程的 2/3 时间内并行处理任务,并且构建的最终速度主要取决于 obs-worker 的单线程功率。 此外,由于 obs-server 将使用任何可用的 obs-workers,因此不建议在网络上注册速度慢的 OBS 工作节点。
在我的配置中,我使用两个 (2) obs-workers。 是的,IT 人员在给我规格时差点心脏病发作。

  • 双四核 2.6 Ghz(越多越好)
  • 64 GB RAM。

32GB 的 RAM 由系统使用,其余 32GB 用作 RAM 磁盘(参见下文“优化”章节)。

  • 1 个 250 GB SATA HDD
  • 1 个 80 GB SSD(固态硬盘)
  • 1 个服务器级千兆以太网接口。

网络模型

对于需要构建的每个目标软件包,obs-server 将触发 obs-worker 下载构建目标软件包所需的所有软件包依赖项。 即使在每个 obs-worker 上激活了缓存(在 SSD 上),通过网络加载时间也很重要,并且对于需要构建的每个软件包都会累积。
您希望 obs-server 和 obs-workers 在几乎专用的千兆以太网本地骨干网上运行,以最大限度地减少每次下载时间。
我建议您通过防火墙隔离此本地 obs 子网(开放端口 22、80、82 和 444)。
由于(在撰写本文时)OBS 设备不支持 Bacula 客户端用于备份或 Nagios 客户端用于监控,您需要提供外部解决方案用于备份和监控(我没有选择修改 OBS 设备,以便保留该模型提供的轻量级升级/扩展,但我希望有一天 Bacula 和 Nagios 将默认包含在内)。

  • 对于备份,我的解决方案是通过远程命令通过 ssh 隧道将数据分区、数据库和一些配置文件远程挂载到外部服务器上,该服务器位于 obs 本地网络之外,并通过 nfs 运行备份。
  • 对于远程监控,Nagios 通过 ssh 提供无客户端解决方案,涵盖基本需求。

部署 obs-server

安装 obs-server 软件

使用虚拟设备

一个简单的选项是使用项目提供的服务器设备:OBS 服务器设备

OBS 服务器设备是在 suse studio 中构建的,因此您可以下载、克隆、使用 Media、Virtual 或 cloud 设备。

在命令行安装
  • 安装 openSUSE OBS Server 仓库
zypper ar -f https://download.opensuse.org/repositories/OBS:/Server:/2.10/openSUSE_15.2/OBS:Server:2.10.repo

您应该将 '15.2' 替换为您的 openSUSE 版本

  • 安装 OBS 服务器
zypper in -t pattern OBS_Server

注意:如果您想要一个用于开发的 OBS 服务器,可以在同一台机器上安装服务器和工作节点。 如果您想要一个用于生产的 OBS 服务器,我建议使用没有 OBS 工作节点的 OBS 服务器机器。 要配置此项,请查看 OBS 管理指南第 1.4 节

在虚拟机中安装

该项目还提供 VM 镜像。 OBS 本身使用的 CPU 和内存资源相对较少(进行编译的工作节点使用大量的这些资源),因此如果您计划构建灵活的分布式设置,可以从 此处 下载 OBS VM 镜像。

配置 lvm 作为数据存储

您需要决定是使用 1 个还是 2 个 HDD 作为数据存储。 我不建议使用单个磁盘,因为丢失所有数据的风险太高。 仅仅因为 HDD 故障而不得不返回到最新的备份,对于工程团队来说是一大损失。 HDD 很便宜,任何生产系统(即使对于小型团队)都应该使用情况 2。

情况 1:单个 HDD

# fdisk /dev/sdb -> 创建一个类型为 8e(即 Linux LVM)的主分区 # pvcreate /dev/sdb1 -> 准备分区以供 lvm 使用 
# vgcreate "OBS" /dev/sdb1-> 创建逻辑设备

情况 2:HDD 镜像

# fdisk /dev/sdb; /dev/sdc -> 创建一个类型为 fd - 即 Linux Raid Auto 的主分区 # /sbin/mdadm --create --verbose /dev/md0 --level=1 --raid-devices=2 /dev/sdb1 /dev/sdc1 # pvcreate /dev/md0 -> 准备分区以供 lvm 使用 # vgcreate "OBS" /dev/md0-> 创建逻辑设备 

  • 创建您的数据逻辑磁盘

# lvcreate -L 50G -n "server" /dev/OBS -> 注意:大小应根据磁盘大小调整 # vgscan # mkfs.ext4 /dev/OBS/server 

配置 obs-server 设备

  • 重新启动以启动设备。 创建所有结构需要一些时间
  • 以 root 用户身份登录(默认情况下没有密码)
  • 为 root 用户设置密码。 这是强制性的 以运行 sshd(从这里我将假设 opensuse)
  • 激活并启动 sshd

# insserv sshd # rcsshd start 

  • 停止该机器上的 obs-server (如果进行初始测试或小型系统,则不需要这样做)

# insserv -r obsworker # rcobsworker stop 

  • 安装 NFS 服务器以允许备份您的数据

# zypper in nfs-kernel-server # #配置 /etc/export -> 启用对 /obs 链接目标的访问 # insserv nfsserver # rcnfsserver start 

  • 检查 /etc/sysconfig/network/dhcp 中是否具有正确的选项
  • 强制 OBS 实例的名称(克服远程工作节点中的一个错误)。 变量 obsname 无论哪台机器构建软件包都必须相同。 否则,buildcompare 过程

会认为软件包从上次构建时发生了更改,只是因为它是通过不同的机器构建的。

编辑 /usr/lib/obs/server/BSConfig.pm 如果您有该行:- 我们的 $obsname = $hostname; # 此 Build Service 实例的唯一标识符,请将其替换为我们的 $obsname = "your-obs-server-name.yourDomain.com"; 

如果您使用虚拟机,最好将工作节点使用的 VM 类型设置为 none:

vi /etc/sysconfig/obs-server (注意:在较新版本中,obs-worker 和 obs-server 文件已合并) OBS_VM_TYPE="none" 

添加仓库目标

编辑 distributions.xml

vi /srv/www/obs/api/files/distributions.xml

注意:从 2.4+ 开始,您必须使用 API 导出、修改和重新导入分布,如下所示

osc api /distributions > file
edit file
osc api /distributions -T file

在 <distributions> 标签下,添加/删除 <distribution>...</distribution> 块。

一个块定义如下:

<distribution vendor="MeeGo" version="1.2.0" id="meego-1.2.0">
 <name>MeeGo 1.2.0</name>
 <project>MeeGo:1.2.0:oss</project>
 <reponame>MeeGo_1.2.0_oss_standard</reponame>
 <repository>standard</repository>
 <link>http://www.meego.org/</link>
</distribution>

添加您的 *.png 文件

/srv/www/obs/webui/public/images/distributions/

文件必须与 distributions.xml 文件中使用的名称相同。

更改架构

如果您想更改 OBS 中的可用架构。

首先:配置调度器

vi /etc/sysconfig/obs-server
OBS_SCHEDULER_ARCHITECTURES="i586 armv8el"

启动您的设备

重新启动您的设备
设备已准备就绪(用户 Admin,密码为 opensuse 可用)

webui -> https://hostname.domain api -> https://hostname.domain:444 repo -> http://hostname.domain:82 


更新说明 1: 如果您尝试启动一个用于快速测试的 OBS 实例,主机名无关紧要... 从 OBS 2.2.80(我没有使用旧版本进行测试)开始,您只需要知道您的 OBS 的 IP 地址...

更新说明 2: API 端口自编写此 wiki 后已更改... 在 OBS 2.2.80(以及肯定是最新的版本)中,API 位于端口 444...

更新说明 3: 但是,您不必担心所有这些。 使用最新版本的 OBS(自 2.2.80 以来),如果您连接到 "http://ip.of.your.obs,页面将向您显示所有您应该用来连接到您的 OBS 的链接...

部署 obs-workers

注意: 如果您部署小型系统,您可能会选择运行内置于 obs-server 设备中的工作节点。 在这种情况下,请忽略 obs-worker 安装,直接跳转到其配置。

安装 obs-worker 软件

一个简单的选项是使用项目提供的 OBS 服务器设备 OBS Light。 另一种方法是自己构建它。 为了帮助您,我们提供了 OBS Light 项目使用的以下方法。

  • 使用 Linux live 发行版启动您的服务器。 openSUSE 可以为您提供一个可以完成这项工作的文件。
  • 检查 DHCP 是否工作,以及你是否获得了预期的主机名(这对 OBS 设备来说是一个关键点。你的 DNS 查找和你的主机名必须完全相同)。
  • openSUSE 下载最新的稳定 raw.bz2 OBS worker 设备。
  • 使用 fdisk 删除服务器启动磁盘上的所有分区(我假设现在是 /dev/sda)。
    注意:这将永久擦除该磁盘上的所有数据。请在正确的机器和正确的磁盘上执行此操作。.
  • 将设备复制到服务器的启动磁盘上
# bunzip2 -c MyDownloadedApplianceFile.raw.bz2 > /dev/sda
注意:没有错误,你必须使用不带分区号的设备名称。
  • 设备的 root 密码是 opensuse

配置 OBS 实例名称

为了避免触发不必要的构建,你需要为你的构建实例提供一个唯一的 ID,该 ID 必须与 OBS worker(s) 和 server(s) 相同。默认情况下,此 ID 设置为 $HOSTNAME,只有当服务器和 worker 运行在同一主机上时才是正确的。

vi /usr/lib/obs/server/BSConfig.pm
change $obsname = $hostname; # unique identifier for this Build Service instance
by
$obsname = "obs-server.mydomain.com"

OBS 服务器通过 SLP 广播 worker 的信息,在某些 DNS 配置中,这些信息可能无法使用。你可以使用 slptool 检查广播 IP 名称或地址是否有效。

slptool findsrvs obs.source_server
slptool findsrvs obs.repo_server

如果无效,服务器地址在文件中

/etc/slp.reg.d/obs.repo_server.reg
/etc/slp.reg.d/obs.source_server.reg

注意:不要在 OBS 服务器的 $HOSTNAME 中使用 "_" 字符。

配置缓存以使用 SSD

我假设你有一个专用的 obs-worker(也称为非服务器-worker)。
我们需要在名为 OBS 的逻辑磁盘上创建一个名为 cache 的逻辑卷。

# fdisk /dev/sdX -> 在你的 SSD 或快速专用缓存 HDD 上创建一个类型为 8e(也称为 Linux LVM)的新主分区。 # pvcreate /dev/sdX1 -> 准备分区用于 lvm # vgcreate "OBS" /dev/sdX1 -> 创建逻辑设备 # lvcreate -L 50G -n "cache" OBS # vgscan # mkfs.ext4 /dev/OBS/cache 

默认情况下,设备将只使用挂载缓存的卷的 50% 容量。当缓存不在专用卷上时,这才有意义,但现在不是这种情况。
要启用缓存扩展到卷的全部大小,只需修改文件 /etc/sysconfig/obsworker

OBS_CACHE_DIR="/cache" -> 指向最快的本地磁盘 OBS_CACHE_SIZE="" -> 默认情况下为包含 OBS_CACHE_DIR 分区的 50% # 如果该分区是唯一的用途,则应增加到 90%。 


可能的优化

你需要使用代理/防火墙才能离开你的公司

启动 OBS 实例的最简单方法之一是将其链接到位于你网络防火墙之外的 Internet 上的另一个 OBS 实例(如引导部分所示)。这意味着你的 OBS 实例能够通过防火墙透明地访问 Internet...为此,你需要编辑 2 个文件。第一个文件是 /etc/sysconfig/proxy。它与 opensuse 代理设置相关,你需要修改以下 3 行,从

PROXY_ENABLED 开始,并将参数值设置为“yes”
HTTP_PROXY 并设置正确的 "http://[user]:[password]@[proxy IP]:[port]/>/" 值
HTTPS_PROXY 并设置正确的 "http://[user>:[password]@[proxy IP>:[port]/" 值

但这对于 OBS 来说是不够的(根据我的测试经验),因为 OBS 似乎会尝试以 opensuse 未处理的方式访问网络...因此,你需要修改另一个文件 /usr/lib/obs/server/BSConfig.pm
复制并取消注释包含 #our $proxy = "http(s)://[user:pass]\@[host]:[port]" 的行,将 [xxx] 替换为适当的值,并选择用于 Internet 访问的 http 模式(带或不带 "s"...我的建议是保留 "s",但你应该尝试两种解决方案(带和不带)以查看哪种解决方案有效)。

注意 两个文件之间的语法略有不同。区别在于 "@" 前面的 "\"...不要忘记第二个文件中的它!这应该可以为你节省很多麻烦!

镜像创建:如果你以后需要使用 Mic2,请检查 Mic2 的代理设置 这里

减少 worker 的数量

默认情况下,obs-worker 实例将

  • 为每个 CPU 线程创建一个 Worker
  • 使用标志 -j1。

如果你向许多用户提供一个公共 OBS 以共享,这是向大量用户分发公平服务的不错方法。

在开发团队的另一端,你每天有较少的构建,但你需要它们快速完成。我的测试是在一个由 50 名工程师组成的团队中进行的,他们每天构建一个或两个版本。
将 worker 的数量减少到每个双 CPU 线程 1 个,并允许默认编译标志尽可能高,效率更高。这种模式将我们的从头开始的构建时间从 7 小时减少到 5 小时。

编辑文件 /etc/sysconfig/obs-worker

注意:从 "2.2.992-1.3" 开始,文件 /etc/sysconfig/obs-worker 似乎不再存在

# 0 实例将自动使用 CPU 的数量 # 我的建议 -> 强制值为 CPU 线程数量的 1/2。 OBS_WORKER_INSTANCES="8" .... # 这通常映射到构建期间的 "make -j1" # 我的建议强制设置为服务器上的 CPU 线程的最大数量。 OBS_WORKER_JOBS="8" 

激活 RAM 磁盘以供 worker 使用

默认配置将导致每个 worker 在 /tmp/obs 或在 /dev/OBS/worker_root_N(N 根据你需要的 worker 数量而变化)中创建自己的目录,如果这些逻辑驱动器已创建。

这效率不高,因为 /tmp 默认在启动 HDD 上,这是一个普通的 SATA 驱动器,而 /dev/OBS 是一个也运行在普通 HDD 上的软件镜像。

worker 将花费所有需要的 rpm 来构建一个包以创建一个假的 root,然后再运行 rpm 构建。如果你很幸运,构建作业所需的二进制 rpm 将在你的快速 SSD 上的缓存中,但你仍然不想每次构建一个包时都将所有这些数据复制到第二个 HDD 上。我的建议是使用 RAM 磁盘(有两种模型)。

选项 1 创建一个与你希望 RAM 驱动器大小相等的大的交换分区,并将 /tmp 创建为 tmpfs。这是一种简单的方法,只要你的设备不会交换,它就会非常快。风险是,如果你开始交换,它会变得无法接受地慢。
实现很简单,创建交换分区并在你的 /etc/fstab 中将 /tmp 挂载到 tmpfs。

选项 2 创建一个专用的 RAM 驱动器,并配置 worker 在该分区上构建。这种方法需要更多的工作,因为你需要在每次启动时创建和挂载 RAM 磁盘。需要在启动 obsworker 守护程序之前挂载 RAM 磁盘。
一个简单的解决方案是在 /etc/init.d/before.local 中创建一个文件,该文件包含一个创建你的 RAM 驱动器并将其挂载到 /tmp/obs 的守护程序脚本。
如果你使用另一个挂载点,你需要修补 /etc/sysconfig/obs-server。

注意:从 "2.2.992-1.3" 开始,文件 /etc/sysconfig/obs-worker 似乎不再存在

# 默认是 /tmp OBS_WORKER_DIRECTORY="" -> 一个快速的本地硬盘或更好的 ramfs。 

升级现有设备

从 v2.x 开始,升级 OBS 设备已经大大简化。你只需通过 zypper 即可完成。

如果你需要将 OBS 服务器 2.2 更新到 2.3,你可能需要此 链接

# zypper ref # zypper dup 

设备的另一个优点是,如果你需要从头开始重新安装,该过程非常简单。

  • 删除启动驱动器(默认 /dev/sda)上的分区。不要在你的数据驱动器上
  • 将设备复制到启动驱动器,就像进行全新安装一样。
  • 重新启动
  • 设备将自动检测你的 lvm OBS 并使用它来恢复所有以前的数据。
  • 重新应用你的优化选项
  • reboot

从备份恢复 obs-server

要备份什么

假设你已备份所有必需的数据,恢复 OBS 数据存储非常简单。我个人建议你备份以下内容:

  • 你用来创建设备的 .raw.bz2 文件。向后兼容性很好,但你永远不知道。

在安装时,我将 .raw.bz2 文件复制到数据存储中的一个专用目录中,该目录由备份系统覆盖。

  • /obs/MySQL /obs/db -> OBS 数据库
  • /obs/projects -> 项目信息
  • /obs/sources -> 包的源代码
  • /obs/build -> 构建包
  • /obs/repos -> 构建仓库
  • /obs/trees -> 项目的 MD5SUMS
# cd /
# tar -czvf saveOBS.tar.gz /srv/obs/MySQL/ /srv/obs/db/ /srv/obs/projects/ /srv/obs/sources/ /srv/obs/build/ /srv/obs/repos/ /srv/obs/trees/ /srv/www/obs/webui/public/images/distributions/ /srv/www/obs/api/files/

恢复过程

  • 停止所有 obs 服务

find /etc/init.d -name obs\* -exec {} stop \; rcmysql stop 

  • 恢复文件

tar -xvf saveOBS.tar.gz -C / 

  • 如果恢复到与进行备份的设备不同的设备,则需要强制执行正确的 UI 和 GUI 到文件上。

chown -R obsrun /obs chgrp -R obsrun /obs chown -R mysql /obs/MySQL chgrp -R mysql /obs/MySQL 

  • 你已经恢复了 OBS 设备,只需重新启动并再次玩耍。