Buildboti näited

Mul oli vaja seadistada ehitamise ja kohaletoimetamise protsess kodulehele tarkvarapakettide jaoks Git-i hoidlast. Nägin mõni aeg tagasi siin Habr's artiklit buildbot'ist (link lõpus) ja otsustasin seda proovida.

Kuna buildbot on jagatud süsteem, oleks mõistlik iga arhitektuuri ja operatsioonisüsteemi jaoks luua eraldi ehitushost. Meie juhul on need LXC-konteinerid (Linuxi puhul) ja qemu (Windowsi puhul):

  • vm-srv-build1 — centos 7, siin asub buildbot meistritehas (master) ja üks tööline (worker)
  • vm-srv-build2 — debian 10, DEB pakettide ehitamiseks
  • vm-srv-build3 — windows 10, et ehitada, nagu te aru saate, mille jaoks

Ehitatakse Rac GUI — graafiline liides 1C rac jaoks serverite klastrite haldamiseks. Linuxi jaoks kasutatakse igas OPS süsteemis kaasasolevaid tööriistu, Windowsi exe-faili ehitamiseks tcl-skripti põhjal kasutatakse freewrap.

Paigaldamine

GNU/Linux

Interneti seadistamiseks ja dokumentatsiooniks on piisavalt materjali 1,2. Ja erilisi probleeme see ei tekita:
Meistrite jaoks:

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

Tööliste jaoks, piisab sellest:

pip3 install buildbot-worker

Loomulikult oleks tõsisem, kui pakkuda pakette iga OPS-i jaoks, kuid see ei kuulu artikli raamesse. Jätame vahele konteinerite seadistamise kirjelduse, märkige lihtsalt, et kasutan ProxMox VE-d. Samuti tuleb installida iga OPS-i jaoks vajalikud paketid (centos: rpmdevtools jne; debian: build-essential, dh-make, pbuilder jne).

Projektide ehitamine ja buildboti teenused käivitatakse mitteprivileegitud kasutaja nimel, seega on vajalik see luua kõikides hostides, mis protsessis osalevad:


adduser buildbot

Seejärel seadistame teenuste automaatse käivitamise, vastavalt igas hostis (konteineris):

Systemd ühik meistri käivitamiseks:

touch /etc/systemd/buildbot-master.service 

[Unit]
Description=BuildBot meistri teenus
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

ja «tööline»

touch /etc/systemd/buildbot-worker.service 

[Unit]
Description=BuildBot töötaja teenus
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

Kuna kõik skriptid (meie puhul) asuvad /usr/local/, tuleb nende tee määrata keskkonna muutuja.

nano /root/.bash_profile

PATH=$PATH:$HOME/.local/bin:$HOME/bin:/usr/local/bin

Pärast seda võite luua kataloogide infrastruktuuri 'töölistele' (kõigil serveritel), registreerides buildboti kasutajana ja käivitades järgmised käsud:

Esimesel serveril 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

Teisel serveril 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

Töölisserverites saab buildbot-worker teenuse käivitada

systemctl start buildbot-worker

MS Windows

Windowsi jaoks töölistena kasutatakse virtuaalmasinat viimase Win10 versiooniga.
Tööks on vajalik:

Kui kõik eespool loetletud on installitud, saab installida ka buildboti:

pip install buildbot-worker

Loome töökatalooge

md c:worker

Ja käivitame

buildbot-worker start c:worker

Kui kõik töötab (vt logi c:workertwistd.log), siis saab meie 'töölise' registreerida teenusena, lisades registrisse kirje töökatalooge (käsklused käivotakse PowerShellis, mis on käivitatud administraatori õigustes):

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

Ja saab teenust käivitada

Start-Service buildbot

Töölistega on sellega kõik, neid võib edaspidi mitte puudutada, kõik haldus käib meistrilt.

Meistri seadistamine

Kuna alustame, loome infrastruktuuri meistrile (peamisel serveril), registreerides buildboti kasutajana ja käivitades järgmised käsud:

su - buildbot
mkdir /home/buildbot/master
cd ~
buildbot create-master master

Valmis pakettide jaoks loome katalooge builds

mkdir /home/buildbot/builds

Kataloogis /home/buildbot/master/ loodi fail master.cfg. See fail sisaldab python-koodi ja kirjeldab kõiki süsteemi töömehhanisme, millega me edaspidi töötame.

nano /home/buildbot/master/master.cfg

import os, re
from buildbot.plugins import steps, util, schedulers, worker, changes, reporters

c= BuildmasterConfig ={}

# Kirjeldus meie töötajatest.
c['workers'] = [ worker.Worker('CentOS', '123456'), worker.Worker('Debian-10', '123456'), worker.Worker('Windows-10', '123456')]
c['protocols'] = {'pb': {'port': 4000}} 

# Määrame, millist hoidlat jälgida
c['change_source'] = []
c['change_source'].append(changes.GitPoller(
       repourl = 'https://bitbucket.org/svk28/rac-gui.git',
       project = 'Rac-GUI',
       branches = True,
       pollInterval = 60
      )
)

# Kogumise teenus
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-paketi kogumine
 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)
)

Pakettide erinevate versioonide automaatseks kogumiseks, et ei peaks kodeerimisega vaeva nägema master.cfg failis, lisati peamisse skripti rac_gui.tcl ridadele current version ja release:

######################################################
#        Rac GUI
...
# version: 1.0.3
# release: 1

Ja nende ridade põhjal hakkab buildbot pakette numereerima. Andmete väljavõtmiseks kasutatakse konsooli grep'i käsku. Buildbot'i puhul ei saa lihtsalt määrata muutujaid "töötajatele" (igal juhul, ma ei leidnud, kuidas). Selleks on omadused (property). St. kogumisprotsessis lisame samme versiooni ja välja määramiseks ning seega seame omadused version ja release. Omadusi saab seada erinevate meetoditega, antud juhul on selleks konsooli käsu väljakutse:

# Добавим определение версии из основного файла
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"
       )
)

Saadud väärtusi saab sisestada käivitades 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"]
       )
)

Siinkohal tuleb mainida, et kuna hosti kasutatakse ka pakettide käsitsi kogumiseks, siis toimub kogumine standaarsetel radadel.

# Копируем spec
rac_gui_build_RPM.addStep(steps.ShellCommand(
       command=["cp", "../rac-gui/rac_gui.spec", "/home/buildbot/rpmbuild/SPECS/rac_gui.spec"]))

Korrektselt versioonide ja väljundite numbrite seadmiseks kasutatakse standardset sed käsku, st. käsk asendab väärtusi spec-failis vajalikuga.

# меняем версию
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'
      )
)

Valmis kogutud pakett ja arhiiv lähtekoodidega kopeeritakse meistrisse. Kuid võib ka kohe tööfailidest kopeerida oma hoidlasse või veebisaidile.

# Скопируем файл на мастер
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")
       )
)

Käivitame meistris kogutud pakettide FTP kaudu hostimise kopeerimise protsessi. Selleks kasutatakse skripti 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")]
        )
)

RPM-failide osasime kuuldamise ära. Nüüd läheme edasi DEB-paketi koostamisalgoritmi kirjeldamise juurde. Kuna pakettide koostamisprotsessid erinevatele süsteemidele ei ole üksteisest sõltuvad, korduvad paljud sammud.


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)
)

# Lisame versiooni määramise põhifailist
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"
       )
)

# Lisame välja määramise põhifailist
rac_gui_build_DEB.addStep(
       steps.SetPropertyFromCommand(
       command="grep release rac_gui.tcl | grep -oE 'b[0-9]{1,3}b'", property="release"
       )
)

# Renname hõivatud faili
    rac_gui_build_DEB.addStep(steps.ShellCommand(
       command=["mv", "rac_gui.tcl", "racgui"]))

RPM-paketi puhul tehakse osa alltoodud protseduuridest rpm-i enda poolt koostamisel ja need on kirjeldatud speks, Debianis tuleb seda teha siin:

# Поменяем пути к библиотекам
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")]
        )
)

Ja DEB on tehtud, nüüd 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)
)

Kuna Windowsis ei ole tavaliselt grep ja sed (või on?), kasutame powershelli.

# Добавим определение версии из основного файла
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),
]

Koostamisprotsessi oleku teavitamiseks kasutame elektrilist posti.


c['services'] = []

template=u'''
    <h4>Ehitus staatus: {{ summary }}</h4>
    <p> Kasutatud tööline: {{ workername }}</p>
    {% for step in build['steps'] %}
    <p> {{ step['name'] }}: {{ step['result'] }}</p>
    {% endfor %}
    <p><b> -- The 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)

# Peamised seadistused
c['title'] = "Ehitusprotsess"
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"
}

Salvestame faili ja võime proovida käivitada meistri teenust:

systemctl restart buildbot-master

Logis kontrollime, et kõik peab olema korrektselt seadistatud ja töötab nagu peab. Kõik meie töötajad peaksid nüüd ühenduma, millest logis "»»'/home/buildbot/master/twistd.log'»»" rõõmsalt teatama:

 2019-07-24 16:50:35+0300 [-] Laadimine buildbot.tac...
 2019-07-24 16:50:35+0300 [-] Laaditud.
 2019-07-24 16:50:35+0300 [-] twistd 19.2.1 (\usr\bin\python3.6 3.6.8) käivitub.
 2019-07-24 16:50:35+0300 [-] reaktori klass: twisted.internet.epollreactor.EPollReactor.
 2019-07-24 16:50:35+0300 [-] Käivitamine BuildMaster -- buildbot.version: 2.3.1
 2019-07-24 16:50:35+0300 [-] Laadimine konfiguratsioonist '\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 ja hiljem] `buildbotNetUsageData` ei ole konfigureeritud ja vaikimisi on see põhiseade.
        See parameeter aitab buildboti arendustiimil mõista installatsiooni baasi.
        Isiklikku teavet ei koguta.
        Saadetakse ainult installitava tarkvara versiooniteave ja pluginate kasutamine.
        Saate `opt-out` teha, seadistades selle muutujana None.
        Või `opt-in`, et saada rohkem teavet, seadistades selle "täielikuks".

 2019-07-24 16:50:36+0300 [-] Andmebaasi seadmine URL-iga 'sqlite:\state.sqlite'
 2019-07-24 16:50:36+0300 [-] seadistatakse andmebaasi ajuraamiks 'wal'
 2019-07-24 16:50:36+0300 [-] lisatud 1 uus teenus, eemaldatud 0
 2019-07-24 16:50:36+0300 [-] lisatud 1 uus muutuste allikas, eemaldatud 0
 2019-07-24 16:50:36+0300 [-] gitpoller: töökaust 'home/buildbot/master/gitpoller-work' kasutamine
 2019-07-24 16:50:36+0300 [-] lisatud 3 uut ehitajat, eemaldatud 0
 2019-07-24 16:50:36+0300 [-] lisatud 1 uus ajakava, eemaldatud 0
 2019-07-24 16:50:36+0300 [-] initsialiseerimine www plugin 'waterfall_view'
 2019-07-24 16:50:36+0300 [-] initsialiseerimine www plugin 'console_view'
 2019-07-24 16:50:36+0300 [-] initsialiseerimine www plugin 'grid_view'
 2019-07-24 16:50:36+0300 [-] MÄRKUS: www plugin 'sitenav' on installitud, kuid ei ole konfigureeritud
 2019-07-24 16:50:36+0300 [-] initsialiseerimine www plugin 'waterfall_view'
 2019-07-24 16:50:36+0300 [-] initsialiseerimine www plugin 'console_view'
 2019-07-24 16:50:36+0300 [-] initsialiseerimine www plugin 'grid_view'
 2019-07-24 16:50:36+0300 [-] MÄRKUS: www plugin 'sitenav' on installitud, kuid ei ole konfigureeritud
 2019-07-24 16:50:36+0300 [-] BuildbotSite käivitub aadressil 80
 2019-07-24 16:50:36+0300 [-] Käivitamine tehase <buildbot.www.service.BuildbotSite objekt aadressil 0x7fe31c2657b8>
 2019-07-24 16:50:36+0300 [-] lisatud 3 uut töötajat, eemaldatud 0
 2019-07-24 16:50:36+0300 [-] PBServerFactory käivitub aadressil 4000
 2019-07-24 16:50:36+0300 [-] Käivitamine tehase <twisted.spread.pb.PBServerFactory objekt aadressil 0x7fe31c147470>
 2019-07-24 16:50:37+0300 [-] BuildMaster töötab
 2019-07-24 16:50:37+0300 [-] buildbotNetUsageData: saatmine {'installid': 'b6193b126b96689351d2fe95787c5a03fc0879f9', 'versioonid': {'Python': '3.6.8', 'Buildbot': '2.3.1', 'Twisted': '19.2.1'}, 'platvorm': {'platvorm': 'Linux-4.15.18-10- pve-x86_64-with-centos-7.6.1810-Core', 'süsteem': 'Linux', 'masin': 'x86_64', 'protsessor': 'x86_64', 'python_implementatsioon': 'CPython', 'versioon': '#1 SMP PVE 4.15.18-32', 'distro': 'centos:7'}, 'pluginid': {'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] töötaja 'CentOS' kinnitub IPv4Address(type='TCP', host='127.0.0.1', port=37332)
 2019-07-24 16:50:37+0300 [Broker,0,127.0.0.1] Saadi töötaja teave 'CentOS'
 2019-07-24 16:50:37+0300 [-] bot kinnitatud
 2019-07-24 16:50:37+0300 [Broker,0,127.0.0.1] Töötaja CentOS kinnitatud Rac-GUI-RPM-builder
 2019-07-24 16:50:37+0300 [-] buildbotNetUsageData: buildbot.net ütles: ok
 2019-07-24 16:50:39+0300 [Broker,1,192.168.55.15] töötaja 'Windows-10' kinnitub IPv4Address(type='TCP', host='192.168.5.145', port=49831)
 2019-07-24 16:50:39+0300 [Broker,1,192.168.55.15] Saadi töötaja teave 'Windows-10'
 2019-07-24 16:50:40+0300 [-] bot kinnitatud
 2019-07-24 16:50:40+0300 [Broker,1,192.168.55.15] Töötaja Windows-10 kinnitatud Rac-GUI-WIN-builder
 2019-07-24 16:50:41+0300 [Broker,2,192.168.55.99] töötaja 'Debian-10' kinnitub IPv4Address(type='TCP', host='192.168.5.9', port=44430)
 2019-07-24 16:50:41+0300 [Broker,2,192.168.55.99] Saadi töötaja teave 'Debian-10'
 2019-07-24 16:50:41+0300 [-] bot kinnitatud
 2019-07-24 16:50:41+0300 [Broker,2,192.168.55.99] Töötaja Debian-10 kinnitatud Rac-GUI-DEB-builder

Sead on seadistamise protsess lõpetatud. Praegust olekut saab vaadata veebiliidese kaudu, kus saab ka vaadata kogumise vigu, eemaldada kinni jäänud protsessi, kui midagi peaks valesti minema jne.

Vahetult pärast meie töötajate käivitamist saab vaadata menüüs „Builds” -> „Workers”

Buildboti näited

Pärast esmakordset kogumisprotsessi (st muudatusi Git-repositooriumis) ilmub esilehele protsesside olek.

Buildboti näited

Kui klõpsate hiirega soovitud reale, avatakse leht selle protsessi praegusest olekust, kus on näha, mis toimub, millised on vead jne.

Buildboti näited

Kogu seadistuse juhendit saab siit

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
    ))

# Ehitusprotsessi käivitamise teenus
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)
    )

# Lisame versioonide määramise põhifailist
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"
    )
)

# Lisame vabastamise määramise põhifailist
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'
    ))

# Koopia fail mastrisse
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)
    )

# Lisame versioonide määramise põhifailist
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"
    )
)

# Lisame vabastamise määramise põhifailist
rac_gui_build_DEB.addStep(
    steps.SetPropertyFromCommand(
    command="grep release rac_gui.tcl | grep -oE 'b[0-9]{1,3}b'", property="release"
    )
)

# Faili ümber nimetamine, mida käivitada
rac_gui_build_DEB.addStep(steps.ShellCommand(
    command=["mv", "rac_gui.tcl", "racgui"]))

# Raamatukogude teede muutmine
rac_gui_build_DEB.addStep(steps.ShellCommand(
    command=["sed", "-i", "s+^set dir(lib)+set dir(lib) /usr/share/rac-gui/lib ;#+g", "racgui"]))

# Failide teede muutmine
rac_gui_build_DEB.addStep(steps.ShellCommand(
    command=["sed", "-i", "s+[pwd]+/usr/share/rac-gui+g", "racgui"]))

# Allikate arhiveerimine
rac_gui_build_DEB.addStep(steps.ShellCommand(
    command=["tar", "czf", util.Interpolate("../rac-gui_%(prop:version)s.orig.tar.gz"), "."]))

# Paketi koostamine
rac_gui_build_DEB.addStep(steps.ShellCommand(
    command=["dpkg-buildpackage"]))

# Koopia fail mastrisse
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)
    )

# Lisame versioonide määramise põhifailist
rac_gui_build_WIN.addStep(
    steps.SetPropertyFromCommand(
    command="powershell -command "((Get-Content .rac_gui.tcl | Select-String -Pattern 'version:') -split 's')[2]",
    property="version"
    )
)

# Lisame vabastamise määramise põhifailist
rac_gui_build_WIN.addStep(
    steps.SetPropertyFromCommand(
    command="powershell -command "((Get-Content .rac_gui.tcl | Select-String -Pattern 'release:') -split 's')[2]",
    property="release"
    )
)

# Loo käivitatav fail
rac_gui_build_WIN.addStep(steps.ShellCommand(
    command=["c:binfreewrap.exe", "rac_gui.tcl"]))

# Pakime saadud tulemuse
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"]))

# Koopia mandaat
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")
    )
)

# Koopia fail hostingule
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>Ehitus staatus: {{ summary }}</h4>
<p> Kasutatud tööline: {{ workername }}</p>
{% for step in build['steps'] %}
<p> {{ step['name'] }}: {{ step['result'] }}</p>
{% endfor %}
<p><b> -- The 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'] = "Ehitusprotsess"
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"
}

Materjalid

Artikli ettevalmistamisel kasutati järgmisi materjale:

Allikas: habr.com

Osta usaldusväärne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid 🔥 Osta usaldusväärne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster