Potreboval som nastaviť proces zostavovania a doručovania softvérových balíkov z úložiska Git na stránku. A keď som, nie je to tak dávno, čo som tu na Habré videl článok o buildbotovi (odkaz na konci), rozhodol som sa ho vyskúšať a aplikovať.
Keďže buildbot je distribuovaný systém, bolo by logické vytvoriť samostatného hostiteľa zostavenia pre každú architektúru a operačný systém. V našom prípade to budú kontajnery LXC (v prípade Linuxu) a qemu (v prípade Windows):
vm-srv-build1 - centos 7, bude tam majster buildbotov a jeden z robotníkov
vm-srv-build2 - debian 10, na zostavovanie balíkov DEB
vm-srv-build3 - windows 10, na montáž, viete na čo
Budeme zbierať Rac GUI — grafické rozhranie pre 1C rac na správu klastra serverov. Pre Linux sa použijú štandardné nástroje pre každý OS, na zostavenie exe súboru pre Windows zo skriptu tcl použite freewrap.
Inštalácia
GNU / Linux
Na internete je dostatok dokumentácie na inštaláciu 1,2. Áno, a nespôsobuje žiadne zvláštne problémy:
Pre majstra:
Samozrejme, správnejšie by bolo zbierať balíčky pre každý OS, ale to je nad rámec článku. Vynecháme aj popis nastavenia kontajnerov na prácu, len podotýkam, že používam ProxMox VE. A tiež budete musieť nainštalovať balíčky pre každú os potrebnú na zostavenie (centos: rpmdevtools atď.; debian: build-essential, dh-make, pbuilder atď.)
Budovacie projekty a služby buildbotov budú spustené ako neprivilegovaný používateľ, takže si ich musíte vytvoriť na všetkých hostiteľoch zúčastňujúcich sa na procese:
adduser buildbot
Ďalej nakonfigurujeme automatické spúšťanie služieb na každom z hostiteľov (kontajnerov):
Potom môžete vytvoriť adresárovú infraštruktúru pre „pracovníkov“ (na všetkých hostiteľoch), ak to chcete urobiť, zaregistrujte sa pod používateľom buildbot a spustite nasledujúce príkazy:
Na prvom hostiteľovi 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
Na druhom hostiteľovi 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
Na pracovných hostiteľoch je možné spustiť službu buildbot-worker
systemctl start buildbot-worker
MS Windows
Ako „pracovník“ na montáž pod Windows sa použije virtuálny stroj s najnovším vydaním Win10.
Na prácu potrebujete:
Po nainštalovaní všetkých vyššie uvedených možností môžete nainštalovať samotného buildbota:
pip install buildbot-worker
Vytvorme si pracovný adresár
md c:worker
A poďme na štart
buildbot-worker start c:worker
Ak všetko funguje (pozri log c:workertwistd.log), potom môžete nášho „pracovníka“ zaregistrovať ako službu pridaním položky s pracovným adresárom do registra (príkazy sa vykonávajú v powershell spustenom ako správca):
To je všetko s „pracovníkmi“, nemusíte sa ich ďalej dotýkať, všetko ovládanie pochádza od majstra.
Nastavenie sprievodcu
Na začiatok vytvorte infraštruktúru pre master (na hlavnom hostiteľovi), aby ste to urobili, zaregistrujte sa pod používateľom buildbot a spustite nasledujúce príkazy:
su - buildbot
mkdir /home/buildbot/master
cd ~
buildbot create-master master
Pre hotové balíky vytvorte adresár builds
mkdir /home/buildbot/builds
V adresári /home/buildbot/master/ bol vytvorený súbor master.cfg. Tento súbor je kód pythonu a obsahuje popis všetkých mechanizmov systému, s ktorým budeme v budúcnosti pracovať.
Pre automatizáciu zostavovania balíkov rôznych verzií, aby ste sa nemuseli vŕtať v kóde súboru master.cfg, boli v hlavnom skripte programu rac_gui.tcl do hlavičky pridané riadky s aktuálnou verziou a vydaním. :
A na základe týchto riadkov bude buildbot očíslovať balíčky. Na extrahovanie údajov použite volanie konzoly grep. V buildbote jednoducho nemôžete definovať premenné pre „pracovníkov“ (aspoň som nenašiel ako). Na to slúžia vlastnosti. Tie. V procese zostavovania pridávame kroky na určenie verzie a vydania a podľa toho nastavujeme vlastnosti verzie a vydania. Vlastnosti je možné nastaviť rôznymi spôsobmi, v tomto prípade volaním príkazu konzoly:
# Добавим определение версии из основного файла
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"
)
)
Výsledné hodnoty môžete nahradiť volaním util.Interpolate().
Hotový zostavený balík a archív so zdrojmi skopírujeme na master. Môžete však okamžite skopírovať súbory z pracovného súboru do svojho úložiska alebo webovej lokality.
# Скопируем файл на мастер
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")
)
)
Začnime proces kopírovania zozbieraných balíkov na hosting cez FTP na masteri. Na tento účel sa používa skript na tcl.
To je všetko s RPM. Teraz začnime popisovať algoritmus na zostavenie balíka DEB. Keďže procesy vytvárania balíkov pre rôzne systémy sú na sebe nezávislé, mnohé kroky sa budú opakovať.
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"]))
V prípade balíka RPM niektoré z nasledujúcich postupov vykonáva samotný rpm počas zostavovania a sú popísané v špecifikácii; pre Debian to musíte urobiť tu:
# Поменяем пути к библиотекам
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")]
)
)
Uložte súbor a môžete skúsiť spustiť službu sprievodcu:
systemctl restart buildbot-master
V protokole skontrolujeme, či je všetko v poriadku s konfiguráciou a všetko funguje ako normálne. Všetci naši pracovníci by sa teraz mali pripojiť, čo bude šťastne zaznamenané v denníku »»'/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
Týmto sa dokončí proces nastavenia. Aktuálny stav si môžete pozrieť cez webové rozhranie. Kde môžete tiež vidieť chyby zostavenia, nakopnúť zamrznutý proces, ak sa niečo pokazilo atď.
Ihneď po spustení si našich pracantov môžete prezerať cez menu “Builds” -> “Workers”
Po dokončení prvého procesu zostavenia (t. j. zmien v úložisku Git) sa stav procesov zobrazí na prvej stránke.
Ak kliknete myšou na požadovaný riadok, otvorí sa stránka s aktuálnym stavom tohto procesu, kde vidíte, čo sa deje, aké chyby atď.