Buildbot piemēros

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 Rac GUI — 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 freewrap.

UzstādīŔana

GNU/Linux

Par instalāciju, dokumentācijas tÄ«klā ir pietiekami 1,2. 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-dateutil

Darbiniekiem pietiks ar Ŕo:

pip3 install buildbot-worker

Protams, 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 buildbot

Tā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.target

un "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.service

Tā 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/bin

Pē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 123456

Otrajā 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 123456

Uz darba hostiem pakalpojumu buildbot-worker var palaist

systemctl start buildbot-worker

MS 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:

Pēc tam, kad viss iepriekÅ” minētais bÅ«s instalēts, var instalēt arÄ« pats buildbot:

pip install buildbot-worker

Izveidosim darba katalogu

md c:worker

Un palaidīsim

buildbot-worker start c:worker

Ja 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 buildbot

Ar "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 master

Gataviem pakotnēm izveidosim katalogu builds

mkdir /home/buildbot/builds

Katalogā /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.cfg

import 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: 1

Un 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 script 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-master

Logā 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Ā»

Buildbot piemēros

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

Buildbot piemēros

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.

Buildbot piemēros

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:

Avots: habr.com

Iegādājieties uzticamu tÄ«mekļa hostingu ar DDoS aizsardzÄ«bu, VPS VDS serveriem šŸ”„ Iegādājieties uzticamu tÄ«mekļa hostingu ar DDoS aizsardzÄ«bu, VPS VDS serveriem | ProHoster