我需要设置将软件包从Git存储库组装和交付到站点的过程。 不久前,在Habr上看到了buildbot上的文章(末尾的链接)决定尝试并申请。
由于buildbot是一个分布式系统,因此对于每个体系结构和OS来说,构成一个单独的程序集宿主都是合乎逻辑的。 在我们的情况下,这些将是LXC容器(对于linux)和qemu(对于Windows):
- vm-srv-build1-centos 7,将有一个buildbot主节点和其中一个工作线程
- vm-srv-build2-debian 10,用于构建DEB软件包
- vm-srv-build3-Windows 10,用于组装,您自己明白
我们将收集Rac GUI -1C rac的图形界面,用于管理服务器集群。 在Linux下,将使用每个操作系统的标准工具, freewrap用于从tcl脚本为Windows构建exe文件。
安装方式
GNU / Linux
对于安装,网络上的文档足够1,2 。 而且它不会引起任何特殊问题:
对于主人:
pip3 install buildbot pip3 install twisted pip3 install autobahn pip3 install pysqlite3 pip3 install sqlalchemy sqlalchemy-migrate pip3 install buildbot-www buildbot-grid-view buildbot-console-view buildbot-waterfall-view pip3 install python-dateutil
对于“工人”来说,这就足够了:
pip3 install buildbot-worker
当然,为每个操作系统收集软件包会更正确,但这不包括在本文范围内。 我们也省略了为工作配置容器的描述,我只注意到我使用ProxMox VE。 并且您还需要为组装所需的每个轴安装软件包(centos:rpmdevtools等; debian:build-essential,dh-make,pbuilder等)。
项目组装和buildbot服务将代表无特权的用户启动,因此您需要在该过程中涉及的所有主机上创建它:
adduser buildbot
接下来,分别在每个主机(容器)上配置服务的自动启动:
系统单元运行向导:
touch /etc/systemd/buildbot-master.service [Unit] Description=BuildBot master service After=network.target [Service] User=buildbot Group=buildbot WorkingDirectory=/home/buildbot/master ExecStart=/usr/local/bin/buildbot start --nodaemon ExecReload=/bin/kill -HUP $MAINPID [Install] WantedBy=multi-user.target
和“工人”
touch /etc/systemd/buildbot-worker.service [Unit] Description=BuildBot worker service After=network.target [Service]master User=buildbot Group=buildbot WorkingDirectory=/home/buildbot/worker ExecStart=/usr/local/bin/buildbot-worker start --nodaemon [Install] WantedBy=buildbot-master.service
由于所有脚本(在我们的例子中)都在/ usr / local /中,因此您应该在环境变量中写入它们的路径:
nano /root/.bash_profile PATH=$PATH:$HOME/.local/bin:$HOME/bin:/usr/local/bin
之后,您可以(在所有主机上)为“工人”创建目录基础结构,为此,请在buildbot用户下注册并执行以下命令:
在第一台主机vm-srv-build1上:
su - buildbot mkdir /home/buildbot/worker cd ~ buildbot-worker create-worker --umask=0o22 --keepalive=60 worker vm-srv-build1:4000 CentOS 123456
在第二台主机vm-srv-build2上:
su - buildbot mkdir /home/buildbot/worker cd ~ buildbot-worker create-worker --umask=0o22 --keepalive=60 worker vm-srv-build1:4000 Debian-10 123456
在工作主机上,可以启动buildbot-worker服务
systemctl start buildbot-worker
微软视窗
作为Windows的“有效”构建,将使用具有最新Win10版本的虚拟机。
要工作,您需要:
安装完上述所有内容后,您可以安装buildbot本身:
pip install buildbot-worker
创建一个工作目录
md c:\worker
然后跑
buildbot-worker start c:\worker
如果一切正常(请参阅c:\ worker \ twisted.log日志),则可以通过将带有工作目录的项目添加到注册表中来将我们的“ worker”注册为服务(命令在以管理员身份运行的powershell中执行):
buildbot_worker_windows_service.exe --user VM-SRV-BUILD3\buildbot --password 123456 --startup auto install New-ItemProperty -path Registry::HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\BuildBot\Parameters -Name directories -PropertyType String -Value c:\worker
你可以经营一个仆人
Start-Service buildbot
这一切都由“工人”承担,那么您就不必再与他们接触了,所有管理工作都由主人来进行。
设定精灵
首先,我们将为向导(在主主机上)创建基础结构,为此,我们在buildbot用户下注册并执行以下命令:
su - buildbot mkdir /home/buildbot/master cd ~ buildbot create-master master
对于完成的软件包,创建构建目录
mkdir /home/buildbot/builds
master.cfg文件是在/ home / buildbot / master /目录中创建的。 该文件是python代码,包含对系统所有机制的描述,我们将继续使用它。
nano /home/buildbot/master/master.cfg
import os, re from buildbot.plugins import steps, util, schedulers, worker, changes, reporters c= BuildmasterConfig ={}
要自动组装不同版本的软件包,以使您不必进入master.cfg文件的代码,在rac_gui.tcl程序的主脚本的标题中,添加与当前版本和发行版的行:
基于这些内容,buildbot将为软件包编号。 要提取数据,请使用控制台grep调用。 在buildbot中,您根本无法为“工人”定义变量(无论如何,我都没有找到方法)。 为此,请使用属性。 即 在组装过程中,添加确定版本和发行版的步骤,并相应地设置版本和发行版属性。 可以通过多种方式设置属性,在这种情况下,它是对控制台命令的调用:
通过调用util.Interpolate()替代获得的值。
应该注意的是,由于主机也用于手工组装包装,所以组装将沿着标准路径进行。
要设置正确的发行版和版本号,请使用标准的sed调用,即 该命令将spec文件中的值替换为必要的
我们将完成的组装包复制,并将带有源代码的存档归档到主服务器。 但是您可以立即将文件从桌面复制到存储库或网站。
在向导上,我们开始将收集的软件包复制到FTP主机的过程。 为此,请使用tcl 脚本 。
rac_gui_build_RPM.addStep( steps.MasterShellCommand( command=["/usr/local/bin/deploy-ftp.tcl", util.Interpolate("--local-file=/home/buildbot/builds/rac-gui-%(prop:version)s-%(prop:release)s.noarch.rpm"), util.Interpolate("--remote-file=uploads/rac-gui/rac-gui-%(prop:version)s-%(prop:release)s.noarch.rpm")] ) ) rac_gui_build_RPM.addStep( steps.MasterShellCommand( command=["/usr/local/bin/deploy-ftp.tcl", util.Interpolate("--local-file=/home/buildbot/builds/rac-gui-%(prop:version)s-%(prop:release)s.tar.gz"), util.Interpolate("--remote-file=uploads/rac-gui/rac-gui-%(prop:version)s-%(prop:release)s.tar.gz")] ) )
在RPM上完成。 现在让我们开始描述DEB包的组装算法。 由于为不同系统构建软件包的过程彼此独立,因此将重复许多步骤。
rac_gui_build_DEB = util.BuildFactory() rac_gui_build_DEB.addStep(steps.Git( repourl = 'https://bitbucket.org/svk28/rac-gui.git', haltOnFailure = True, submodules = True, mode='full', workdir='build', progress = True) )
对于RPM软件包,以下过程的一部分由rpm本身在组装过程中完成,并在规范内进行了描述,对于debian,您必须在此处执行:
完成DEB,现在是Windows!
rac_gui_build_WIN = util.BuildFactory() rac_gui_build_WIN.addStep(steps.Git( repourl = 'https://bitbucket.org/svk28/rac-gui.git', haltOnFailure = True, submodules = True, mode='full', workdir='build', progress = True) )
由于Windows没有grep和sed(或存在),因此我们将使用powershell
为了通知组装过程的状态,我们将使用电子邮件
c['services'] = [] template=u'''\ <h4>Build status: {{ summary }}</h4> <p> Worker used: {{ workername }}</p> {% for step in build['steps'] %} <p> {{ step['name'] }}: {{ step['result'] }}</p> {% endfor %} <p><b> -- The Buildbot</b></p> ''' mailNotifier = reporters.MailNotifier(fromaddr="builder@domain.ru", sendToInterestedUsers=False, mode=('all'), extraRecipients=["admin@domain.ru"], relayhost="mail.domain.ru", smtpPort=587, smtpUser="builder@domain.ru", smtpPassword="******", messageFormatter=reporters.MessageFormatter( template=template, template_type='html', wantProperties=True, wantSteps=True)) c['services'].append(mailNotifier)
我们保存了文件,您可以尝试启动向导服务:
systemctl restart buildbot-master
在日志中,我们检查配置是否一切正常,并且一切正常。 我们所有的员工现在都应该连接,这将在“''''/home/buildbot/master/twistd.log'''''log中愉快地报告:
2019-07-24 16:50:35+0300 [-] Loading buildbot.tac... 2019-07-24 16:50:35+0300 [-] Loaded. 2019-07-24 16:50:35+0300 [-] twistd 19.2.1 (/usr/bin/python3.6 3.6.8) starting up. 2019-07-24 16:50:35+0300 [-] reactor class: twisted.internet.epollreactor.EPollReactor. 2019-07-24 16:50:35+0300 [-] Starting BuildMaster -- buildbot.version: 2.3.1 2019-07-24 16:50:35+0300 [-] Loading configuration from '/home/buildbot/master/master.cfg' 2019-07-24 16:50:36+0300 [-] /usr/local/lib/python3.6/site-packages/buildbot/config.py:90: buildbot.config.ConfigWarning: [0.9.0 and later] `buildbotNetUsageData` is not configured and defaults to basic. This parameter helps the buildbot development team to understand the installation base. No personal information is collected. Only installation software version info and plugin usage is sent. You can `opt-out` by setting this variable to None. Or `opt-in` for more information by setting it to "full". 2019-07-24 16:50:36+0300 [-] Setting up database with URL 'sqlite:/state.sqlite' 2019-07-24 16:50:36+0300 [-] setting database journal mode to 'wal' 2019-07-24 16:50:36+0300 [-] adding 1 new services, removing 0 2019-07-24 16:50:36+0300 [-] adding 1 new change_sources, removing 0 2019-07-24 16:50:36+0300 [-] gitpoller: using workdir '/home/buildbot/master/gitpoller-work' 2019-07-24 16:50:36+0300 [-] adding 3 new builders, removing 0 2019-07-24 16:50:36+0300 [-] adding 1 new schedulers, removing 0 2019-07-24 16:50:36+0300 [-] initializing www plugin 'waterfall_view' 2019-07-24 16:50:36+0300 [-] initializing www plugin 'console_view' 2019-07-24 16:50:36+0300 [-] initializing www plugin 'grid_view' 2019-07-24 16:50:36+0300 [-] NOTE: www plugin 'sitenav' is installed but not configured 2019-07-24 16:50:36+0300 [-] initializing www plugin 'waterfall_view' 2019-07-24 16:50:36+0300 [-] initializing www plugin 'console_view' 2019-07-24 16:50:36+0300 [-] initializing www plugin 'grid_view' 2019-07-24 16:50:36+0300 [-] NOTE: www plugin 'sitenav' is installed but not configured 2019-07-24 16:50:36+0300 [-] BuildbotSite starting on 80 2019-07-24 16:50:36+0300 [-] Starting factory <buildbot.www.service.BuildbotSite object at 0x7fe31c2657b8> 2019-07-24 16:50:36+0300 [-] adding 3 new workers, removing 0 2019-07-24 16:50:36+0300 [-] PBServerFactory starting on 4000 2019-07-24 16:50:36+0300 [-] Starting factory <twisted.spread.pb.PBServerFactory object at 0x7fe31c147470> 2019-07-24 16:50:37+0300 [-] BuildMaster is running 2019-07-24 16:50:37+0300 [-] buildbotNetUsageData: sending {'installid': 'b6193b126b96689351d2fe95787c5a03fc0879f9', 'versions': {'Python': '3.6.8', 'Buildbot': '2.3.1', 'Twisted': '19.2.1'}, 'platform': {'platform': 'Linux-4.15.18-10- pve-x86_64-with-centos-7.6.1810-Core', 'system': 'Linux', 'machine': 'x86_64', 'processor': 'x86_64', 'python_implementation': 'CPython', 'version': '#1 SMP PVE 4.15.18-32', 'distro': 'centos:7'}, 'plugins': {'buildbot/worker/base/Worker': 3, 'buildbot/config/BuilderConfig': 3, 'buildbot/schedulers/basic/SingleBranchScheduler': 1, 'buildbot/reporters/mail/MailNotifier': 1, 'buildbot/changes/gitpoller/GitPoller': 1, 'buildbot/steps/worker/MakeDirectory': 1, 'buildbot/steps/source/git/Git': 3, 'buildbot/steps/shell/ShellCommand': 9, 'buildbot/steps/package/rpm/rpmbuild/RpmBuild': 1}, 'db': 'sqlite', 'mq': 'simple', 'www_plugins': ['waterfall_view', 'console_view', 'grid_view']} 2019-07-24 16:50:37+0300 [Broker,0,127.0.0.1] worker 'CentOS' attaching from IPv4Address(type='TCP', host='127.0.0.1', port=37332) 2019-07-24 16:50:37+0300 [Broker,0,127.0.0.1] Got workerinfo from 'CentOS' 2019-07-24 16:50:37+0300 [-] bot attached 2019-07-24 16:50:37+0300 [Broker,0,127.0.0.1] Worker CentOS attached to Rac-GUI-RPM-builder 2019-07-24 16:50:37+0300 [-] buildbotNetUsageData: buildbot.net said: ok 2019-07-24 16:50:39+0300 [Broker,1,192.168.55.15] worker 'Windows-10' attaching from IPv4Address(type='TCP', host='192.168.5.145', port=49831) 2019-07-24 16:50:39+0300 [Broker,1,192.168.55.15] Got workerinfo from 'Windows-10' 2019-07-24 16:50:40+0300 [-] bot attached 2019-07-24 16:50:40+0300 [Broker,1,192.168.55.15] Worker Windows-10 attached to Rac-GUI-WIN-builder 2019-07-24 16:50:41+0300 [Broker,2,192.168.55.99] worker 'Debian-10' attaching from IPv4Address(type='TCP', host='192.168.5.9', port=44430) 2019-07-24 16:50:41+0300 [Broker,2,192.168.55.99] Got workerinfo from 'Debian-10' 2019-07-24 16:50:41+0300 [-] bot attached 2019-07-24 16:50:41+0300 [Broker,2,192.168.55.99] Worker Debian-10 attached to Rac-GUI-DEB-builder
这样就完成了设置过程。 您可以通过网络界面查看当前状态。 在这里您还可以看到装配错误,如果出现问题,则启动冻结的进程,等等。
在我们的辛勤工作人员启动后,您立即可以通过菜单“建筑物”->“工人”查看

在第一个构建过程完成(即,对Git存储库的更改)之后,过程的状态将显示在第一页上。

如果在所需的行中戳鼠标,则会打开一个页面,显示该进程的当前状态,您可以在其中查看正在发生的情况,发生的错误等。

您可以在此处进行整个主配置 import os, re from buildbot.plugins import steps, util, schedulers, worker, changes, reporters c= BuildmasterConfig ={} c['workers'] = [ worker.Worker('CentOS', '123456'), worker.Worker('Debian-10', '123456'), worker.Worker('Windows-10', '123456')] c['protocols'] = {'pb': {'port': 4000}} c['change_source'] = [] c['change_source'].append(changes.GitPoller( repourl = 'https://bitbucket.org/svk28/rac-gui.git', project = 'Rac-GUI', branches = True, pollInterval = 600 ))
: