Man bija nepieciešams iestatīt pakotņu veidošanas un piegādes procesu no Git repozitorija uz mājaslapu. Nesen redzēju rakstu par buildbot šeit Habrā (saite beigās), nolēmu to izmēģināt un izmantot.
Tā kā buildbot ir izplatīta sistēma, loģiski būtu izveidot atsevišķu veidošanas serveri katrai arhitekturai un operētājsistēmai. Mūsu gadījumā tās būs LXC konteineri (Linux gadījumā) un qemu (Windows gadījumā):
- vm-srv-build1 — centos 7, šeit darbosies buildbot meistars (master) un viens no darbiniekiem (worker)
- vm-srv-build2 — debian 10, DEB pakotņu veidošanai
- vm-srv-build3 — windows 10, lai veidotu, jūs paši saprotat, kam
Veidosim — grafiskais interfeiss 1C rac serveru klastera pārvaldībai. Linux gadījumā tiks izmantoti iebūvētie rīki katrai OS, lai veidotu exe failu Windows gadījumā no tcl skripta tiek izmantots .
Uzstādīšana
GNU/Linux
Par instalāciju, dokumentācijas tīklā ir pietiekami ,. Un tas īpaši nesagādā problēmas:
Meistaram:
pip3 install buildbot
pip3 install twisted
pip3 install autobahn
pip3 install pysqlite3
pip3 install sqlalchemy sqlalchemy-migrate
pip3 install buildbot-www buildbot-grid-view buildbot-console-view buildbot-waterfall-view
pip3 install python-dateutilDarbiniekiem pietiks ar šo:
pip3 install buildbot-workerProtams, pareizi būtu veidot pakotnes katrai OS, bet tas neietilpst šī raksta robežās. Arī izlaidīsim konteineru iestatīšanas aprakstu, tikai atzīmēšu, ka izmantoju ProxMox VE. Un vēl būs nepieciešams instalēt pakotnes katrai sistēmai, kas nepieciešamas veidošanai (centos: rpmdevtools utt.; debian: build-essential, dh-make, pbuilder utt.)
Projektu veidošana un buildbot pakalpojumi tiks uzsākti no nepiekļūstoša lietotāja vārda, tāpēc tas jāsagatavo visos hostos, kas piedalās procesā:
adduser buildbotTālāk iestatīsim pakalpojumu automātisku palaišanu, attiecīgi katrā no hostiem (konteineriem):
Systemd vienība meistaram:
touch /etc/systemd/buildbot-master.service
[Unit]
Description=BuildBot master service
After=network.target
[Service]
User=buildbot
Group=buildbot
WorkingDirectory=/home/buildbot/master
ExecStart=/usr/local/bin/buildbot start --nodaemon
ExecReload=/bin/kill -HUP $MAINPID
[Install]
WantedBy=multi-user.targetun "darbinieks"
touch /etc/systemd/buildbot-worker.service
[Unit]
Description=BuildBot worker service
After=network.target
[Service]master
User=buildbot
Group=buildbot
WorkingDirectory=/home/buildbot/worker
ExecStart=/usr/local/bin/buildbot-worker start --nodaemon
[Install]
WantedBy=buildbot-master.serviceTā kā visi skripti (mūsu gadījumā) atrodas /usr/local/, tad jānorāda ceļš uz tiem vides mainīgajos:
nano /root/.bash_profile
PATH=$PATH:$HOME/.local/bin:$HOME/bin:/usr/local/binPēc tam var izveidot katalogu infrastruktūru "darba" (uz visiem hostiem), reģistrējoties ar lietotāju buildbot un izpildot šādas komandas:
Pirmajā hostā vm-srv-build1:
su - buildbot
mkdir /home/buildbot/worker
cd ~
buildbot-worker create-worker --umask=0o22 --keepalive=60 worker vm-srv-build1:4000 CentOS 123456Otrajā hostā 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 123456Uz darba hostiem pakalpojumu buildbot-worker var palaist
systemctl start buildbot-workerMS Windows
Kā "darba" mašīnu Windows izstrādē tiks izmantota virtuālā mašīna ar pēdējo Win10 versiju.
Darbošanai būs nepieciešams:
- Lai instalētu visādas lietas Pythonā, bija nepieciešams lejupielādēt
- 7Zip
Pēc tam, kad viss iepriekš minētais būs instalēts, var instalēt arī pats buildbot:
pip install buildbot-workerIzveidosim darba katalogu
md c:workerUn palaidīsim
buildbot-worker start c:workerJa viss darbojas (skatieties žurnālu c:workertwistd.log), tad var mūsu "darba" mašīnu reģistrēt kā pakalpojumu, pievienojot reģistrā ierakstu ar darba katalogu (komandas jāizpilda powershell, kas palaižams kā administrators):
buildbot_worker_windows_service.exe --user VM-SRV-BUILD3buildbot --password 123456 --startup auto install
New-ItemProperty -path Registry::HKEY_LOCAL_MACHINESYSTEMCurrentControlSetservicesBuildBotParameters -Name directories -PropertyType String -Value c:worker
Un var palaist pakalpojumu
Start-Service buildbotAr "darba" mašīnām šis darbs ir pabeigts, turpmāk tās var neaiztikt, visa pārvaldība notiek no meistara.
Meistara iestatīšana
Sāksim ar infrastruktūras izveidi meistaram (uz galvenā hosta), reģistrējoties ar lietotāju buildbot un izpildot šādas komandas:
su - buildbot
mkdir /home/buildbot/master
cd ~
buildbot create-master masterGataviem pakotnēm izveidosim katalogu builds
mkdir /home/buildbot/buildsKatalogā /home/buildbot/master/ tika izveidota faila master.cfg. Šis fails ir Python kods un satur sistēmas darbības mehānismu aprakstu, ar to mēs strādāsim turpmāk.
nano /home/buildbot/master/master.cfgimport os, re
from buildbot.plugins import steps, util, schedulers, worker, changes, reporters
c= BuildmasterConfig ={}
# Apraksts par mūsu darbiniekiem.
c['workers'] = [ worker.Worker('CentOS', '123456'), worker.Worker('Debian-10', '123456'), worker.Worker('Windows-10', '123456')]
c['protocols'] = {'pb': {'port': 4000}}
# Norādiet meistaram, kuru repozitoriju izsekot
c['change_source'] = []
c['change_source'].append(changes.GitPoller(
repourl = 'https://bitbucket.org/svk28/rac-gui.git',
project = 'Rac-GUI',
branches = True,
pollInterval = 60
)
)
# Palīdzības pakalpojums būvniecības uzsākšanai
c['schedulers'] = []
c['schedulers'].append(schedulers.SingleBranchScheduler(
name="Rac-GUI-schedulers",
change_filter=util.ChangeFilter(branch='master'),
builderNames=["Rac-GUI-RPM-builder", "Rac-GUI-DEB-builder", "Rac-GUI-WIN-builder"],
properties = {'owner': 'admin'}
)
)
@util.renderer
######################################3
# RPM pakotnes būvniecība
rac_gui_build_RPM = util.BuildFactory()
rac_gui_build_RPM.addStep(steps.Git(
repourl = 'https://bitbucket.org/svk28/rac-gui.git',
workdir = 'rac-gui',
haltOnFailure = True,
submodules = True,
mode='full',
progress = True)
)Lai automatizētu dažādu versiju pakotņu būvniecību, lai nebūtu jāiekļūst master.cfg faila kodā, galvenajā programmas skriptā rac_gui.tcl ir pievienotas rindas ar pašreizējo versiju un izlaišanu:
######################################################
# Rac GUI
...
# version: 1.0.3
# release: 1Un pamatojoties uz šīm rindām, buildbot numurēs pakotnes. Lai iegūtu datus, tiek izmantots konsoles grep izsaukums. Buildbot nevar vienkārši noteikt mainīgos 'darbiniekiem' (vismaz es neatradu kā). Tam ir paredzētas īpašības (property). T.i., būvniecības procesā pievienojam soļus versijas un izlaišanas noteikšanai un attiecīgi iestiprinām īpašības version un release. Īpašības var iestatīt dažādos veidos, šajā gadījumā tas ir konsoles komandas izsaukums:
# Добавим определение версии из основного файла
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"
)
)Iegūtos vērtības var ielikt, izmantojot util.Interpolate().
# Запакуем исходники
rac_gui_build_RPM.addStep(
steps.ShellCommand(
command=["tar", "czf", util.Interpolate("/home/buildbot/rpmbuild/SOURCES/rac-gui-%(prop:version)s-%(prop:release)s.tar.gz"), "../rac-gui"]
)
)Šeit jānorāda, ka, tā kā hosts tiek lietots arī manuālai pakotņu būvniecībai, būvniecība notiks pēc standarta ceļiem.
# Копируем spec
rac_gui_build_RPM.addStep(steps.ShellCommand(
command=["cp", "../rac-gui/rac_gui.spec", "/home/buildbot/rpmbuild/SPECS/rac_gui.spec"]))Lai iestatītu pareizos izlaišanas un versijas numurus, tiek izmantots standarta sed izsaukums, t.i., komanda aizstāj vērtības iekšā spec-failā ar nepieciešamajiem.
# меняем версию
rac_gui_build_RPM.addStep(steps.ShellCommand(
command=["sed", "-i", util.Interpolate("s/.*Version:.*/Version:t%(prop:version)s/"), "/home/buildbot/rpmbuild/SPECS/rac_gui.spec"]))
# меняем релиз
rac_gui_build_RPM.addStep(steps.ShellCommand(
command=["sed", "-i", util.Interpolate("s/.*Release:.*/Release:t%(prop:release)s/"), "/home/buildbot/rpmbuild/SPECS/rac_gui.spec"]))
# запускаем процесс сборки
rac_gui_build_RPM.addStep(steps.RpmBuild(
specfile="/home/buildbot/rpmbuild/SPECS/rac_gui.spec",
dist='.el5',
topdir='/home/buildbot/rpmbuild',
builddir='/home/buildbot/rpmbuild/build',
rpmdir='/home/buildbot/rpmbuild/RPMS',
sourcedir='/home/buildbot/rpmbuild/SOURCES'
)
)Gatavo pakotni un avotu arhīvu kopējam uz meistaru. Bet var rīkoties arī tā, ka nekavējoties kopējam no darba failiem uz savu repozitoriju vai tīmekļa vietni.
# Скопируем файл на мастер
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")
)
)Uzmeklēsim uz meistara procesu, lai kopētu sagatavotās pakotnes uz hostingu caur ftp. Tam tiek izmantots uz tcl.
rac_gui_build_RPM.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.noarch.rpm"),
util.Interpolate("--remote-file=uploads/rac-gui/rac-gui-%(prop:version)s-%(prop:release)s.noarch.rpm")]
)
)
rac_gui_build_RPM.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.tar.gz"),
util.Interpolate("--remote-file=uploads/rac-gui/rac-gui-%(prop:version)s-%(prop:release)s.tar.gz")]
)
)Ar RPM ir begalēts. Tagad sāksim aprakstīt DEB pakotņu būvēšanas algoritmu. Tā kā pakotņu būvēšanas procesi dažādām sistēmām ir neatkarīgi, daudzi soļi tiks atkārtoti.
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)
)
# Papildināsim versijas noteikšanu no galvenā faila
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"
)
)
# Papildināsim izlaiduma noteikšanu no galvenā faila
rac_gui_build_DEB.addStep(
steps.SetPropertyFromCommand(
command="grep release rac_gui.tcl | grep -oE 'b[0-9]{1,3}b'", property="release"
)
)
# Pārdēvēsim izpildāmo failu
rac_gui_build_DEB.addStep(steps.ShellCommand(
command=["mv", "rac_gui.tcl", "racgui"]))RPM pakotnei daļa no turpmākajām procedūrām tiek veikta pašam rpm būvēšanas laikā un tās aprakstītas iekšējā specifikācijā, kamēr debianā tas jādara šeit:
# Поменяем пути к библиотекам
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")]
)
)Un ar DEB beidzam, tagad uz windows!
rac_gui_build_WIN = util.BuildFactory()
rac_gui_build_WIN.addStep(steps.Git(
repourl = 'https://bitbucket.org/svk28/rac-gui.git',
haltOnFailure = True,
submodules = True,
mode='full',
workdir='build',
progress = True)
)Tā kā Windows parasti nav grep un sed (vai ir?), mēs izmantosim PowerShell.
# Добавим определение версии из основного файла
rac_gui_build_WIN.addStep(
steps.SetPropertyFromCommand(
command="powershell -command "((Get-Content .rac_gui.tcl | Select-String -Pattern 'version:') -split 's')[2]",
property="version"
)
)
# Добавим определение релиза из основного файла
rac_gui_build_WIN.addStep(
steps.SetPropertyFromCommand(
command="powershell -command "((Get-Content .rac_gui.tcl | Select-String -Pattern 'release:') -split 's')[2]",
property="release"
)
)
# Создадим запускаемый файл
rac_gui_build_WIN.addStep(steps.ShellCommand(
command=["c:binfreewrap.exe", "rac_gui.tcl"]))
# запакуем то, что получилось
rac_gui_build_WIN.addStep(steps.ShellCommand(
command=["c:Program Files7-zip7z.exe", "a", "-r", util.Interpolate("..rac-gui_%(prop:version)s-%(prop:release)s.win.zip"), "..build"]))
# скопируем на мастер
rac_gui_build_WIN.addStep(
steps.FileUpload(
workersrc=util.Interpolate("..rac-gui_%(prop:version)s-%(prop:release)s.win.zip"),
masterdest=util.Interpolate("/home/buildbot/builds/rac-gui_%(prop:version)s-%(prop:release)s.win.zip")
)
)
# Скопируем файл на хостинг
rac_gui_build_WIN.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.win.zip"),
util.Interpolate("--remote-file=uploads/rac-gui/rac-gui_%(prop:version)s-%(prop:release)s.win.zip")]
)
)
# Тут определяем какие сборщики у нас есть
c['builders'] = [
util.BuilderConfig(name="Rac-GUI-RPM-builder", workername='CentOS', factory=rac_gui_build_RPM),
util.BuilderConfig(name="Rac-GUI-DEB-builder", workername='Debian-10', factory=rac_gui_build_DEB),
util.BuilderConfig(name="Rac-GUI-WIN-builder", workername='Windows-10', factory=rac_gui_build_WIN),
]Lai informētu par būves procesa stāvokli, izmantosim elektrisko pastu.
c['services'] = []
template=u'''
<h4>Būves statuss: {{ summary }}</h4>
<p> Izmantotais darbinieks: {{ workername }}</p>
{% for step in build['steps'] %}
<p> {{ step['name'] }}: {{ step['result'] }}</p>
{% endfor %}
<p><b> -- Buildbot</b></p>
'''
mailNotifier = reporters.MailNotifier(fromaddr="builder@domain.ru",
sendToInterestedUsers=False,
mode=('all'),
extraRecipients=["admin@domain.ru"],
relayhost="mail.domain.ru",
smtpPort=587,
smtpUser="builder@domain.ru",
smtpPassword="******",
messageFormatter=reporters.MessageFormatter(
template=template, template_type='html',
wantProperties=True, wantSteps=True))
c['services'].append(mailNotifier)
# Galvenie meistara iestatījumi
c['title'] = "Būvēšanas process"
c['titleURL'] = "http://vm-srv-build1:80/"
c['buildbotURL'] = "http://vm-srv-build1/"
c['www'] = dict(port=80,
plugins=dict(waterfall_view={}, console_view={}, grid_view={}))
c['db'] = {
'db_url' : "sqlite:////state.sqlite"
}Saglabājam failu un varam izmēģināt palaist meistara pakalpojumu:
systemctl restart buildbot-masterLogā pārbaudīsim, vai ar konfigurāciju viss kārtībā un viss darbojas kā paredzēts. Visu mūsu darbinieku tagad vajadzētu pieslēgties, par ko logā ""'/home/buildbot/master/twistd.log""' tiks ziņots ar prieku:
2019-07-24 16:50:35+0300 [-] Ielādē buildbot.tac...
2019-07-24 16:50:35+0300 [-] Ielādēts.
2019-07-24 16:50:35+0300 [-] twistd 19.2.1 (\/usr\/bin\/python3.6 3.6.8) sāk darbu.
2019-07-24 16:50:35+0300 [-] reaktora klase: twisted.internet.epollreactor.EPollReactor.
2019-07-24 16:50:35+0300 [-] Sāk BuildMaster -- buildbot.version: 2.3.1
2019-07-24 16:50:35+0300 [-] Ielādē konfigurāciju no '\/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 un vēlāk] `buildbotNetUsageData` nav konfigurēts un pēc noklusējuma tiek iestatīts uz pamata.
Šis parametrs palīdz Buildbot izstrādātāju komanda saprast instalācijas bāzi.
Netiek vākti nekādi personiski dati.
Tiek sūtīta tikai instalācijas programmatūras versijas informācija un spraudņu izmantošana.
Jūs varat `opt-out`, iestata šo mainīgo uz None.
Vai `opt-in` vairāk informācijas klāšanai, iestata uz "full".
2019-07-24 16:50:36+0300 [-] Iestata datubāzi ar URL 'sqlite:\/state.sqlite'
2019-07-24 16:50:36+0300 [-] iestata datubāzes žurnāla režīmu uz 'wal'
2019-07-24 16:50:36+0300 [-] pievienojot 1 jaunas pakalpojumu, izņemot 0
2019-07-24 16:50:36+0300 [-] pievienojot 1 jaunas izmaiņu avotus, izņemot 0
2019-07-24 16:50:36+0300 [-] gitpoller: izmanto darba direktoriju '\/home\/buildbot\/master\/gitpoller-work'
2019-07-24 16:50:36+0300 [-] pievienojot 3 jaunas būves, izņemot 0
2019-07-24 16:50:36+0300 [-] pievienojot 1 jaunas grafikus, izņemot 0
2019-07-24 16:50:36+0300 [-] inicializējot www spraudni 'waterfall_view'
2019-07-24 16:50:36+0300 [-] inicializējot www spraudni 'console_view'
2019-07-24 16:50:36+0300 [-] inicializējot www spraudni 'grid_view'
2019-07-24 16:50:36+0300 [-] PIEZĪME: www spraudnis 'sitenav' ir uzstādīts, bet nav konfigurēts
2019-07-24 16:50:36+0300 [-] inicializējot www spraudni 'waterfall_view'
2019-07-24 16:50:36+0300 [-] inicializējot www spraudni 'console_view'
2019-07-24 16:50:36+0300 [-] inicializējot www spraudni 'grid_view'
2019-07-24 16:50:36+0300 [-] PIEZĪME: www spraudnis 'sitenav' ir uzstādīts, bet nav konfigurēts
2019-07-24 16:50:36+0300 [-] BuildbotSite sāk darbu uz 80
2019-07-24 16:50:36+0300 [-] Sāk fabriku <buildbot.www.service.BuildbotSite object at 0x7fe31c2657b8>
2019-07-24 16:50:36+0300 [-] pievienojot 3 jaunas strādniekus, izņemot 0
2019-07-24 16:50:36+0300 [-] PBServerFactory sāk darbu uz 4000
2019-07-24 16:50:36+0300 [-] Sāk fabriku <twisted.spread.pb.PBServerFactory object at 0x7fe31c147470>
2019-07-24 16:50:37+0300 [-] BuildMaster ir darbojas
2019-07-24 16:50:37+0300 [-] buildbotNetUsageData: sūta {'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] strādnieks 'CentOS' pieslēdzas no IPv4Address(type='TCP', host='127.0.0.1', port=37332)
2019-07-24 16:50:37+0300 [Broker,0,127.0.0.1] Iegūta strādnieka informācija no 'CentOS'
2019-07-24 16:50:37+0300 [-] bots pievienots
2019-07-24 16:50:37+0300 [Broker,0,127.0.0.1] Strādnieks CentOS pievienots Rac-GUI-RPM-builder
2019-07-24 16:50:37+0300 [-] buildbotNetUsageData: buildbot.net teica: ok
2019-07-24 16:50:39+0300 [Broker,1,192.168.55.15] strādnieks 'Windows-10' pieslēdzas no IPv4Address(type='TCP', host='192.168.5.145', port=49831)
2019-07-24 16:50:39+0300 [Broker,1,192.168.55.15] Iegūta strādnieka informācija no 'Windows-10'
2019-07-24 16:50:40+0300 [-] bots pievienots
2019-07-24 16:50:40+0300 [Broker,1,192.168.55.15] Strādnieks Windows-10 pievienots Rac-GUI-WIN-builder
2019-07-24 16:50:41+0300 [Broker,2,192.168.55.99] strādnieks 'Debian-10' pieslēdzas no IPv4Address(type='TCP', host='192.168.5.9', port=44430)
2019-07-24 16:50:41+0300 [Broker,2,192.168.55.99] Iegūta strādnieka informācija no 'Debian-10'
2019-07-24 16:50:41+0300 [-] bots pievienots
2019-07-24 16:50:41+0300 [Broker,2,192.168.55.99] Strādnieks Debian-10 pievienots Rac-GUI-DEB-builderŠajā brīdī iestatīšanas process ir pabeigts. Varat pārbaudīt pašreizējo stāvokli caur tīmekļa saskarni, kur arī varēsiet apskatīt būvēšanas kļūdas, restartēt iesalušo procesu, ja kaut kas nav kārtībā, utt.
Uzreiz pēc mūsu darba uzsākšanas varat pārbaudīt caur izvēlni «Builds» -> «Workers»

Pēc tam, kad notiks pirmais būvēšanas process (t.i., izmaiņas Git repozitorijā), pirmajā lapā parādīsies procesu stāvoklis.

Ja noklikšķināt uz nepieciešamās rindas, tiks atvērta lapa ar šī procesa pašreizējo stāvokli, kur var redzēt, kas notiek, kādas kļūdas utt.

Pilnīgu konfigurāciju varat iegūt šeit
import os, re
from buildbot.plugins import steps, util, schedulers, worker, changes, reporters
c=BuildmasterConfig={}
c['workers']=[worker.Worker('CentOS', '123456'), worker.Worker('Debian-10', '123456'), worker.Worker('Windows-10', '123456')]
c['protocols']={'pb': {'port': 4000}}
c['change_source']=[]
c['change_source'].append(changes.GitPoller(
repourl='https://bitbucket.org/svk28/rac-gui.git',
project='Rac-GUI',
branches=True,
pollInterval=600
))
# Sīkdienas darba pabeigšana
c['schedulers']=[]
c['schedulers'].append(schedulers.SingleBranchScheduler(
name="Rac-GUI-schedulers",
change_filter=util.ChangeFilter(branch='master'),
builderNames=["Rac-GUI-RPM-builder", "Rac-GUI-DEB-builder", "Rac-GUI-WIN-builder"],
properties={'owner': 'admin'}
))
@util.renderer
def get_name_version_release(props):
prog_name="rac-gui"
prog_version="1.0.3"
prog_release="3"
return {
"prog_name": prog_name
#"prog_version": prog_version,
#"prog_release": prog_release
}
rac_gui_build_RPM=util.BuildFactory()
rac_gui_build_RPM.addStep(steps.Git(
repourl='https://bitbucket.org/svk28/rac-gui.git',
workdir='rac-gui',
haltOnFailure=True,
submodules=True,
mode='full',
progress=True)
)
# Pievienosim versijas definēšanu no galvenā faila
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"
))
# Pievienosim izlaišanas definēšanu no galvenā faila
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"
))
rac_gui_build_RPM.addStep(steps.ShellCommand(
command=["tar", "czf", util.Interpolate("\/home\/buildbot\/rpmbuild\/SOURCES\/rac-gui-%(prop:version)s-%(prop:release)s.tar.gz"), "..\/rac-gui"]))
rac_gui_build_RPM.addStep(steps.ShellCommand(
command=["cp", "..\/rac-gui\/rac_gui.spec", "\/home\/buildbot\/rpmbuild\/SPECS\/rac_gui.spec"]))
rac_gui_build_RPM.addStep(steps.ShellCommand(
command=["sed", "-i", util.Interpolate("s\/.*Version:.*\/Version:t%(prop:version)s\/"), "\/home\/buildbot\/rpmbuild\/SPECS\/rac_gui.spec"]))
rac_gui_build_RPM.addStep(steps.ShellCommand(
command=["sed", "-i", util.Interpolate("s\/.*Release:.*\/Release:t%(prop:release)s\/"), "\/home\/buildbot\/rpmbuild\/SPECS\/rac_gui.spec"]))
rac_gui_build_RPM.addStep(steps.RpmBuild(
specfile="\/home\/buildbot\/rpmbuild\/SPECS\/rac_gui.spec",
dist='.el5',
topdir='\/home\/buildbot\/rpmbuild',
builddir='\/home\/buildbot\/rpmbuild\/build',
rpmdir='\/home\/buildbot\/rpmbuild\/RPMS',
sourcedir='\/home\/buildbot\/rpmbuild\/SOURCES'
))
# Pārkopēsim failu uz meistaru
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")
))
rac_gui_build_RPM.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.noarch.rpm"),
util.Interpolate("--remote-file=uploads\/rac-gui\/rac-gui-%(prop:version)s-%(prop:release)s.noarch.rpm")]
))
rac_gui_build_RPM.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.tar.gz"),
util.Interpolate("--remote-file=uploads\/rac-gui\/rac-gui-%(prop:version)s-%(prop:release)s.tar.gz")]
))
####################################
## DEB
####################################
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)
)
# Pievienosim versijas definēšanu no galvenā faila
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"
))
# Pievienosim izlaišanas definēšanu no galvenā faila
rac_gui_build_DEB.addStep(
steps.SetPropertyFromCommand(
command="grep release rac_gui.tcl | grep -oE 'b[0-9]{1,3}b'", property="release"
))
# Pārdēvēsim izpildāmo failu
rac_gui_build_DEB.addStep(steps.ShellCommand(
command=["mv", "rac_gui.tcl", "racgui"]))
# Mainīsim bibliotēku ceļus
rac_gui_build_DEB.addStep(steps.ShellCommand(
command=["sed", "-i", "s+^set dir(lib)+set dir(lib) \/usr\/share\/rac-gui\/lib ;#+g", "racgui"]))
# Mainīsim failu ceļus
rac_gui_build_DEB.addStep(steps.ShellCommand(
command=["sed", "-i", "s+[pwd]+\/usr\/share\/rac-gui+g", "racgui"]))
# Saspiest avotus
rac_gui_build_DEB.addStep(steps.ShellCommand(
command=["tar", "czf", util.Interpolate("..\/rac-gui_%(prop:version)s.orig.tar.gz"), "."]))
# Veidosim pakotni
rac_gui_build_DEB.addStep(steps.ShellCommand(
command=["dpkg-buildpackage"]))
# Pārkopēsim failu uz meistaru
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")]
))
############################################
# WIN
############################################
rac_gui_build_WIN=util.BuildFactory()
rac_gui_build_WIN.addStep(steps.Git(
repourl='https://bitbucket.org/svk28/rac-gui.git',
haltOnFailure=True,
submodules=True,
mode='full',
workdir='build',
progress=True)
)
# Pievienosim versijas definēšanu no galvenā faila
rac_gui_build_WIN.addStep(
steps.SetPropertyFromCommand(
command="powershell -command "((Get-Content .rac_gui.tcl | Select-String -Pattern 'version:') -split 's')[2]",
property="version"
))
# Pievienosim izlaišanas definēšanu no galvenā faila
rac_gui_build_WIN.addStep(
steps.SetPropertyFromCommand(
command="powershell -command "((Get-Content .rac_gui.tcl | Select-String -Pattern 'release:') -split 's')[2]",
property="release"
))
# Izveidosim izpildāmo failu
rac_gui_build_WIN.addStep(steps.ShellCommand(
command=["c:binfreewrap.exe", "rac_gui.tcl"]))
# Iepakojiet rezultātus
rac_gui_build_WIN.addStep(steps.ShellCommand(
command=["c:Program Files7-zip7z.exe", "a", "-r", util.Interpolate("..rac-gui_%(prop:version)s-%(prop:release)s.win.zip"), "..build"]))
# Pārkopēs uz meistaru
rac_gui_build_WIN.addStep(
steps.FileUpload(
workersrc=util.Interpolate("..rac-gui_%(prop:version)s-%(prop:release)s.win.zip"),
masterdest=util.Interpolate("\/home\/buildbot\/builds\/rac-gui_%(prop:version)s-%(prop:release)s.win.zip")
))
# Pārkopēs failu uz hostingu
rac_gui_build_WIN.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.win.zip"),
util.Interpolate("--remote-file=uploads\/rac-gui\/rac-gui_%(prop:version)s-%(prop:release)s.win.zip")]
))
c['builders']=[
util.BuilderConfig(name="Rac-GUI-RPM-builder", workername='CentOS', factory=rac_gui_build_RPM),
util.BuilderConfig(name="Rac-GUI-DEB-builder", workername='Debian-10', factory=rac_gui_build_DEB),
util.BuilderConfig(name="Rac-GUI-WIN-builder", workername='Windows-10', factory=rac_gui_build_WIN),
]
c['services']=[]
template=u'''
<h4>Būves statuss: {{ summary }}</h4>
<p> Izmantotais darbinieks: {{ workername }}</p>
{% for step in build['steps'] %}
<p> {{ step['name'] }}: {{ step['result'] }}</p>
{% endfor %}
<p><b> -- Buildbot</b></p>
'''
mailNotifier = reporters.MailNotifier(fromaddr="112@icvibor.ru",
sendToInterestedUsers=False,
mode=('all'),
extraRecipients=["my@domain.local"],
relayhost="mail.domain.local",
smtpPort=587,
smtpUser="buildbot@domain.local",
smtpPassword="**********",
messageFormatter=reporters.MessageFormatter(
template=template, template_type='html',
wantProperties=True, wantSteps=True))
c['services'].append(mailNotifier)
c['title'] = "Būvniecības process"
c['titleURL'] = "http://vm-srv-build1:80/"
c['buildbotURL'] = "http://vm-srv-build1/"
c['www'] = dict(port=80,
plugins=dict(waterfall_view={}, console_view={}, grid_view={}))
c['db'] = {
'db_url' : "sqlite:///state.sqlite"
}Materiāli
Raksta sagatavošanā tika izmantoti šādi materiāli:
- Un dokumentācija par produktu
Avots: habr.com
