Buildbot in examples

Jeg måtte sette opp prosessen for å bygge og levere programvarepakker til nettstedet fra Git-repositoriet. Og etter å ha sett en artikkel om buildbot her på Habr for ikke så lenge siden (lenken er på slutten), bestemte jeg meg for å prøve det og bruke det til dette formålet.

Siden buildbot er et distribuert system, vil det være logisk å lage en egen byggehjemmeside for hver arkitektur og operativsystem. I vårt tilfelle vil det være LXC-containere (for Linux) og qemu (for Windows):

  • vm-srv-build1 — centos 7, her vil det være buildbot-master (master) og en av arbeiderne (worker)
  • vm-srv-build2 — debian 10, for å bygge DEB-pakker
  • vm-srv-build3 — windows 10, for å bygge, som dere forstår, for hva

Vi skal bygge Rac GUI — den grafiske grensesnittet for 1C rac for å administrere klyngen av servere. For Linux vil de innebygde verktøyene bli brukt for hvert OS, for å bygge exe-filen for Windows fra tcl-skript brukes freewrap.

Installasjon

GNU/Linux

Det er rikelig med dokumentasjon tilgjengelig på nettet om installasjonen, 1,2og det forårsaker ikke spesielle problemer:
For masteren:

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

For «arbeiderne», er det bare nødvendig dette:

pip3 install buildbot-worker

Selvfølgelig ville det være mer riktig å bygge pakker for hvert OS, men det faller utenfor rammen av denne artikkelen. Jeg vil også hoppe over beskrivelsen av oppsettet av containerne for arbeid; jeg vil bare nevne at jeg bruker ProxMox VE. Og det vil også være nødvendig å installere pakkene som er nødvendig for byggingen for hvert operativsystem (centos: rpmdevtools osv.; debian: build-essential, dh-make, pbuilder osv.)

Prosjektbygninger og buildbot-tjenester vil kjøre under navnet til en ikke-privilegert bruker, så det er nødvendig å opprette denne brukeren på alle vertene som deltar i prosessen:


adduser buildbot

Deretter skal vi sette opp automatisk start av tjenestene, deretter på hver av vertene (containerne):

Systemd-enhet for å starte masteren:

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

og «arbeiderne»

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

Siden alle skriptene (i vårt tilfelle) ligger i /usr/local/, må stien til dem legges til i miljøvariablene:

nano /root/.bash_profile

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

Etter dette kan du opprette kataloginfrastruktur for "arbeiderne" (på alle verter) ved å registrere deg som brukeren buildbot og utføre følgende kommandoer:

På den første verten 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

På den andre verten 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

På arbeidervertene kan buildbot-worker-tjenesten startes

systemctl start buildbot-worker

MS Windows

Som "arbeider" for bygging for Windows, vil en virtuell maskin med den nyeste utgivelsen av Win10 bli brukt.
For å få den til å fungere, trenger du:

Når alt det ovennevnte er installert, kan vi også installere buildbot:

pip install buildbot-worker

La oss opprette en arbeidskatalog

md c:worker

Og starte den

buildbot-worker start c:worker

Hvis alt fungerer (se logg c:workertwistd.log), kan vi registrere vår "arbeider" som en tjeneste ved å legge til et punkt i registret med arbeidskatalogen (kommandoene kjøres i powershell som administrator):

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

Og vi kan starte tjenesten

Start-Service buildbot

Det er alt for "arbeiderne"; ellers trenger vi ikke å røre dem, all kontroll skjer fra mesteren.

Konfigurering av mesteren

Først, la oss opprette infrastruktur for mesteren (på hovedverten), ved å registrere oss som brukeren buildbot og utføre følgende kommandoer:

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

For ferdige pakker oppretter vi en katalog builds

mkdir /home/buildbot/builds

I katalogen /home/buildbot/master/ ble filen master.cfg opprettet. Denne filen er kode i Python og inneholder beskrivelse av alle systemets driftsmekanismer, og vi skal jobbe med den videre.

nano /home/buildbot/master/master.cfg

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

c= BuildmasterConfig ={}

# Beskrivelse av våre arbeidere.
c['workers'] = [ worker.Worker('CentOS', '123456'), worker.Worker('Debian-10', '123456'), worker.Worker('Windows-10', '123456')]
c['protocols'] = {'pb': {'port': 4000}} 

# Angi til mesteren hvilken repository som skal overvåkes
c['change_source'] = []
c['change_source'].append(changes.GitPoller(
       repourl = 'https://bitbucket.org/svk28/rac-gui.git',
       project = 'Rac-GUI',
       branches = True,
       pollInterval = 60
      )
)

# Tjeneste for å starte byggingen
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
# Bygging av RPM-pakke
 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)
)

For å automatisere byggingen av pakker i forskjellige versjoner, slik at man slipper å grave i koden i master.cfg-filen, er det lagt til linjer med nåværende versjon og utgivelse i hovedprogrammet rac_gui.tcl.

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

Og basert på disse linjene vil buildbot numrere pakkene. For å hente ut data brukes et konsollgrep. I buildbot kan man ikke bare definere variabler for 'arbeidere' (i det minste har jeg ikke funnet ut hvordan). Dette gjøres med egenskaper (property). Det vil si at i byggeprosessen legger vi til trinn for å bestemme versjon og utgivelse, og dermed setter vi egenskapene version og release. Egenskaper kan settes på forskjellige måter, i dette tilfellet ved å kjøre en konsollkommando:

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

De oppnådde verdiene kan settes inn ved å bruke 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"]
       )
)

Det bør bemerkes at siden verten også brukes til manuell pakkeproduksjon, vil byggingen skje etter standardveier.

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

For å sette korrekte nummereringer for utgivelser og versjoner brukes standard sed, det vil si at kommandoen erstatter verdiene inne i spec-filen med de nødvendige.

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

Den ferdige pakkefilen og arkivet med kildekoden kopieres til mesteren. Men det er også mulig å kopiere direkte fra arbeidsfilene til ditt repo eller nettsted.

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

La oss starte prosessen med å kopiere de bygde pakkene til hosting via FTP på mesteren. For dette brukes skript i 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")]
        )
)

Vi er ferdige med RPM. Nå går vi videre til beskrivelsen av algoritmen for å bygge DEB-pakken. Siden pakketbyggingsprosessene for forskjellige systemer er uavhengige av hverandre, vil mange trinn bli gjentatt.


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

# Legger til versjonsdefinisjon fra hovedfilen
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"
       )
)

# Legger til utgivelsesdefinisjon fra hovedfilen
rac_gui_build_DEB.addStep(
       steps.SetPropertyFromCommand(
       command="grep release rac_gui.tcl | grep -oE 'b[0-9]{1,3}b'", property="release"
       )
)

# Omdøper kjørbar fil
    rac_gui_build_DEB.addStep(steps.ShellCommand(
       command=["mv", "rac_gui.tcl", "racgui"]))

For RPM-pakken utføres deler av de følgende prosedyrene av rpm under byggingen og er beskrevet i spesifikasjonen; for Debian må dette gjøres her:

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

Og med DEB er vi ferdige, nå 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)
)

Siden Windows vanligvis ikke har grep og sed (eller har det?), skal vi bruke 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),
]

For å varsle om statusen for byggeprosessen, vil vi bruke e-post.


c['services'] = []

template=u'''
    <h4>Byggestatus: {{ summary }}</h4>
    <p> Bruker brukt: {{ workername }}</p>
    {% for step in build['steps'] %}
    <p> {{ step['name'] }}: {{ step['result'] }}</p>
    {% endfor %}
    <p><b> -- Byggbot</b></p>
    '''

mailNotifier = reporters.MailNotifier(fromaddr="builder@domain.no",
             sendToInterestedUsers=False,
             mode=('all'),
             extraRecipients=["admin@domain.no"],
             relayhost="mail.domain.no",
             smtpPort=587,
             smtpUser="builder@domain.no",
             smtpPassword="******",
             messageFormatter=reporters.MessageFormatter(
                                 template=template, template_type='html',
                                 wantProperties=True, wantSteps=True))

c['services'].append(mailNotifier)

# Hovedinnstillinger for mesteren
c['title'] = "Prosessen med å bygge"
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"
}

Lagre filen, og så kan du prøve å starte mastertjenesten:

systemctl restart buildbot-master

I loggen vil vi sjekke at konfigurasjonen er i orden og at alt fungerer som det skal. Alle våre arbeidere skal nå koble til, noe som vil bli gledelig rapportert i loggen »»’/home/buildbot/master/twistd.log»»’:

 2019-07-24 16:50:35+0300 [-] Laster buildbot.tac...
 2019-07-24 16:50:35+0300 [-] Lasta.
 2019-07-24 16:50:35+0300 [-] twistd 19.2.1 (\/usr\/bin\/python3.6 3.6.8) byrjaður.
 2019-07-24 16:50:35+0300 [-] reactor class: twisted.internet.epollreactor.EPollReactor.
 2019-07-24 16:50:35+0300 [-] Byrjar BuildMaster -- buildbot.version: 2.3.1
 2019-07-24 16:50:35+0300 [-] Læsir uppstilling frá '\/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 og síðar] `buildbotNetUsageData` er ekki stillt og fer eftir grundvallarvalkostum.
        Þessi breyta hjálpar þróunarteymi buildbot að skilja uppsetningarnar.
        Engar persónuupplýsingar eru safnaðar.
        Aðeins upplýsingarnar um hugbúnaðarsversion og notkun viðbóta eru sendar.
        Þú getur `opt-out` með því að stilla þessa breytu á None.
        Eða `opt-in` fyrir frekari upplýsingar með því að stilla á "full".

 2019-07-24 16:50:36+0300 [-] Að setja upp gagnagrunn með URL 'sqlite:\/state.sqlite'
 2019-07-24 16:50:36+0300 [-] stillir dagbókina fyrir gagnagrunn á 'wal'
 2019-07-24 16:50:36+0300 [-] bætir við 1 nýrri þjónustu, fjarlægir 0
 2019-07-24 16:50:36+0300 [-] bætir við 1 nýju breytinga-uppsprettum, fjarlægir 0
 2019-07-24 16:50:36+0300 [-] gitpoller: notar vinnuslóða '\/home\/buildbot\/master\/gitpoller-work'
 2019-07-24 16:50:36+0300 [-] bætir við 3 nýjum smiðum, fjarlægir 0
 2019-07-24 16:50:36+0300 [-] bætir við 1 nýjum tímaskipuleggjendum, fjarlægir 0
 2019-07-24 16:50:36+0300 [-] uppsetning www viðbótar 'waterfall_view'
 2019-07-24 16:50:36+0300 [-] uppsetning www viðbótar 'console_view'
 2019-07-24 16:50:36+0300 [-] uppsetning www viðbótar 'grid_view'
 2019-07-24 16:50:36+0300 [-] ATHUGIÐ: www viðbótar 'sitenav' er uppsett en ekki stillt
 2019-07-24 16:50:36+0300 [-] uppsetning www viðbótar 'waterfall_view'
 2019-07-24 16:50:36+0300 [-] uppsetning www viðbótar 'console_view'
 2019-07-24 16:50:36+0300 [-] uppsetning www viðbótar 'grid_view'
 2019-07-24 16:50:36+0300 [-] ATHUGIÐ: www viðbótar 'sitenav' er uppsett en ekki stillt
 2019-07-24 16:50:36+0300 [-] BuildbotSite byrjað á 80
 2019-07-24 16:50:36+0300 [-] Byrjar verksmiðju <buildbot.www.service.BuildbotSite object at 0x7fe31c2657b8>
 2019-07-24 16:50:36+0300 [-] bætir við 3 nýjum starfsmönnum, fjarlægir 0
 2019-07-24 16:50:36+0300 [-] PBServerFactory byrjar á 4000
 2019-07-24 16:50:36+0300 [-] Byrjar verksmiðju <twisted.spread.pb.PBServerFactory object at 0x7fe31c147470>
 2019-07-24 16:50:37+0300 [-] BuildMaster er að keyra
 2019-07-24 16:50:37+0300 [-] buildbotNetUsageData: sendir {'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] starfsmanns 'CentOS' tengir við IPv4Address(type='TCP', host='127.0.0.1', port=37332)
 2019-07-24 16:50:37+0300 [Broker,0,127.0.0.1] Fann starfsmannsupplýsingar frá 'CentOS'
 2019-07-24 16:50:37+0300 [-] bot tengdur
 2019-07-24 16:50:37+0300 [Broker,0,127.0.0.1] Starfsmaður CentOS tengdur við Rac-GUI-RPM-builder
 2019-07-24 16:50:37+0300 [-] buildbotNetUsageData: buildbot.net sagði: ok
 2019-07-24 16:50:39+0300 [Broker,1,192.168.55.15] starfsmanns 'Windows-10' tengir við IPv4Address(type='TCP', host='192.168.5.145', port=49831)
 2019-07-24 16:50:39+0300 [Broker,1,192.168.55.15] Fann starfsmannsupplýsingar frá 'Windows-10'
 2019-07-24 16:50:40+0300 [-] bot tengdur
 2019-07-24 16:50:40+0300 [Broker,1,192.168.55.15] Starfsmaður Windows-10 tengdur við Rac-GUI-WIN-builder
 2019-07-24 16:50:41+0300 [Broker,2,192.168.55.99] starfsmanns 'Debian-10' tengir við IPv4Address(type='TCP', host='192.168.5.9', port=44430)
 2019-07-24 16:50:41+0300 [Broker,2,192.168.55.99] Fann starfsmannsupplýsingar frá 'Debian-10'
 2019-07-24 16:50:41+0300 [-] bot tengdur
 2019-07-24 16:50:41+0300 [Broker,2,192.168.55.99] Starfsmaður Debian-10 tengdur við Rac-GUI-DEB-builder

Når prosessen for innstilling er fullført, kan du sjekke den nåværende tilstanden via webgrensesnittet. Her kan du også se byggefeil, sende en henvendelse til prosessen hvis noe gikk galt osv.

Rett etter at vi har startet arbeiderne, kan du se dette via menyen «Builds» -> «Workers»

Buildbot in examples

Når den første byggeprosessen er utført (dvs. endringer i Git-repositoriet), vil tilstanden til prosessene vises på den første siden.

Buildbot in examples

Hvis du klikker med musen på den aktuelle linjen, åpnes en side med den nåværende tilstanden til denne prosessen, hvor du kan se hva som skjer, hvilke feil som oppstår osv.

Buildbot in examples

Hele konfigurasjonen til mesteren kan hentes her

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

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

# Legg til versjonsdefinisjon fra hovedfilen
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"
    )
)

# Legg til utgivelsesdefinisjon fra hovedfilen
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'
    ))

# Kopier filen til master
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)
    )

# Legg til versjonsdefinisjon fra hovedfilen
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"
    )
)

# Legg til utgivelsesdefinisjon fra hovedfilen
rac_gui_build_DEB.addStep(
    steps.SetPropertyFromCommand(
    command="grep release rac_gui.tcl | grep -oE 'b[0-9]{1,3}b'", property="release"
    )
)

# Endre navnet på kjørbar fil
rac_gui_build_DEB.addStep(steps.ShellCommand(
    command=["mv", "rac_gui.tcl", "racgui"]))

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

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

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

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

# Kopiere filen til master
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)
    )

# Legg til versjonsdefinisjon fra hovedfilen
rac_gui_build_WIN.addStep(
    steps.SetPropertyFromCommand(
    command="powershell -command "((Get-Content .rac_gui.tcl | Select-String -Pattern 'version:') -split 's')[2]",
    property="version"
    )
)

# Legg til utgivelsesdefinisjon fra hovedfilen
rac_gui_build_WIN.addStep(
    steps.SetPropertyFromCommand(
    command="powershell -command "((Get-Content .rac_gui.tcl | Select-String -Pattern 'release:') -split 's')[2]",
    property="release"
    )
)

# Opprett kjørbar fil
rac_gui_build_WIN.addStep(steps.ShellCommand(
    command=["c:binfreewrap.exe", "rac_gui.tcl"]))

# Arkivere det som ble oppnådd
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"]))

# Kopiere til master
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")
    )
)

# Kopiere filen til hosting
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>Byggestatus: {{ summary }}</h4>
<p> Bruker brukt: {{ workername }}</p>
{% for step in build['steps'] %}
<p> {{ step['name'] }}: {{ step['result'] }}</p>
{% endfor %}
<p><b> -- Byggbot</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'] = "Byggingsprosessen"
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"
}

Materialer

Ved forberedelsen av artikkelen ble følgende materialer brukt:

Kilde: habr.com

Kjøp pålitelig hosting for nettsteder med DDoS-beskyttelse, VPS VDS-servere 🔥 Kjøp pålitelig hosting for nettsteder med DDoS-beskyttelse, VPS VDS-servere | ProHoster