Më duhej të konfiguroja procesin e montimit dhe dërgimit të paketave softuerike nga një depo Git në sit. Dhe kur pashë, jo shumë kohë më parë, këtu në Habré një artikull mbi buildbot (lidhja në fund), vendosa ta provoja dhe ta zbatoja.
Meqenëse buildbot është një sistem i shpërndarë, do të ishte logjike të krijohej një host i veçantë ndërtimi për çdo arkitekturë dhe sistem operativ. Në rastin tonë, këto do të jenë kontejnerë LXC (në rastin e Linux) dhe qemu (në rastin e Windows):
vm-srv-build1 - centos 7, do të ketë një master buildbot dhe një nga punëtorët
vm-srv-build2 - debian 10, për ndërtimin e paketave DEB
vm-srv-build3 - windows 10, për montim, ju e dini për çfarë
ne do të mbledhim Rac GUI — një ndërfaqe grafike për 1C rac për menaxhimin e një grupi serverësh. Për Linux, do të përdoren mjete standarde për çdo OS; për të ndërtuar një skedar exe për Windows nga një skript tcl, përdorni mbështjellje pa pagesë.
Instalim
GNU / Linux
Ka mjaft dokumentacion në internet për instalim 1,2. Po, dhe nuk shkakton ndonjë problem të veçantë:
Për mjeshtrin:
Sigurisht, do të ishte më e saktë të mblidheshin paketa për secilin OS, por kjo është përtej qëllimit të artikullit. Ne gjithashtu do të heqim përshkrimin e vendosjes së kontejnerëve për punë, do të vërej vetëm se përdor ProxMox VE. Dhe gjithashtu do t'ju duhet të instaloni paketa për çdo aks të kërkuar për montim (centos: rpmdevtools, etj.; debian: build-essential, dh-make, pbuilder, etj.)
Projektet e ndërtimit dhe shërbimet e buildbot do të lansohen si një përdorues i paprivilegjuar, kështu që ju duhet të krijoni një në të gjithë hostet që marrin pjesë në proces:
adduser buildbot
Tjetra, ne do të konfigurojmë nisjen automatike të shërbimeve, përkatësisht, në secilën prej hosteve (kontejnerëve):
Pas kësaj, mund të krijoni një infrastrukturë drejtorie për "punëtorët" (në të gjithë hostet), për ta bërë këtë, regjistrohuni nën përdoruesin e buildbot dhe ekzekutoni komandat e mëposhtme:
Në hostin e parë 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
Në hostin e dytë 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
Në hostet e punëtorëve, shërbimi buildbot-worker mund të niset
systemctl start buildbot-worker
MS Windows
Si një "punëtor" për montim nën Windows, do të përdoret një makinë virtuale me versionin më të fundit të Win10.
Për të punuar do t'ju duhet:
Pasi të instalohen të gjitha sa më sipër, mund të instaloni vetë buildbot:
pip install buildbot-worker
Le të krijojmë një drejtori pune
md c:worker
Dhe le të nisim
buildbot-worker start c:worker
Nëse gjithçka funksionon (shih login c:workertwistd.log), atëherë mund ta regjistroni "punëtorin" tonë si shërbim duke shtuar një artikull me direktorinë e punës në regjistër (komandat ekzekutohen në powershell duke ekzekutuar si administrator):
Kjo është e gjitha me "punëtorët", nuk keni pse t'i prekni më tej, i gjithë kontrolli vjen nga mjeshtri.
Konfigurimi i magjistarit
Për të filluar, le të krijojmë infrastrukturën për master (në hostin kryesor), për ta bërë këtë, regjistrohuni nën përdoruesin e buildbot dhe ekzekutoni komandat e mëposhtme:
su - buildbot
mkdir /home/buildbot/master
cd ~
buildbot create-master master
Për paketat e gatshme, krijoni një drejtori ndërtimi
mkdir /home/buildbot/builds
Një skedar master.cfg u krijua në drejtorinë /home/buildbot/master/. Ky skedar është një kod python dhe përmban një përshkrim të të gjithë mekanizmave të sistemit; ne do të punojmë me të në të ardhmen.
Për të automatizuar montimin e paketave të versioneve të ndryshme, në mënyrë që të mos keni nevojë të gërmoni në kodin e skedarit master.cfg, në skenarin kryesor të programit rac_gui.tcl, linjat me versionin aktual dhe lëshimin u shtuan në kokë. :
Dhe bazuar në këto rreshta, buildbot do të numërojë paketat. Për të nxjerrë të dhëna, përdorni thirrjen grep të konsolës. Në buildbot ju thjesht nuk mund të përcaktoni variabla për "punëtorët" (të paktën, unë nuk e kam gjetur se si). Për këtë përdoren vetitë. Ato. Në procesin e montimit, ne shtojmë hapa për të përcaktuar versionin dhe lëshimin dhe, në përputhje me rrethanat, vendosim vetitë e versionit dhe lëshimit. Karakteristikat mund të vendosen në mënyra të ndryshme, në këtë rast duke thirrur komandën e konsolës:
# Добавим определение версии из основного файла
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"
)
)
Ju mund të zëvendësoni vlerat që rezultojnë duke thirrur util.Interpolate().
Për të vendosur numrat e saktë të lëshimit dhe versionit, përdorni një telefonatë standarde sed, d.m.th. komanda zëvendëson vlerat brenda skedarit specifik me ato të kërkuara
Ne kopjojmë paketën e përfunduar të montuar dhe arkivin me burime te masteri. Por ju mund të kopjoni menjëherë skedarët nga skedari juaj i punës në depon ose faqen tuaj të internetit.
# Скопируем файл на мастер
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")
)
)
Le të fillojmë procesin e kopjimit të paketave të mbledhura në host përmes FTP në master. Për këtë qëllim përdoret skenar në tcl.
Kjo është ajo me RPM. Tani le të fillojmë të përshkruajmë algoritmin për ndërtimin e një pakete DEB. Meqenëse proceset për ndërtimin e paketave për sisteme të ndryshme janë të pavarura nga njëra-tjetra, shumë hapa do të përsëriten.
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"]))
Për një paketë RPM, disa nga procedurat e mëposhtme bëhen nga vetë rpm gjatë montimit dhe përshkruhen brenda specifikimit; për Debian, duhet ta bëni kë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")]
)
)
Ruani skedarin dhe mund të provoni të filloni shërbimin e magjistarit:
systemctl restart buildbot-master
Në regjistër do të kontrollojmë që gjithçka është në rregull me konfigurimin dhe gjithçka funksionon si zakonisht. Të gjithë punëtorët tanë duhet të lidhen tani, gjë që do të raportohet me kënaqësi në regjistrin »»'/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
Kjo përfundon procesin e konfigurimit. Ju mund të shikoni statusin aktual përmes ndërfaqes së internetit. Aty ku mund të shihni gjithashtu gabime ndërtimi, të filloni një proces të ngrirë nëse diçka shkoi keq, etj.
Menjëherë pas nisjes, punëtorët tanë të zellshëm mund të shikohen përmes menysë "Ndërton" -> "Punëtorët"
Pasi të përfundojë procesi i parë i ndërtimit (d.m.th. ndryshimet në depo Git), statusi i proceseve do të shfaqet në faqen e parë.
Nëse klikoni në vijën e dëshiruar me miun, do të hapet një faqe me gjendjen aktuale të këtij procesi, ku mund të shihni se çfarë po ndodh, çfarë gabimesh, etj.
I gjithë konfigurimi i magjistarit mund të gjendet këtu