Ik moest het proces opzetten van het samenstellen en leveren van softwarepakketten vanuit een Git-repository naar de site. En toen ik nog niet zo lang geleden hier op Habré een artikel over buildbot zag (link aan het einde), besloot ik het te proberen en toe te passen.
Omdat buildbot een gedistribueerd systeem is, zou het logisch zijn om voor elke architectuur en besturingssysteem een aparte buildhost te creëren. In ons geval zijn dit LXC-containers (in het geval van Linux) en qemu (in het geval van Windows):
vm-srv-build1 - centos 7, er zal een buildbot-master en een van de werkers zijn
vm-srv-build2 - debian 10, voor het bouwen van DEB-pakketten
vm-srv-build3 - Windows 10, voor montage, je weet waarvoor
Wij zullen verzamelen Rac-GUI — een grafische interface voor 1C rac voor het beheren van een cluster van servers. Voor Linux worden standaardtools voor elk besturingssysteem gebruikt; om een exe-bestand voor Windows te bouwen vanuit een tcl-script, gebruikt u gratis inpakken.
installatie
GNU / Linux
Er is voldoende documentatie op internet voor de installatie 1,2. Ja, en het veroorzaakt geen speciale problemen:
Voor de meester:
Het zou natuurlijk juister zijn om pakketten voor elk besturingssysteem te verzamelen, maar dit valt buiten het bestek van het artikel. Ook de beschrijving van het opzetten van containers voor werk laten we achterwege, ik merk alleen op dat ik ProxMox VE gebruik. En u zult ook pakketten moeten installeren voor elke as die nodig is voor de assemblage (centos: rpmdevtools, enz.; debian: build-essential, dh-make, pbuilder, enz.)
Bouwprojecten en buildbot-services worden gelanceerd als een gebruiker zonder rechten, dus u moet er een aanmaken op alle hosts die aan het proces deelnemen:
adduser buildbot
Vervolgens zullen we de automatische lancering van services configureren op respectievelijk elk van de hosts (containers):
Hierna kunt u een directory-infrastructuur voor “werknemers” (op alle hosts) creëren. Om dit te doen, registreert u zich onder de buildbot-gebruiker en voert u de volgende opdrachten uit:
Op de eerste host 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
Op de tweede host 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
Op worker-hosts kan de buildbot-worker-service worden gestart
systemctl start buildbot-worker
MS Windows
Als “werker” voor assemblage onder Windows zal een virtuele machine met de nieuwste versie van Win10 worden gebruikt.
Om te werken heb je nodig:
Nadat al het bovenstaande is geïnstalleerd, kunt u de buildbot zelf installeren:
pip install buildbot-worker
Laten we een werkmap maken
md c:worker
En laten we lanceren
buildbot-worker start c:worker
Als alles werkt (zie log c:workertwistd.log), dan kunt u onze “worker” als service registreren door een item met de werkmap aan het register toe te voegen (opdrachten worden uitgevoerd in powershell en draaien als beheerder):
Dat is alles bij de “werkers”, je hoeft ze niet verder aan te raken, alle controle komt van de meester.
Wizard-installatie
Laten we om te beginnen de infrastructuur voor de master (op de hoofdhost) creëren. Om dit te doen, registreert u zich onder de buildbot-gebruiker en voert u de volgende opdrachten uit:
su - buildbot
mkdir /home/buildbot/master
cd ~
buildbot create-master master
Voor kant-en-klare pakketten maakt u een builds-directory
mkdir /home/buildbot/builds
Er is een master.cfg-bestand gemaakt in de map /home/buildbot/master/. Dit bestand is een Python-code en bevat een beschrijving van alle mechanismen van het systeem; we zullen er in de toekomst mee gaan werken.
Om het samenstellen van pakketten van verschillende versies te automatiseren, om niet in de code van het bestand master.cfg te hoeven duiken, zijn in het hoofdscript van het programma rac_gui.tcl regels met de huidige versie en release in de header toegevoegd :
En op basis van deze regels nummert buildbot de pakketten. Om gegevens te extraheren, gebruikt u de console grep-oproep. In buildbot kun je eenvoudigweg geen variabelen definiëren voor “werknemers” (althans, ik heb niet gevonden hoe). Dit is waar eigenschappen voor worden gebruikt. Die. In het assemblageproces voegen we stappen toe om de versie en release te bepalen en dienovereenkomstig de versie- en release-eigenschappen in te stellen. Eigenschappen kunnen op verschillende manieren worden ingesteld, in dit geval door het consolecommando aan te roepen:
# Добавим определение версии из основного файла
rac_gui_build_RPM.addStep(
steps.SetPropertyFromCommand(
command="grep version ../rac-gui/rac_gui.tcl | grep -oE 'b[0-9]{1,2}.[0-9]{1,2}.[0-9]{1,2}b'", property="version"
)
)
# Добавим определение релиза из основного файла
rac_gui_build_RPM.addStep(
steps.SetPropertyFromCommand(
command="grep release ../rac-gui/rac_gui.tcl | grep -oE 'b[0-9]{1,3}b'", property="release"
)
)
U kunt de resulterende waarden vervangen door util.Interpolate() aan te roepen.
Hierbij moet worden opgemerkt dat aangezien de host ook wordt gebruikt voor het handmatig samenstellen van pakketten, de montage langs standaardpaden zal plaatsvinden.
Om de juiste release- en versienummers in te stellen, gebruikt u een standaard sed-oproep, d.w.z. de opdracht vervangt de waarden in het spec-bestand door de vereiste waarden
We kopiëren het voltooide samengestelde pakket en het archief met bronnen naar de master. Maar u kunt bestanden direct vanuit uw werkbestand naar uw repository of website kopiëren.
# Скопируем файл на мастер
rac_gui_build_RPM.addStep(
steps.FileUpload(
workersrc=util.Interpolate("/home/buildbot/rpmbuild/RPMS/noarch/rac-gui-%(prop:version)s-%(prop:release)s.noarch.rpm"),
masterdest=util.Interpolate("/home/buildbot/builds/rac-gui-%(prop:version)s-%(prop:release)s.noarch.rpm")
)
)
rac_gui_build_RPM.addStep(
steps.FileUpload(
workersrc=util.Interpolate("/home/buildbot/rpmbuild/SOURCES/rac-gui-%(prop:version)s-%(prop:release)s.tar.gz"),
masterdest=util.Interpolate("/home/buildbot/builds/rac-gui-%(prop:version)s-%(prop:release)s.tar.gz")
)
)
Laten we beginnen met het kopiëren van de verzamelde pakketten naar de hosting via FTP op de master. Voor dit doel wordt het gebruikt script op tcl.
Dat is het met RPM. Laten we nu beginnen met het beschrijven van het algoritme voor het bouwen van een DEB-pakket. Omdat de processen voor het bouwen van pakketten voor verschillende systemen onafhankelijk van elkaar zijn, zullen veel stappen worden herhaald.
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)
)
# Добавим определение версии из основного файла
rac_gui_build_DEB.addStep(
steps.SetPropertyFromCommand(
command="grep version rac_gui.tcl | grep -oE 'b[0-9]{1,2}.[0-9]{1,2}.[0-9]{1,2}b'", property="version"
)
)
# Добавим определение релиза из основного файла
rac_gui_build_DEB.addStep(
steps.SetPropertyFromCommand(
command="grep release rac_gui.tcl | grep -oE 'b[0-9]{1,3}b'", property="release"
)
)
# Переименуем запускаемый файл
rac_gui_build_DEB.addStep(steps.ShellCommand(
command=["mv", "rac_gui.tcl", "racgui"]))
Voor een RPM-pakket worden enkele van de volgende procedures door de rpm zelf uitgevoerd tijdens de assemblage en worden ze beschreven in de specificatie; voor Debian moet u dit hier doen:
# Поменяем пути к библиотекам
rac_gui_build_DEB.addStep(steps.ShellCommand(
command=["sed", "-i", "s+^set dir(lib)+set dir(lib) /usr/share/rac-gui/lib ;#+g", "racgui"]))
# Поменяем пути к файлам
rac_gui_build_DEB.addStep(steps.ShellCommand(
command=["sed", "-i", "s+[pwd]+/usr/share/rac-gui+g", "racgui"]))
# заархивируем исходники
rac_gui_build_DEB.addStep(steps.ShellCommand(
command=["tar", "czf", util.Interpolate("../rac-gui_%(prop:version)s.orig.tar.gz"), "."]))
# Соберём пакет
rac_gui_build_DEB.addStep(steps.ShellCommand(
command=["dpkg-buildpackage"]))
# Скопируем файл на мастер
rac_gui_build_DEB.addStep(
steps.FileUpload(
workersrc=util.Interpolate("../rac-gui_%(prop:version)s-%(prop:release)s_amd64.deb"),
masterdest=util.Interpolate("/home/buildbot/builds/rac-gui_%(prop:version)s-%(prop:release)s_amd64.deb")
)
)
rac_gui_build_DEB.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_amd64.deb"),
util.Interpolate("--remote-file=uploads/rac-gui/rac-gui_%(prop:version)s-%(prop:release)s_amd64.deb")]
)
)
Sla het bestand op en u kunt proberen de wizardservice te starten:
systemctl restart buildbot-master
In het logboek zullen we controleren of alles in orde is met de configuratie en dat alles normaal werkt. Al onze werkers zouden nu verbinding moeten maken, wat graag zal worden gerapporteerd in het log »»'/home/buildbot/master/twistd.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
Hiermee is het installatieproces voltooid. Via de webinterface kunt u de huidige status bekijken. Waar je ook bouwfouten kunt zien, een bevroren proces kunt starten als er iets mis is gegaan, enz.
Direct na de lancering zijn onze harde werkers te bekijken via het menu “Builds” -> “Workers”
Nadat het eerste bouwproces is voltooid (dat wil zeggen wijzigingen in de Git-repository), verschijnt de status van de processen op de eerste pagina.
Als u met de muis op de gewenste regel klikt, wordt een pagina geopend met de huidige status van dit proces, waar u kunt zien wat er gebeurt, welke fouten enz.