Morao sam da postavim proces sastavljanja i isporuke softverskih paketa iz Git repozitorija na sajt. I kada sam ne tako davno vidio ovdje na Habréu članak o buildbotu (link na kraju), odlučio sam ga isprobati i primijeniti.
Pošto je buildbot distribuirani sistem, bilo bi logično kreirati poseban host za svaku arhitekturu i operativni sistem. U našem slučaju, to će biti LXC kontejneri (u slučaju Linuxa) i qemu (u slučaju Windowsa):
vm-srv-build1 - centos 7, tu će biti buildbot master i jedan od radnika
vm-srv-build2 - debian 10, za pravljenje DEB paketa
vm-srv-build3 - windows 10, za montažu, znate za šta
Mi ćemo prikupiti Rac GUI — grafički interfejs za 1C rac za upravljanje klasterom servera. Za Linux će se koristiti standardni alati za svaki OS; da biste napravili exe datoteku za Windows iz tcl skripte, koristite freewrap.
postavljanje
GNU / Linux
Na internetu postoji dovoljno dokumentacije za instalaciju 1,2. Da, i ne uzrokuje nikakve posebne probleme:
Za majstora:
Naravno, bilo bi ispravnije prikupiti pakete za svaki OS, ali to je izvan okvira članka. Izostavićemo i opis postavljanja kontejnera za rad, samo ću napomenuti da koristim ProxMox VE. Također ćete morati instalirati pakete za svaku osovinu potrebnu za sklapanje (centos: rpmdevtools, itd.; debian: build-essential, dh-make, pbuilder, itd.)
Build projekti i buildbot servisi će biti pokrenuti kao neprivilegirani korisnik, tako da morate kreirati jedan na svim hostovima koji učestvuju u procesu:
adduser buildbot
Zatim ćemo konfigurirati automatsko pokretanje usluga, odnosno na svakom od hostova (kontejnera):
Nakon toga, možete kreirati infrastrukturu direktorija za "radnike" (na svim hostovima), da biste to učinili, registrirajte se pod buildbot korisnika i pokrenite sljedeće naredbe:
Na prvom hostu 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 drugom hostu 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 radničkim hostovima može se pokrenuti servis buildbot-worker
systemctl start buildbot-worker
MS Windows
Kao "radnik" za sklapanje pod Windows-om, koristit će se virtuelna mašina sa najnovijim izdanjem Win10.
Za rad će vam trebati:
Nakon što je sve navedeno instalirano, možete instalirati sam buildbot:
pip install buildbot-worker
Kreirajmo radni direktorij
md c:worker
I krenimo
buildbot-worker start c:worker
Ako sve radi (pogledajte dnevnik c:workertwistd.log), tada možete registrirati našeg “workera” kao uslugu dodavanjem stavke s radnim direktorijumom u registar (naredbe se izvršavaju u powershell-u koji radi kao administrator):
To je sve sa "radnicima", ne morate ih dalje dirati, sva kontrola dolazi od majstora.
Podešavanje čarobnjaka
Za početak, napravimo infrastrukturu za master (na glavnom hostu), da biste to učinili, registrirajte se pod buildbot korisnika i pokrenite sljedeće naredbe:
su - buildbot
mkdir /home/buildbot/master
cd ~
buildbot create-master master
Za gotove pakete kreirajte direktorij gradnje
mkdir /home/buildbot/builds
Datoteka master.cfg je kreirana u /home/buildbot/master/ direktorijumu. Ovaj fajl je python kod i sadrži opis svih mehanizama sistema, s njim ćemo raditi u budućnosti.
Da bi se automatiziralo sastavljanje paketa različitih verzija, kako ne bi morali ulaziti u kod datoteke master.cfg, u glavnoj skripti programa rac_gui.tcl, u zaglavlje su dodani redovi s trenutnom verzijom i izdanjem :
I na osnovu ovih redova, buildbot će numerisati pakete. Za izdvajanje podataka koristite grep poziv konzole. U buildbot-u jednostavno ne možete definirati varijable za "radnike" (barem nisam pronašao kako). Za to se koriste svojstva. One. U procesu sastavljanja dodajemo korake za određivanje verzije i izdanja i, u skladu s tim, postavljamo svojstva verzije i izdanja. Svojstva se mogu postaviti na različite načine, u ovom slučaju pozivanjem naredbe konzole:
# Добавим определение версии из основного файла
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"
)
)
Dobijene vrijednosti možete zamijeniti pozivom util.Interpolate().
Da biste postavili ispravne brojeve izdanja i verzije, koristite standardni sed poziv, tj. naredba zamjenjuje vrijednosti unutar spec datoteke sa potrebnim
Gotov sastavljeni paket i arhivu s izvorima kopiramo na master. Ali možete odmah kopirati datoteke iz vašeg radnog fajla u svoje spremište ili web lokaciju.
# Скопируем файл на мастер
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")
)
)
Započnimo proces kopiranja prikupljenih paketa na hosting preko FTP-a na masteru. U tu svrhu se koristi skripta na tcl.
To je to sa RPM. Sada počnimo s opisom algoritma za pravljenje DEB paketa. Pošto su procesi za pravljenje paketa za različite sisteme nezavisni jedan od drugog, mnogi koraci će se ponoviti.
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"]))
Za RPM paket, neke od sljedećih postupaka radi sam rpm tijekom sastavljanja i opisani su unutar specifikacije; za Debian, morate to učiniti ovdje:
# Поменяем пути к библиотекам
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")]
)
)
Sačuvajte datoteku i možete pokušati pokrenuti uslugu čarobnjaka:
systemctl restart buildbot-master
U logu ćemo provjeriti da li je sve u redu sa konfiguracijom i da li sve radi normalno. Svi naši radnici bi sada trebali da se povežu, što će se rado prijaviti u dnevnik »»'/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
Ovo dovršava proces postavljanja. Možete vidjeti trenutno stanje putem web sučelja. Gdje također možete vidjeti greške u izgradnji, pokrenuti zamrznuti proces ako nešto pođe po zlu, itd.
Odmah nakon lansiranja, naše vrijedne radnike možete pogledati kroz meni “Gradi” -> “Radnici”
Nakon što se završi prvi proces izgradnje (tj. promjene u Git spremištu), status procesa će se pojaviti na prvoj stranici.
Ako mišem kliknete na željenu liniju, otvorit će vam se stranica sa trenutnim stanjem ovog procesa, gdje možete vidjeti šta se dešava, koje greške itd.
Cijelu konfiguraciju čarobnjaka možete pronaći ovdje