Trebao sam postaviti proces sastavljanja i isporuke softverskih paketa iz Git repozitorija na stranicu. I kada sam, ne tako davno, ovdje na Habréu vidio članak o buildbotu (link na kraju), odlučio sam ga isprobati i primijeniti.
Budući da je buildbot distribuirani sustav, bilo bi logično stvoriti zaseban host za izgradnju za svaku arhitekturu i operativni sustav. U našem slučaju to će biti LXC spremnici (u slučaju Linuxa) i qemu (u slučaju Windowsa):
vm-srv-build1 - centos 7, bit će buildbot master i jedan od radnika
vm-srv-build2 - debian 10, za izgradnju DEB paketa
vm-srv-build3 - windows 10, za montažu, znate čemu
Skupit ćemo Rac GUI — grafičko sučelje za 1C rac za upravljanje klasterom poslužitelja. Za Linux će se koristiti standardni alati za svaki OS; za izradu exe datoteke za Windows iz tcl skripte koristite besplatni omot.
Instalacija
GNU / Linux
Na internetu ima dovoljno dokumentacije za instalaciju 1,2. Da, i to ne uzrokuje nikakve posebne probleme:
Za majstora:
Naravno, bilo bi ispravnije prikupljati pakete za svaki OS, ali to je izvan okvira članka. Također ćemo izostaviti opis postavljanja spremnika za rad, samo ću napomenuti da koristim ProxMox VE. Također ćete morati instalirati pakete za svaku os potrebnu za montažu (centos: rpmdevtools itd.; debian: build-essential, dh-make, pbuilder itd.)
Projekti izgradnje i usluge buildbota pokrenut će se kao neprivilegirani korisnik, tako da morate izraditi jedan na svim hostovima koji sudjeluju u procesu:
adduser buildbot
Zatim ćemo konfigurirati automatsko pokretanje usluga, odnosno, na svakom od hostova (spremnika):
Nakon ovoga, možete stvoriti infrastrukturu imenika za "radnike" (na svim hostovima), da biste to učinili, registrirajte se pod buildbot korisnikom 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 radnim hostovima može se pokrenuti usluga buildbot-worker
systemctl start buildbot-worker
MS Windows
Kao "radnik" za montažu pod Windowsom koristit će se virtualni stroj s najnovijim izdanjem Win10.
Za rad trebate:
Nakon što je sve gore navedeno instalirano, možete instalirati sam buildbot:
pip install buildbot-worker
Kreirajmo radni imenik
md c:worker
I lansirajmo
buildbot-worker start c:worker
Ako sve radi (pogledajte zapisnik c:workertwistd.log), tada možete registrirati našeg "radnika" kao uslugu dodavanjem stavke s radnim imenikom u registar (naredbe se izvršavaju u powershell-u koji radi kao administrator):
To je sve s "radnicima", ne morate ih više dirati, sva kontrola dolazi od gospodara.
Postavljanje čarobnjaka
Za početak, stvorimo infrastrukturu za master (na glavnom hostu), da biste to učinili, registrirajte se pod buildbot korisnikom i pokrenite sljedeće naredbe:
su - buildbot
mkdir /home/buildbot/master
cd ~
buildbot create-master master
Za gotove pakete stvorite direktorij za izgradnju
mkdir /home/buildbot/builds
Datoteka master.cfg stvorena je u direktoriju /home/buildbot/master/. Ova datoteka je python kod i sadrži opis svih mehanizama sustava; s njom ćemo raditi u budućnosti.
Za automatizaciju sastavljanja paketa različitih verzija, kako ne biste morali kopati u kod master.cfg datoteke, u glavnoj skripti programa rac_gui.tcl, u zaglavlju su dodani redovi s trenutnom verzijom i izdanjem :
I na temelju ovih redaka, buildbot će numerirati pakete. Za izdvajanje podataka upotrijebite grep poziv konzole. U buildbotu jednostavno ne možete definirati varijable za "radnike" (barem ja nisam pronašao kako). Za to se koriste svojstva. Oni. U procesu sklapanja dodajemo korake za određivanje verzije i izdanja te, sukladno tome, postavljamo svojstva verzije i izdanja. Svojstva se mogu postaviti na različite načine, u ovom slučaju pozivanjem konzolne naredbe:
# Добавим определение версии из основного файла
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"
)
)
Dobivene vrijednosti možete zamijeniti pozivom util.Interpolate().
Za postavljanje ispravnog izdanja i brojeva verzija upotrijebite standardni sed poziv, tj. naredba zamjenjuje vrijednosti unutar spec datoteke s potrebnima
Kopiramo gotov sastavljeni paket i arhivu s izvorima na master. Ali možete odmah kopirati datoteke iz svoje radne datoteke u svoje spremište ili web mjesto.
# Скопируем файл на мастер
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")
)
)
Pokrenimo proces kopiranja prikupljenih paketa na hosting putem FTP-a na masteru. U tu svrhu koristi se skripta na tcl.
To je to s RPM-om. Sada počnimo opisivati algoritam za izgradnju DEB paketa. Budući da su procesi za izgradnju paketa za različite sustave neovisni jedan o drugome, mnogi će se koraci ponavljati.
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 obavlja sam rpm tijekom sastavljanja i opisani su unutar specifikacije; za Debian to morate 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")]
)
)
Spremite datoteku i možete pokušati pokrenuti uslugu čarobnjaka:
systemctl restart buildbot-master
U zapisniku ćemo provjeriti je li sve u redu s konfiguracijom i radi li sve normalno. Svi naši radnici sada bi se trebali povezati, što će biti sretno prijavljeno u dnevniku »»'/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
Time je postupak postavljanja dovršen. Možete vidjeti trenutni status putem web sučelja. Gdje također možete vidjeti greške u izradi, izbaciti zamrznuti proces ako je nešto pošlo krivo itd.
Odmah nakon lansiranja, naše vrijedne radnike možete pregledati kroz izbornik “Builds” -> “Workers”
Nakon što se završi prvi proces izgradnje (tj. promjene Git repozitorija), status procesa će se pojaviti na prvoj stranici.
Ako kliknete mišem na željenu liniju, otvorit će vam se stranica s trenutnim stanjem ovog procesa, gdje možete vidjeti što se događa, koje greške itd.
Cijela konfiguracija čarobnjaka može se pronaći ovdje