Moral sem nastaviti postopek sestavljanja in dostave programskih paketov iz repozitorija Git na spletno mesto. In ko sem nedolgo nazaj tukaj na Habréju videl članek o buildbotu (povezava na koncu), sem se odločil, da ga preizkusim in uporabim.
Ker je buildbot porazdeljen sistem, bi bilo logično ustvariti ločenega gostitelja gradnje za vsako arhitekturo in operacijski sistem. V našem primeru bodo to vsebniki LXC (v primeru Linuxa) in qemu (v primeru Windows):
vm-srv-build1 - centos 7, tam bo mojster buildbota in eden od delavcev
vm-srv-build2 - debian 10, za izdelavo paketov DEB
vm-srv-build3 - windows 10, za montažo, saj veste za kaj
Zbrali bomo Rac GUI — grafični vmesnik za 1C rac za upravljanje gruče strežnikov. Za Linux bodo uporabljena standardna orodja za vsak OS; za izdelavo datoteke exe za Windows iz skripta tcl uporabite freewrap.
Namestitev
GNU / Linux
Na internetu je dovolj dokumentacije za namestitev 1,2. Da, in ne povzroča posebnih težav:
Za mojstra:
Seveda bi bilo pravilneje zbirati pakete za vsak OS, vendar to presega obseg članka. Prav tako bomo izpustili opis nastavitve kontejnerjev za delo, zapisal bom le, da uporabljam ProxMox VE. Prav tako boste morali namestiti pakete za vsako os, ki je potrebna za sestavljanje (centos: rpmdevtools itd.; debian: build-essential, dh-make, pbuilder itd.)
Gradbeni projekti in storitve buildbot bodo zagnani kot uporabnik brez pravic, zato jih morate ustvariti na vseh gostiteljih, ki sodelujejo v procesu:
adduser buildbot
Nato bomo konfigurirali samodejni zagon storitev oziroma na vsakem od gostiteljev (vsebnikov):
Po tem lahko ustvarite imeniško infrastrukturo za »delavce« (na vseh gostiteljih), za to se registrirajte pod uporabnikom buildbot in zaženite naslednje ukaze:
Na prvem gostitelju 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 drugem gostitelju 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 delovnih gostiteljih je mogoče zagnati storitev buildbot-worker
systemctl start buildbot-worker
MS Windows
Kot "delavec" za montažo pod Windows bo uporabljen virtualni stroj z najnovejšo izdajo Win10.
Za delo boste potrebovali:
Ko je vse zgoraj navedeno nameščeno, lahko namestite sam buildbot:
pip install buildbot-worker
Ustvarimo delovni imenik
md c:worker
In zaženimo
buildbot-worker start c:worker
Če vse deluje (glejte dnevnik c:workertwistd.log), lahko registrirate našega »delavca« kot storitev tako, da v register dodate element z delovnim imenikom (ukazi se izvajajo v lupini powershell, ki se izvaja kot skrbnik):
To je vse z "delavci", ni se vam treba več dotikati, ves nadzor prihaja od gospodarja.
Nastavitev čarovnika
Za začetek ustvarimo infrastrukturo za master (na glavnem gostitelju), za to se registrirajte pod uporabnikom buildbot in zaženite naslednje ukaze:
su - buildbot
mkdir /home/buildbot/master
cd ~
buildbot create-master master
Za že pripravljene pakete ustvarite imenik gradenj
mkdir /home/buildbot/builds
Datoteka master.cfg je bila ustvarjena v imeniku /home/buildbot/master/. Ta datoteka je koda python in vsebuje opis vseh mehanizmov sistema; z njo bomo delali v prihodnosti.
Za avtomatizacijo sestavljanja paketov različnih različic, da se vam ne bi bilo treba poglobiti v kodo datoteke master.cfg, so bile v glavni skript programa rac_gui.tcl v glavi dodane vrstice s trenutno različico in izdajo :
In na podlagi teh vrstic bo buildbot oštevilčil pakete. Če želite ekstrahirati podatke, uporabite klic grep konzole. V buildbotu preprosto ne morete definirati spremenljivk za "delavce" (vsaj jaz nisem našel, kako). Za to se uporabljajo lastnosti. Tisti. V procesu sestavljanja dodamo korake za določitev različice in izdaje ter temu primerno nastavimo lastnosti različice in izdaje. Lastnosti lahko nastavite na različne načine, v tem primeru s klicem konzolnega ukaza:
# Добавим определение версии из основного файла
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"
)
)
Dobljene vrednosti lahko nadomestite s klicem util.Interpolate().
Končni sestavljeni paket in arhiv z viri kopiramo v master. Lahko pa takoj kopirate datoteke iz delovne datoteke v svoje skladišče ali na spletno mesto.
# Скопируем файл на мастер
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ženimo postopek kopiranja zbranih paketov na gostovanje preko FTP na master. V ta namen se uporablja skripta na tcl.
To je to z RPM. Zdaj pa začnimo z opisom algoritma za izdelavo paketa DEB. Ker so procesi za gradnjo paketov za različne sisteme neodvisni drug od drugega, bo veliko korakov ponovljenih.
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 paket RPM nekatere od naslednjih postopkov izvede sam rpm med sestavljanjem in so opisani v specifikaciji; za Debian morate to narediti tukaj:
# Поменяем пути к библиотекам
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")]
)
)
Shranite datoteko in poskusite zagnati storitev čarovnika:
systemctl restart buildbot-master
V dnevniku bomo preverili, ali je vse v redu s konfiguracijo in vse deluje kot običajno. Vsi naši delavci bi se zdaj morali povezati, kar bo z veseljem objavljeno v 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
S tem je postopek nastavitve zaključen. Trenutno stanje si lahko ogledate preko spletnega vmesnika. Kjer lahko vidite tudi napake pri gradnji, zavrnete zamrznjen proces, če je šlo kaj narobe itd.
Takoj po lansiranju si lahko naše pridne delavce ogledate v meniju “Builds” -> “Workers”
Po končanem prvem procesu gradnje (tj. spremembah v repozitoriju Git) se status procesov prikaže na prvi strani.
Če z miško kliknete na želeno vrstico, se vam odpre stran s trenutnim stanjem tega procesa, kjer lahko vidite, kaj se dogaja, katere napake itd.