如何在 FreeBSD 上安装 Buildbot

作者选择了 开放式互联网 / 自由言论基金作为 写给捐赠计划的一部分接受捐款。

介绍

Buildbot是一个通常用于 continuous integration (CI) 的任务安排系统。 CI 是一个软件开发实践,通常包括自动构建和测试您的软件,并定期进行每个更改。

  • 更改源 :这些检测更改 - 例如在Git存储库中的更改 - 并通知策划者这些变化
  • 策划者 :策划者根据即将到来的变化触发构建者
  • Builders :这些包含实际的构建步骤,例如编译软件项目
  • 报道者 :报道者使用构建结果发送故障电子邮件或其他通知

Buildbot 通过至少一个 Buildbot master 运行并检查所有 build 配置和其他设置,并向其员工分发实际 build. 此外,master 提供了基于浏览器的用户界面子组件,如果启用,则用于触发或查看 build 并检查状态报告和其他设置。

在本指南中,您将使用 FreeBSD 监狱来安装和运行每个 Buildbot 组件在一个单独的、孤立的环境中。您将使用 Nginx 网页服务器服务 Buildbot,并使用本地计算机上的网页浏览器访问其网页接口。

<$>[注] 注: 截至 2022 年 7 月 1 日,DigitalOcean 不再支持通过控制面板或 API 创建新的 FreeBSD Droplets. 但是,您仍然可以使用自定义图像创建 FreeBSD Droplets。

前提条件

在开始本指南之前,您将需要:

  • 运行 FreeBSD 11.2 的服务器,尽管新版本和旧版本的 FreeBSD 也应该起作用. 如果您是新手使用 FreeBSD,您可能会发现通过遵循我们在 How to Get Started with FreeBSD上的指南来定制此服务器有帮助。
  • Nginx 安装在您的服务器上。

如果您想要使用安全的 HTTPS 托管 Buildbot Web 界面,您还需要以下内容:

如果你还没有注册的域名,你可以注册一个域名注册商(例如,Namecheap,GoDaddy等)。

  • DNS A Record 将你的域名指向你的服务器的公共IP地址。这是由于Let's Encrypt如何验证你拥有它正在发行证书的域名之一而需要的。例如,如果你想获得‘example.com’的证书,该域名必须为您的服务器解决验证过程的工作。你可以遵循 这个 DNS Quickstart 指南 有关如何添加这个详细信息。在本教程中,我们将使用‘example.com’作为一个示例域名。
  • 一个 SSL/TLST证书为你的域名。

步骤1:为Buildbot大师和工人设置监狱

由于Buildbot允许外部贡献者在您的系统上运行代码,因此建议您隔离其各个组件,以防止任意或恶意代码占用您的服务器资源。

与 LXC、Docker 和其他容器机制类似,FreeBSD 监狱提供轻量级的与主机系统隔离。监狱内部运行的流程只能访问监狱已经获得访问的资源;否则,它们就像其他任何 FreeBSD 环境一样行事。监狱共享相同的内核,但通常运行在具有 FreeBSD 基系统副本的文件系统上,这可能是与主机内核兼容的任何版本的 FreeBSD。

几个外部软件包存在,以帮助创建和管理FreeBSD监狱. 因为它们都不是事实上的标准,我们将使用操作系统的嵌入式(https://www.freebsd.org/cgi/man.cgi?query=jail.conf&sektion=5&n=1)监狱配置机制。

首先,我们想为系统监狱创建一个单独的网络接口。在监狱中,内核将网络连接重写到监狱分配的第一个IPv4/IPv6地址,例如,如果第一个分配的IP地址是公共的,而监狱中的一项服务在127.0.0.1:1234上,端口1234将是公开可访问的。 推荐的做法是为监狱提供一个单独的网络接口。我们将遵循这个建议:将主要的回路接口(lo0)克隆成一个单独的接口(lo1)。

sysrc 命令为 /etc/rc.conf 文件编写一个规则,但不创建接口本身:

1sudo sysrc cloned_interfaces+=lo1

接下来,使用以下命令创建网络接口:

1sudo service netif cloneup

您可以通过以下方式检查接口状态和IP:

1ifconfig lo1
1[secondary_label Output]
2lo1: flags=8008<LOOPBACK,MULTICAST> metric 0 mtu 16384
3    options=600003<RXCSUM,TXCSUM,RXCSUM_IPV6,TXCSUM_IPV6>
4    nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL>
5    groups: lo

输出显示该界面存在,但尚未列出并附加到该界面的IP地址,其旗帜LOOPBACK意味着该界面仅在本地提供,并且不代表实际的硬件设备。

接下来,使用您喜爱的编辑器打开主监狱的新配置文件. 在这里,我们将使用 ee:

1sudo ee /etc/jail.buildbot-master.conf

然后将以下内容添加到文件中,该文件将配置一个名为buildbot-master的主监狱:

 1[label /etc/jail.buildbot-master.conf]
 2buildbot-master {
 3    host.hostname = buildbot-master.localdomain;
 4    ip4.addr = "lo1|10.0.0.2/24";
 5    path = "/usr/jails/buildbot-master";
 6    exec.start = "/bin/sh /etc/rc";
 7    exec.stop = "/bin/sh /etc/rc.shutdown";
 8    mount.devfs; # need /dev/*random for Python
 9    persist;
10}

此代码在监狱网络界面上分配了一个固定的主机名和IP地址,即10.0.0.2,并指定了根文件系统,即/usr/jails/buildbot-master。在这里使用的exec.startexec.stop值声明监狱的startstop服务将表现为启动流程,并使用在/etc/目录中找到的启动和关闭脚本。

要了解有关可能的主监狱设置的更多信息,请参阅 jail(8) manpage。

添加此内容后,保存并退出编辑器. 如果您使用ee,请按CTRL+C,键入exit,然后按ENTER

主监狱的配置文件与全球监狱配置文件/etc/jail.conf分开,因此,您需要将主监狱的名称添加到已知监狱列表中:

1sudo sysrc "jail_list+=buildbot-master"

然后允许在jail_list中列出的任何监狱自动启动:

1sudo sysrc jail_enable=YES

如果你已经在你的系统上配置了/etc/jail.conf全球文件的监狱,但你以前没有使用jail_list,启用此设置意味着只有jail_list中的监狱会自动启动,你可能想将现有的监狱添加到列表中。

<$>[注] 注: 如果您使用 ZFS 文件系统,建议您为监狱的文件创建一个单独的数据集,以便稍后轻松备份、克隆或破坏它。

1zpool list

首先,为所有监狱创建家长数据集:

1sudo zfs create zroot/usr/jails

接下来,创建主监狱的数据集:

1sudo zfs create zroot/usr/jails/buildbot-master

美元

接下来,我们将创建主监狱的根目录,并提取FreeBSD系统。

确保监狱的根文件系统目录存在. 如果你在上一个注释中运行了ZFS命令,那么这已经完成了,你可以跳过这个命令:

1sudo mkdir -p /usr/jails/buildbot-master

然后下载 FreeBSD 11.2 基础系统档案,我们先安装根证书来信任下载服务器:

1sudo pkg install ca_root_nss

此命令会提示您批准安装ca_root_nss包,然后按y,然后按ENTER

下载下档案:

1fetch -o /tmp/base.txz "https://download.freebsd.org/ftp/releases/amd64/11.2-RELEASE/base.txz"

将此文件的内容提取为 root 文件系统:

1sudo tar -x -f /tmp/base.txz -C /usr/jails/buildbot-master

本指南描述了确切安装一个工人(也包含在监狱中)的过程,您将以与主人相同的方式配置它,重新使用您刚刚下载的基系统。

1sudo ee /etc/jail.buildbot-worker0.conf

将以下内容添加到此文件中:

 1[label /etc/jail.buildbot-worker0.conf]
 2buildbot-worker0 {
 3    host.hostname = buildbot-worker0.localdomain;
 4    ip4.addr = "lo1|10.0.0.3/24";
 5    path = "/usr/jails/buildbot-worker0";
 6    exec.start = "/bin/sh /etc/rc";
 7    exec.stop = "/bin/sh /etc/rc.shutdown";
 8    mount.devfs; # need /dev/*random for Python
 9    persist;
10}

看看这些行,注意到工人监狱的主机名、IP和根文件系统目录不同于主机。

再次,因为我们正在使用一个单独的监狱配置文件,而不是全球 /etc/jail.conf,添加名称到已知监狱列表:

1sudo sysrc "jail_list+=buildbot-worker0"

<$>[note] 注: 与主监狱一样,如果您使用 ZFS 文件系统,建议您为工人监狱的文件创建一个单独的数据集。

1sudo zfs create zroot/usr/jails/buildbot-worker0

美元

提取已下载的 FreeBSD 11.2 基系统,就像您对主机所做的那样:

1sudo mkdir /usr/jails/buildbot-worker0
2sudo tar -x -f /tmp/base.txz -C /usr/jails/buildbot-worker0

此时,两个监狱都已配置并包含一个 FreeBSD 基础系统,没有安装额外的软件包。

1sudo service jail start

检查启动是否成功,通过使用以下命令列出系统上的所有运行监狱:

1jls

这将返回类似于以下的输出,显示当前在您的服务器上运行的监狱:

1[secondary_label Output]
2   JID IP Address Hostname Path
3     1 10.0.0.2 buildbot-master.localdomain   /usr/jails/buildbot-master
4     2 10.0.0.3 buildbot-worker0.localdomain  /usr/jails/buildbot-worker0

这证实监狱按照预期运行,但此时他们没有连接到互联网,这意味着您将无法在监狱内安装 Buildbot 包。

步骤2 – 设置监狱的互联网访问

虽然主人和工人监狱正在运行,但他们都关闭了互联网,打开他们到互联网是必要的,因为他们必须能够安装包,并相互通信。

要解决此问题,请将主机的 DNS 解析器配置复制到两个监狱:

1sudo cp /etc/resolv.conf /usr/jails/buildbot-master/etc/resolv.conf
2sudo cp /etc/resolv.conf /usr/jails/buildbot-worker0/etc/resolv.conf

接下来,从监狱路由出发的互联网流量. 要做到这一点,使用IPFW – FreeBSD的内置防火墙 – 设置NAT(网络地址翻译)网络规则. 完成此步骤后,从监狱网络出发的流量将被翻译到您的主机的公共IP地址。

如果您从前提条件中遵循了 Let's Encrypt 教程,您已经将防火墙配置为允许访问您的 Web 服务器。

<$>[warning] 警告: 对防火墙配置进行错误的更改可能会使远程主机无法通过SSH访问,因此重要的是确保您有可用于登录机器的替代方法。

要通过此功能启用访问,请使用以下命令设置一个 root 密码:

1sudo passwd

或者,您可以通过键入当前用户的密码:

1passwd

美元

使用以下命令将预定义的工作站防火墙规则纳入你的rc.conf文件中。

1sudo sysrc firewall_type="workstation"

接下来,允许访问来自外部世界的网页服务器端口。下列命令允许通过端口22,用于SSH;端口80,允许Buildbot通过HTTP进行服务;和端口443,允许Buildbot通过HTTPS进行服务。

1sudo sysrc firewall_myservices="22/tcp 80/tcp 443/tcp"

允许从任何 IP 地址访问指定的防火墙_myservices指令中的端口:

1sudo sysrc firewall_allowservices="any"

将防火墙设置为在 boot 上启动:

1sudo sysrc firewall_enable=YES

然后用基本规则启动防火墙:下面的nohup命令避免了防火墙启动的中断,并将stderrstdout两者重定向到临时日志文件。

1sudo nohup service ipfw start >/tmp/ipfw.log 2>&1

如果您正在使用cshtcsh壳,此重定向将导致模糊的输出重定向出现在输出中。

在此时,防火墙服务将开始并开始保护主机免受连接到不安全的端口。

<$>[注] 注: 如果发生了错误或您使用了不同的防火墙类型,防火墙可能还不知道您的SSH连接的状态,导致您与服务器的连接停滞不前。

SSH 连接关闭后,从本地机器重新连接到您的服务器:

1ssh freebsd@your_server_ip

如果无法恢复 SSH 连接,则需要使用替代方法连接到它。

重新获取访问后,禁用防火墙:

1sudo service ipfw stop

随着防火墙停止,您将可以自由调解问题。

接下来,您需要确定连接到互联网的主机的网络接口。

1ifconfig

此命令可能会输出几种不同的接口. 主机用于连接到互联网的接口是包含服务器的公共 IP 地址的命令. 为了说明,下面的示例输出显示‘vtnet0’是主机使用的网络接口:

 1[secondary_label Output]
 2vtnet0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
 3    options=6c07bb<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,JUMBO_MTU,VLAN_HWCSUM,TSO4,TSO6,LRO,VLAN_HWTSO,LINKSTATE,RXCSUM_IPV6,TXCSUM_IPV6>
 4    ether 9a:3e:fa:2a:5f:56
 5    hwaddr 9a:3e:fa:2a:5f:56
 6    inet6 fe80::983e:faff:fe2a:5f56%vtnet0 prefixlen 64 scopeid 0x1
 7    inet public_server_ip netmask 0xffffffc0 broadcast broadcast_ip
 8    inet 10.10.0.23 netmask 0xffff0000 broadcast 10.10.255.255
 9    nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL>
10    media: Ethernet 10Gbase-T <full-duplex>
11    status: active
12lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> metric 0 mtu 16384
13    options=600003<RXCSUM,TXCSUM,RXCSUM_IPV6,TXCSUM_IPV6>
14    inet6 ::1 prefixlen 128
15    inet6 fe80::1%lo0 prefixlen 64 scopeid 0x2
16    inet 127.0.0.1 netmask 0xff000000
17    nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL>
18    groups: lo
19lo1: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> metric 0 mtu 16384
20    options=600003<RXCSUM,TXCSUM,RXCSUM_IPV6,TXCSUM_IPV6>
21    inet 10.0.0.2 netmask 0xffffff00
22    inet 10.0.0.3 netmask 0xffffff00
23    inet6 fe80::1%lo1 prefixlen 64 scopeid 0x3
24    nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL>
25    groups: lo

注意这个界面,然后在全球范围内配置其名称:

1sudo sysrc firewall_nat_interface=vtnet0

打开新的防火墙配置脚本文件:

1sudo ee /usr/local/etc/ipfw.rules

然后将以下内容添加到文件中,为 IPFW 定义防火墙规则:

 1[label /usr/local/etc/ipfw.rules]
 2#!/bin/sh
 3set -e
 4
 5# Add basic rules as defined by firewall_type, firewall_myservices, etc.
 6. /etc/rc.firewall
 7
 8# External network interface
 9ext_if="$firewall_nat_interface"
10
11# The interface we chose for communication between jails
12jail_if="lo1"
13
14for interface in "$ext_if" "$jail_if"; do
15    if [ -z "$interface" ]; then
16        >&2 echo "Missing network interface"
17        exit 1
18    fi
19    if ! ifconfig $interface >/dev/null 2>&1; then
20        >2 echo "No such network interface: $interface"
21        exit 1
22    fi
23done
24
25ipfw nat 123 config if $ext_if
26ipfw add 1 allow all from any to any via $jail_if
27ipfw add 2 nat 123 ip4 from any to any in via $ext_if
28ipfw add 501 skipto 20000 udp from any to any 53 out via $ext_if keep-state
29ipfw add 502 skipto 20000 udp from any to any 67 out via $ext_if keep-state
30ipfw add 503 skipto 20000 tcp from any to any out via $ext_if setup keep-state
31ipfw add 504 skipto 20000 icmp from any to any out via $ext_if keep-state
32ipfw add 19999 deny all from any to any
33ipfw add 20000 nat 123 ip4 from any to any out via $ext_if
34ipfw add 20001 allow ip from any to any

以下是剧本的每个部分所做的事情:

*./etc/rc.firewall'包括系统预先定义的IPFW规则脚本,它根据您配置的'firewall'来添加基本规则. 变量在 /etc/rc.conf'.

  • 中。 这是为您的安全起见, 如果出现配置错误, 则提前退出脚本 。 } 从 ipfw 开始的指示会添加实际的防火墙配置和规则 。 每项规则 -- -- 从 " ipfw add " 开始加上 -- -- 有编号。 防火墙使用这些数字来按顺序评估规则.
  • 如果$ext_if'创建了带有ID"123"的内核NAT设施,可以使用公交网络接口来翻译流量. -ipfw通过$jail_if'允许从任何到任何的流量. 请注意, 如果 允许 规则匹配, 则允许规则处理停止和包通过 。
  • ipfw 通过 $ext_if ' 将 2 nat 123 ip4 从任意输入到任意输入, 将翻译外部界面上所有收到的 IPv4 包 。 正如ipfw ad access 20000...的解释所描述的,这需要作为外出数据包的翻译的对应物。 如果有匹配,则继续通过跳跃规则20000'进行处理,该规则执行NAT。 规则编号 " 501 " 是在默认的回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回 运行 sudo ipfw list 以查看当前激活的防火墙规则( 但请注意我们尚未应用上述修改)
  • 除了skipto'规则之外,在2'规则和19999'规则之间有意存在空白,其中etc/rc.firewall'文字插入了某些基本规则。 如果上述skipto ' 规则不匹配,则基本规则将注意允许不同类型的流量,包括回回路、接通的ICMP接通信息以及firewall_myservices'所指定的端口。 rule.
  • `ipfw通过 $ext_if' 从任意向外添加20000 nat 123 ip4,翻译所有离开外部界面的IPv4包的地址。 您只需要这里的IPv4, 因为在此教程中, 监狱被指定 IPv4 地址 。
  • ipfw 添加 20001 允许 ip 从任意到任何 只有在您为nat'规则关闭了单通模式的情况下,才需要这样做,在这种情况下,在经过了20000'规则之后,将继续进行处理,这就要求您明确允许这些包单通过,并有一条单独的规则。 对于默认的一通模式,防火墙将停止按nat'规则处理,因此忽略了规则20001'。 (韩语)_

保存文件并离开编辑器。

由于我们希望用ipfw.rules脚本中定义的规则更改预定义的基本防火墙规则,我们必须在rc.conf文件中指向此脚本。

1sudo sysrc firewall_script="/usr/local/etc/ipfw.rules"

此设置使用IPFW的内核NAT支持,因此您必须告诉系统在启动时加载相应的内核模块。

1sudo sysrc -f /boot/loader.conf ipfw_nat_load=YES
2sudo kldload ipfw_nat

重新启动防火墙以执行扩展防火墙规则脚本:

1sudo nohup service ipfw restart >/tmp/ipfw.log 2>&1

再次,如果您使用csh壳或其衍生品之一(如tcsh),请运行sudo nohup service ipfw restart >&/tmp/ipfw.lo而不是以前的命令来重新启动防火墙:

检查防火墙规则是否正确加载:

1cat /tmp/ipfw.log

这里列出了防火墙规则,然后是成功消息:

1[secondary_label Output]
2Flushed all rules.
300100 allow ip from any to any via lo0
4[...]
565500 deny ip from any to any
6Firewall rules loaded.

您也可以随时查看安装的防火墙规则,使用:

1sudo ipfw list
1[secondary_label Output]
200001 allow ip from any to any via lo1
300002 nat 123 ip from any to any in via em0
4[...]
565535 deny ip from any to any

有了所有的防火墙规则,你的监狱现在可以访问互联网,你可以通过尝试从监狱中下载网页来检查:

1sudo jexec buildbot-master fetch -q -o- http://example.com/
1[secondary_label Output]
2<!doctype html>
3<html>
4<head>
5    <title>Example Domain</title>
6[...]

有了这个,你已经成功地准备了两个监狱运行像一个正常的操作系统,为每个监狱设置互联网访问,并开始两者。

步骤 3 – 安装和运行 Buildbot Master

您只需要安装「py36-buildbot」包才能运行主组件,但在本指南中,我们还将讨论如何安装 Web 界面包,「py36-buildbot-www」。

由于我们正在使用监狱来分割各个组件,开始在主监狱中打开一个 root 壳:

1sudo jexec buildbot-master csh

请注意,在本指南中,如果它们必须在监狱壳内执行,则壳命令块将以不同的颜色标记,此外,命令提示将反映监狱的哪个用户配置文件 - 无论是 root 还是非特权 ** buildbot-master** 用户 - 必须在该命令下运行。

安装包裹:

1[environment second]
2pkg install py36-buildbot py36-buildbot-www

如果你还没有安装或使用这个监狱中的pkg包管理器,它会提示你确认你允许它自行启动。 要做到这一点,请按y,然后按ENTER

接下来,创建一个正常的,非特权的用户来运行主服务. 下面的命令将为该用户分配随机密码,但您不需要记住它,因为主机的 root 用户(监狱之外)可以更改它或成为监狱中的任何用户而没有密码:

1[environment second]
2pw useradd -n buildbot-master -m -w random

接下来,创建主目录,您将存储配置:

1[environment second]
2mkdir /var/buildbot-master

并向服务用户授予所有权:

1[environment second]
2chown buildbot-master:buildbot-master /var/buildbot-master

从此开始,所有与主相关的设置和更改都应该作为非特权用户执行,因为这将有助于保持所有权和权限的一致性。

转到非特权用户:

1[environment second]
2su -l buildbot-master

然后使用内置的buildbot实用程序在指定的目录中创建一个目录和配置结构:

1[environment second]
2buildbot-3.6 create-master /var/buildbot-master

与 Jenkins 等其他 CI 软件不同,Buildbot 的行为是直接在其配置文件中定义的,这是用 Python 解释的,这允许简化您的配置版本,而使用脚本语言允许自由编写自定义构建配置并扩展现有的 Buildbot 功能。

Buildbot 包包含一个样本主配置文件,您可以将其用作自己的配置模板。 复制样本配置并命名它 master.cfg:

1[environment second]
2cp /var/buildbot-master/master.cfg.sample /var/buildbot-master/master.cfg

然后使用您喜爱的文本编辑器打开基本配置文件,在这里,我们将使用ee:

1[environment second]
2ee /var/buildbot-master/master.cfg

配置文件包含一个密码,需要工人连接到主机。 以您所选择的安全密码替换默认的pass。 此外,我们的工人的名称将是worker0,因此在WORKERSBUILDERS部分中也更换example-workerworker0

完成后,您需要编辑的文件的部分将看起来如下:

 1[label /var/buildbot-master/master.cfg]
 2####### WORKERS
 3
 4# ...
 5c['workers'] = [worker.Worker("worker0", "your_secure_password")]
 6# ...
 7
 8####### BUILDERS
 9
10# ...
11c['builders'] = []
12c['builders'].append(
13    util.BuilderConfig(name="runtests",
14      workernames=["worker0"],
15      factory=factory))
16# ...

保存并关闭此文件,然后运行退出命令以返回监狱中的 root 用户:

1[environment second]
2exit

由于样本配置将Git存储库git://github.com/buildbot/hello-world.git视为其更改源,您还需要安装Git:

1[environment second]
2pkg install git-lite

有了这个,你已经创建了主目录结构和配置,但服务尚未运行. 要手动运行 Buildbot,可以从主目录中运行buildbot start命令,即/var/buildbot-master。 然而,这并不关心启动时间的启动或其他全系统的配置。

对于本教程的目的,我们希望让服务在每个启动时运行。在监狱的情况下,这意味着监狱的启动事件。 使用以下命令来定义主目录的位置:

1[environment second]
2sysrc buildbot_basedir=/var/buildbot-master

然后指定该服务应在 buildbot-master 用户下运行:

1[environment second]
2sysrc buildbot_user=buildbot-master

接下来,允许该服务在监狱启动中运行:

1[environment second]
2sysrc buildbot_enable=YES

在写作时,py36-buildbot包有一个错误,阻止服务启动(参见 [本错误报告])(https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=227675))。

1[environment second]
2sed -i '' 's|command="/usr/local/bin/buildbot"|command="/usr/local/bin/buildbot-3.6"|' /usr/local/etc/rc.d/buildbot

然后,开始服务:

1[environment second]
2service buildbot start

该服务应该在没有错误的情况下开始,您可以通过查看日志文件的内容来验证成功:

1[environment second]
2tail /var/buildbot-master/twistd.log
1[secondary_label Output]
2[environment second]
32018-06-08 15:14:52+0000 [-] Starting BuildMaster -- buildbot.version: 0.9.11
42018-06-08 15:14:52+0000 [-] Loading configuration from '/var/buildbot-master/master.cfg'
5[...]
62018-06-08 15:14:52+0000 [-] BuildMaster is running

要返回主机壳,请运行从监狱壳的退出:

1[environment second]
2exit

您已成功配置并启动 Buildbot 主服务. 第二个组件,工人,需要实际运行 builds. 您将在第二个监狱内安装一个工人,然后配置其连接到主服务。

步骤 4 – 安装和运行Buildbot Worker

尽管 Buildbot 主机正在运行,但不会发生任何构建,因为您需要至少一个工作者运行。这个步骤与之前的步骤相似,因为我们将先设置一个单独的监狱,然后安装服务。

此步骤中的说明几乎与主设置相同,但工人组件是另一个包的一部分,您所做的唯一的配置更改包括添加连接它到主器的详细信息,并显示有关工人本身的一些信息。

确保你在主机壳中,而不是监狱里,然后在工人监狱中打开一个 root 壳:

1sudo jexec buildbot-worker0 csh

请记住,在本指南中,如果必须在监狱壳内执行,命令块将以不同的颜色标记,命令提示将反映该命令应该在哪个用户配置文件下运行。

使用以下命令安装 Buildbot worker 包:

1[environment third]
2pkg install py36-buildbot-worker

当这个命令运行时,它会提示您确认是否要启动pkg包管理实用程序. 通过输入y来做到这一点。

接下来,创建一个正常的,非特权的用户来运行工人服务:

1[environment third]
2pw useradd -n buildbot-worker -m -w random

然后创建工人目录,这是工人的配置、显示信息和构建目录将存储的位置:

1[environment third]
2mkdir /var/buildbot-worker

向服务用户转让所有权:

1[environment third]
2chown buildbot-worker:buildbot-worker /var/buildbot-worker

从这一点开始,所有与工人相关的设置和更改都应该作为非特权用户执行. 为此,切换到buildbot-worker用户:

1[environment third]
2su -l buildbot-worker

使用内置的buildbot-worker实用程序在/var/buildbot-worker目录中创建一个目录和配置结构. 指定主监狱的IP地址 - 10.0.0.2,我们在上一步中选择 - 这样工人可以连接到它并用您在主配置文件中定义的密码代替pass:

1[environment third]
2buildbot-worker-3.6 create-worker /var/buildbot-worker 10.0.0.2 worker0 'pass'

要完成设置,请填写有关系统管理员和工作者的目的的几个细节:

1[environment third]
2echo 'Your Name <[email protected]>' >/var/buildbot-worker/info/admin
3echo 'Description of this worker' >/var/buildbot-worker/info/host

接下来,运行exit命令,返回监狱中的 root 用户:

1[environment third]
2exit

因为样本配置会克隆Git存储库(git://github.com/buildbot/hello-world.git)来构建样本项目,所以你也需要在这个监狱内安装Git。 请注意,Buildbot大师也需要Git,因为更改源在主机上运行。

1[environment third]
2pkg install git-lite py27-twisted

工作者运行的内置机制是buildbot-worker start,应该从工作者目录中运行,即/var/buildbot-worker。然而,这并不关心启动时间的启动,也不保证它会在正确的用户下运行。

使用以下命令来定义工作者目录以及该服务应该运行的用户和组:

1[environment third]
2sysrc buildbot_worker_basedir=/var/buildbot-worker
3sysrc buildbot_worker_uid=buildbot-worker
4sysrc buildbot_worker_gid=buildbot-worker

接下来,允许该服务在监狱启动中运行:

1[environment third]
2sysrc buildbot_worker_enable=YES

在写作时,py36-buildbot-worker包有一个错误,阻止服务启动(参见此错误报告)(https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=227675))。

1[environment third]
2sed -i '' 's|command="/usr/local/bin/twistd"|command="/usr/local/bin/twistd-3.6"|' /usr/local/etc/rc.d/buildbot-worker

最后,开始工人组件:

1[environment third]
2service buildbot-worker start

该服务应该在没有错误的情况下开始,您可以通过查看日志文件的最新条目来验证它是否成功:

1[environment third]
2tail /var/buildbot-worker/twistd.log

如果该服务成功启动,则在日志文件中会出现已连接到 10.0.0.2:9989;工人准备好了等消息. 如果您在此步骤中早些时候忘记指定新密码,则该服务将无法连接到主机。

一旦该服务正确启动,请通过从监狱壳执行退出命令,跳出到主机壳:

1[environment third]
2exit

有了这个,第二个监狱已经配置了,你有运行Buildbot所需的所有基本组件。为了让你的用户可以轻松使用,建议你还设置基于Web的用户界面。

步骤 5 – 设置 Buildbot Web 界面

Buildbot 具有基于 Web 的用户界面,显示构建概览和结果,并允许您手动启动构建,如果配置了强力规划器,就像样本配置一样。

您的主配置已经设置了www组件来通过端口8010服务HTTP。在生产设置中,您不会服务未加密的HTTP或向外开放非标准端口8010,因为这将为您的系统打开安全漏洞。 此外,Web接口可以从任何URL路径提供服务,这意味着它不需要成为您的域上的唯一应用程序。 例如,您可以为您的用户提供构建输出或日志。 因此,我们将为用户提供一个单独的Web服务器( Nginx)的UI,以支持HTTPS,保护内部端口,并获得与Buildbot接口一起提供其他内容的能力。

打开 Nginx 配置文件以编辑:

1sudo ee /usr/local/etc/nginx/nginx.conf

在文件的现有服务器块中添加以下突出的位置块:

 1[label /usr/local/etc/nginx/nginx.conf]
 2 . . .
 3http {
 4 . . .
 5    server {
 6
 7 . . .
 8        location / {
 9            root /usr/local/www/nginx;
10            index index.html index.htm;
11        }
12
13        location /buildbot/ {
14            proxy_pass http://10.0.0.2:8010/;
15        }
16        location /buildbot/sse/ {
17            # proxy buffering will prevent sse to work
18            proxy_buffering off;
19            proxy_pass http://10.0.0.2:8010/sse/;
20        }
21        # required for websocket
22        location /buildbot/ws {
23            proxy_http_version 1.1;
24            proxy_set_header Upgrade $http_upgrade;
25            proxy_set_header Connection "upgrade";
26            proxy_pass http://10.0.0.2:8010/ws;
27            # raise the proxy timeout for the websocket
28            proxy_read_timeout 6000s;
29        }
30
31        error_page 500 502 503 504 /50x.html;
32        location = /50x.html {
33            root /usr/local/www/nginx-dist;
34        }
35
36                . . .
37
38    }
39}

此配置将 URL 路径 /buildbot/ 以下的所有请求转发到 Web 界面,并允许 WebSocket 支持,该界面使用 WebSocket 来接收会显示的更新,例如正在运行的构建的日志输出。

保存并关闭 Nginx 配置文件,然后重新加载 Nginx 服务:

1sudo service nginx reload

在本地计算机上打开您喜爱的 Web 浏览器,并通过访问以下 URL 访问 Buildbot Web 界面:

1https://example.com/buildbot/

或者,如果您没有为您的服务器设置域名,则需要输入服务器的公共 IP 地址,即 http://your_server_ip/buildbot/

当你到达界面时,你会看到一个类似于以下的概述:

Web interface overview

主页可能会显示一个警告,即Buildbot URL是错误的配置。如果在nginx.conf文件中提供的主机名不匹配主Buildbot配置中列出的内容,则会发生这种情况。

请注意,在我们的示例配置中,我们没有设置此电子邮件服务. 如果您有兴趣配置此项服务,请参阅Buildbot的有关记者的文档(http://docs.buildbot.net/current/manual/cfg-reporters.html)以获取更多信息:

因此,要解决警告并发送包含正确内容的电子邮件,请编辑 Buildbot 主配置以指向您的域。

1sudo ee /usr/jails/buildbot-master/var/buildbot-master/master.cfg

尋找以「c[buildbotURL]」開始的行,並用您的域名取代默認選項,然後用「/buildbot/'':

1[label /var/buildbot-master/master.cfg]
2####### PROJECT IDENTITY
3# ...
4c['buildbotURL'] = 'https://example.com/buildbot/'
5# ...

保存并关闭文件. 然后,为了应用新的配置,重新加载buildbot服务:

1sudo jexec buildbot-master service buildbot reload

在您的浏览器中更新 Buildbot Web 界面,警告将消失。

连续集成服务器通常除了 CI 之外还有其他用途。例如,一个 CI 服务器可以通过 HTTPS 服务 FreeBSD 包或日志的构建输出。因此,建议您为 Web 接口保留 URL 路径 /buildbot/

运行以下命令,在您的 Web 根中打开索引文件 - 用自己的域名替换 `example.com' - 以创建自动重定向到 Buildbot Web 界面:

1sudo ee /usr/local/www/example.com/html/index.html

<$>[注] 注: 如果您没有遵循 前提 Nginx 教程并为您的 Nginx 配置创建一个新的 Web 根,则需要通过运行 sudo ee /usr/local/www/nginx/index.html来创建默认的 Nginx Web 根下的索引文件。

用以下行替换任何现有文件内容:

 1[label /usr/local/www/nginx/index.html]
 2<html>
 3<body>
 4<a href="/buildbot/">buildbot</a>
 5<script>
 6    // Auto-redirect while only the web interface should be served
 7    window.location.href = "/buildbot/";
 8</script>
 9</body>
10</html>

保存并关闭此文件,然后在浏览器的URL栏中输入您的域名或IP地址。

您已经完成了所有 Buildbot 组件的安装,包括其基于 Web 的控制和查看界面. 有了所有这些,让我们按照我们为主机设置的样本配置中规定的实际构建运行。

在 Web 接口中,点击 Builds > ** Builders** > ** runtests** > ** force** > ** Start Build** ,看看构建如何运行。

Sample build success screenshot

您可以通过查看构建目录的内容来找到本构建(以及其他)的文物:

1ls /usr/jails/buildbot-worker0/var/buildbot-worker/runtests
1[secondary_label Output]
2build

您已成功配置了永久运行和多功能的 CI 系统,现在可以开始实施自己的构建。

结论

通过完成本教程,您练习创建 FreeBSD 监狱,并学习了 Buildbot 自动化框架的一些基本知识,从而实现了可用安装。

从这里开始,您可以自由地实施自己的连续集成和自动化实践,以便为生产使用提供安全、稳定和高性能的设置,您可能需要执行以下可选的配置步骤:

  • 仅使用 HTTPS(如本教程所述)
  • 在本教程中,您为您的监狱使用了单独的主机内部网络lo1。 在本教程中,我们使用了ipfw用于NAT目的,但其他防火墙也具有此功能。 查看 FreeBSD 有关 [可用防火墙]的文档(https://www.freebsd.org/doc/handbook/firewalls.html)。 除非您的使用情况要求其它,否则建议通过使用NAT或其他机制使监狱网络无法访问。
  • Buildbot 的 Web 界面不需要登录或默认检查用户权限。 要执行这些,您将需要启用 用户身份验证.
Published At
Categories with 技术
comments powered by Disqus