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
