Aveam nevoie să configurez procesul de asamblare și livrare a pachetelor software dintr-un depozit Git către site. Și când am văzut, nu cu mult timp în urmă, aici pe Habré un articol despre buildbot (link la final), m-am hotărât să-l încerc și să-l aplic.
Deoarece buildbot este un sistem distribuit, ar fi logic să se creeze o gazdă de construcție separată pentru fiecare arhitectură și sistem de operare. În cazul nostru, acestea vor fi containere LXC (în cazul Linux) și qemu (în cazul Windows):
vm-srv-build1 - centos 7, va exista un maestru buildbot (master) și unul dintre lucrători (lucrător)
vm-srv-build2 - debian 10, pentru construirea pachetelor DEB
vm-srv-build3 - Windows 10, pentru asamblare, știți pentru ce
Vom colecta Rac GUI — o interfață grafică pentru 1C rac pentru gestionarea unui cluster de servere. Pentru Linux, instrumentele standard pentru fiecare sistem de operare vor fi folosite pentru a construi un fișier exe pentru Windows dintr-un script tcl; freewrap.
Instalare
GNU / Linux
Există suficientă documentație pe Internet pentru instalare 1,2. Da, și nu provoacă probleme speciale:
Pentru maestru:
Desigur, ar fi mai corect să colectăm pachete pentru fiecare sistem de operare, dar acest lucru depășește domeniul de aplicare al articolului. De asemenea, vom omite descrierea instalării containerelor pentru lucru, voi reține doar că folosesc ProxMox VE. Și va trebui, de asemenea, să instalați pachete pentru fiecare axă necesară pentru asamblare (centos: rpmdevtools, etc.; debian: build-essential, dh-make, pbuilder etc.)
Proiectele de build și serviciile buildbot vor fi lansate ca utilizator neprivilegiat, așa că trebuie să creați unul pe toate gazdele care participă la proces:
adduser buildbot
În continuare, vom configura lansarea automată a serviciilor, respectiv, pe fiecare dintre gazde (containere):
După aceasta, puteți crea o infrastructură de director pentru „lucrători” (pe toate gazdele), pentru a face acest lucru, înregistrați-vă sub utilizatorul buildbot și rulați următoarele comenzi:
Pe prima gazdă 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
Pe a doua gazdă 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
Pe gazdele de lucru, serviciul buildbot-worker poate fi pornit
systemctl start buildbot-worker
MS Windows
În calitate de „lucrător” pentru asamblare sub Windows, va fi utilizată o mașină virtuală cu cea mai recentă versiune de Win10.
Pentru a lucra veți avea nevoie de:
După ce toate cele de mai sus sunt instalate, puteți instala buildbot-ul în sine:
pip install buildbot-worker
Să creăm un director de lucru
md c:worker
Și hai să lansăm
buildbot-worker start c:worker
Dacă totul funcționează (consultați jurnalul c:workertwistd.log), atunci puteți înregistra „lucrătorul” nostru ca serviciu adăugând un element cu directorul de lucru în registru (comenzile sunt executate în powershell rulând ca administrator):
Asta e tot cu „muncitorii”, nu trebuie să-i atingi mai mult, tot controlul vine de la stăpân.
Configurarea vrăjitorului
Pentru început, să creăm infrastructura pentru master (pe gazda principală), pentru a face acest lucru, înregistrați-vă sub utilizatorul buildbot și rulați următoarele comenzi:
su - buildbot
mkdir /home/buildbot/master
cd ~
buildbot create-master master
Pentru pachetele gata făcute, creați un director de builds
mkdir /home/buildbot/builds
Un fișier master.cfg a fost creat în directorul /home/buildbot/master/. Acest fișier este un cod python și conține o descriere a tuturor mecanismelor sistemului cu care vom lucra în viitor.
Pentru a automatiza asamblarea pachetelor de diferite versiuni, pentru a nu fi nevoit să pătrundă în codul fișierului master.cfg, în scriptul principal al programului rac_gui.tcl au fost adăugate în antet linii cu versiunea și lansarea curentă. :
Și pe baza acestor linii, buildbot va numerota pachetele. Pentru a extrage date, utilizați apelul grep de consolă. În buildbot pur și simplu nu puteți defini variabile pentru „lucrători” (cel puțin, nu am găsit cum). Pentru asta sunt folosite proprietățile. Acestea. În procesul de asamblare, adăugăm pași pentru a determina versiunea și lansarea și, în consecință, setăm proprietățile versiunii și lansării. Proprietățile pot fi setate în diferite moduri, în acest caz apelând comanda consolei:
# Добавим определение версии из основного файла
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"
)
)
Pentru a seta numerele corecte de ediție și versiune, utilizați un apel standard sed, de ex. comanda înlocuiește valorile din interiorul fișierului de specificații cu cele necesare
Copiem pachetul asamblat finit și arhiva cu surse către master. Dar puteți copia imediat fișierele din fișierul dvs. de lucru în depozitul sau site-ul dvs. web.
# Скопируем файл на мастер
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")
)
)
Să începem procesul de copiere a pachetelor colectate în găzduire prin FTP pe master. În acest scop este folosit scenariu pe tcl.
Asta e cu RPM. Acum să începem să descriem algoritmul pentru construirea unui pachet DEB. Deoarece procesele de construire a pachetelor pentru diferite sisteme sunt independente unele de altele, se vor repeta mulți pași.
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"]))
Pentru un pachet RPM, unele dintre următoarele proceduri sunt efectuate de rpm în sine în timpul asamblarii și sunt descrise în specificațiile pentru Debian, trebuie să le faceți aici:
# Поменяем пути к библиотекам
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")]
)
)
Salvați fișierul și puteți încerca să porniți serviciul expert:
systemctl restart buildbot-master
În jurnal vom verifica dacă totul este în ordine cu configurația și totul funcționează normal. Toți lucrătorii noștri ar trebui să se conecteze acum, ceea ce va fi raportat cu plăcere în jurnalul »»'/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
Acest lucru completează procesul de configurare. Puteți vizualiza starea curentă prin interfața web. Unde puteți vedea, de asemenea, erori de construcție, puteți debloca un proces înghețat dacă ceva nu a mers prost etc.
Imediat după lansare, muncitorii noștri pot fi vizualizați prin meniul „Construiți” -> „Lucrători”
După finalizarea primului proces de construire (adică modificările aduse depozitului Git), starea proceselor va apărea pe prima pagină.
Dacă faceți clic pe linia dorită cu mouse-ul, se va deschide o pagină cu starea curentă a acestui proces, unde puteți vedea ce se întâmplă, ce erori etc.
Întreaga configurație a vrăjitorului poate fi găsită aici