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 — 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 .
Paigaldamine
GNU/Linux
Interneti seadistamiseks ja dokumentatsiooniks on piisavalt materjali ,. 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-dateutilTööliste jaoks, piisab sellest:
pip3 install buildbot-workerLoomulikult 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 buildbotSeejä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.targetja «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.serviceKuna 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/binPä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 123456Teisel 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 123456Töölisserverites saab buildbot-worker teenuse käivitada
systemctl start buildbot-workerMS Windows
Windowsi jaoks töölistena kasutatakse virtuaalmasinat viimase Win10 versiooniga.
Tööks on vajalik:
- Erinevate asjade installimiseks Pythoni alla tuli alla laadida
- 7Zip
Kui kõik eespool loetletud on installitud, saab installida ka buildboti:
pip install buildbot-workerLoome töökatalooge
md c:workerJa käivitame
buildbot-worker start c:workerKui 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 buildbotTöö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 masterValmis pakettide jaoks loome katalooge builds
mkdir /home/buildbot/buildsKataloogis /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.cfgimport 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: 1Ja 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 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-masterLogis 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-builderSead 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”

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

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

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:
- Ja toote dokumentatsioon
Allikas: habr.com
