Be kellett állítanom a szoftvercsomagok weboldalra történő összeállításának és szállításának folyamatát a Git-repozitóriumból. A napokban láttam egy cikket a buildbot-ról a Habr-on (link a végén), így úgy döntöttem, hogy kipróbálom és alkalmazom.
Mivel a buildbot egy elosztott rendszer, logikus, hogy egy külön építési hosztot hozzunk létre minden architektúrához és operációs rendszerhez. Ebben az esetben LXC konténerek lesznek (Linux esetén) és qemu (Windows esetén):
- vm-srv-build1 — centos 7, itt lesz a buildbot mester (master) és az egyik munkás (worker)
- vm-srv-build2 — debian 10, a DEB csomagok összeállításához
- vm-srv-build3 — windows 10, olyan összeállításokhoz, mint az érthető
Össze fogjuk állítani — grafikus felület a 1C rac számára a szerverek klaszterének kezelésére. Linux esetén az adott operációs rendszerhez szánt natív eszközöket használunk, míg Windows esetén exe fájl létrehozásához a tcl szkriptből .
Telepítés
GNU/Linux
Az installációhoz és a dokumentációhoz elegendő anyag található az interneten. ,Nem is okoz különösebb problémákat:
A mesterhez:
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-dateutilA 'munkások' számára elegendő ez:
pip3 install buildbot-workerTermészetesen helyesebb lenne csomagokat építeni minden operációs rendszerhez, de ez nem tartozik a cikk keretei közé. Ezen kívül elhagyjuk a konténerek beállításának leírását, csak annyit jegyzünk meg, hogy a ProxMox VE-t használom. És szükséges lesz csomagokat telepíteni minden OS alá a buildeléshez (centos: rpmdevtools stb; debian: build-essential, dh-make, pbuilder stb.)
A projektek és a buildbot szolgáltatások nem privilegizált felhasználó nevében fognak futni, ezért létre kell hozni ezt minden résztvevő hoszton:
adduser buildbotEzután beállítjuk a szolgáltatások automatikus indítását, megfelelően minden hoszton (konténerben):
Systemd egység a mester indításához:
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és a 'munkás' számára
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.serviceMivel az összes szkript (jelen esetben) a /usr/local/ mappában található, ezért érdemes a környezeti változókban feltüntetni az útvonalukat:
nano /root/.bash_profile
PATH=$PATH:$HOME/.local/bin:$HOME/bin:/usr/local/binEzután létrehozhatjuk a "munkás" könyvtárak infrastruktúráját (minden hoszton), ehhez a buildbot felhasználóval be kell jelentkezni és végrehajtani a következő parancsokat:
Az első hoszton vm-srv-build1:
su - buildbot
mkdir /home/buildbot/worker
cd ~
buildbot-worker create-worker --umask=0o22 --keepalive=60 worker vm-srv-build1:4000 CentOS 123456A második hoszton 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 123456A munkás hosztokon elindítható a buildbot-worker szolgáltatás
systemctl start buildbot-workerMS Windows
A Windows alatti buildeléshez a legfrissebb Win10 verzióval rendelkező virtuális gépet fogunk használni mint "munkást".
A munkához szükséges:
- A különböző telepítésekhez a pythonban le kellett tölteni
- 7Zip
Miután az összes fent említett telepítve van, magát a buildbotot is telepíthetjük:
pip install buildbot-workerHozzuk létre a munkakönyvtárat
md c:workerÉs indítsuk el
buildbot-worker start c:workerHa minden működik (lásd a naplót c:workertwistd.log), akkor a "munkásunkat" regisztrálhatjuk mint szolgáltatást, hozzáadva a munka könyvtárát a rendszerleíró adatbázishoz (a parancsokat rendszergazdai módban futtatott PowerShellben kell végrehajtani):
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
És indíthatjuk a szolgáltatást
Start-Service buildbotA "munkásokkal" eddig tart, őket ezután nem kell érinteni, minden irányítás a mestertől történik.
A mester beállítása
Kezdésként hozzunk létre egy infrastruktúrát a mesterhez (a fő hoszton), ehhez a buildbot felhasználóval be kell jelentkezni és végrehajtani a következő parancsokat:
su - buildbot
mkdir /home/buildbot/master
cd ~
buildbot create-master masterA kész csomagokhoz hozzunk létre egy builds könyvtárat
mkdir /home/buildbot/buildsA /home/buildbot/master/ könyvtárban létrejött a master.cfg fájl. Ez a fájl Python kódot tartalmaz, és a rendszer munkafolyamatának leírását tartalmazza, ezzel fogunk dolgozni a továbbiakban.
nano /home/buildbot/master/master.cfgimport os, re
from buildbot.plugins import steps, util, schedulers, worker, changes, reporters
c= BuildmasterConfig ={}
# A munkáink leírása.
c['workers'] = [ worker.Worker('CentOS', '123456'), worker.Worker('Debian-10', '123456'), worker.Worker('Windows-10', '123456')]
c['protocols'] = {'pb': {'port': 4000}}
# A mester számára meg kell adni, hogy melyik repót figyelje
c['change_source'] = []
c['change_source'].append(changes.GitPoller(
repourl = 'https://bitbucket.org/svk28/rac-gui.git',
project = 'Rac-GUI',
branches = True,
pollInterval = 60
)
)
# A build folyamat indító szolgáltatása
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-csomag építése
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)
)A különböző verziójú csomagok automatizált építése érdekében, hogy ne kelljen a master.cfg fájl kódjában turkálni, a rac_gui.tcl program fő scriptjébe a következő verzió és kiadás sorokat adtuk hozzá:
######################################################
# Rac GUI
...
# version: 1.0.3
# release: 1Ezek alapján a buildbot számozni fogja a csomagokat. Az adatok kinyerésére a grep konzolos parancsot használják. A buildbotban egyszerűen nem lehet változókat definiálni a "munkások" számára (legalábbis én nem találtam rá módot). Erre szolgálnak a tulajdonságok (property). Tehát az építési folyamatba lépéseket adunk hozzá a verzió és kiadás meghatározásához, és ennek megfelelően beállítjuk a version és release tulajdonságokat. A tulajdonságokat különböző módokon állíthatjuk be, ennél a példánál a konzolos parancs hívásával:
# Добавим определение версии из основного файла
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"
)
)A kapott értékek behelyettesítésére a util.Interpolate() hívást használjuk.
# Запакуем исходники
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"]
)
)Itt érdemes megjegyezni, hogy mivel a hostot manuális csomagépítésre is használják, ezért az építés a standard útvonalakon fog zajlani.
# Копируем spec
rac_gui_build_RPM.addStep(steps.ShellCommand(
command=["cp", "../rac-gui/rac_gui.spec", "/home/buildbot/rpmbuild/SPECS/rac_gui.spec"]))A helyes kiadási és verziószámok beállításához a standard sed hívására van szükség, azaz a parancs a spec fájl belsejében lévő értékeket a szükségesekre cseréli.
# меняем версию
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'
)
)A kész csomagot és a forráskód archívumot a masterre másoljuk. De lehet közvetlenül a munkafájlból is átmásolni a saját repónkba vagy a webhelyre.
# Скопируем файл на мастер
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")
)
)Elindítjuk a csomagok másolási folyamatát a hostolásra FTP-n a masteren. Ehhez használjuk a tcl-t.
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")]
)
)Ezzel befejeztük az RPM-mel kapcsolatos lépéseket. Most áttérünk a DEB-csomag építési algoritmusának leírására. Mivel a csomagok összeállításának folyamatai különböző rendszerek alatt függetlenek egymástól, sok lépés ismétlődő lesz.
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)
)
# Adjuk hozzá a verzió meghatározását a fő fájlból
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"
)
)
# Adjuk hozzá a kiadás meghatározását a fő fájlból
rac_gui_build_DEB.addStep(
steps.SetPropertyFromCommand(
command="grep release rac_gui.tcl | grep -oE 'b[0-9]{1,3}b'", property="release"
)
)
# Renaming the executable file
rac_gui_build_DEB.addStep(steps.ShellCommand(
command=["mv", "rac_gui.tcl", "racgui"]))Az RPM-csomag esetében az alábbi eljárások egy részét maga az rpm végzi az építés során és azok a spekben vannak leírva, míg a Debian esetén ezeket itt kell végezni.
# Поменяем пути к библиотекам
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")]
)
)A DEB vége, most jöhet a 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)
)Mivel Windows alatt alapértelmezés szerint nincs grep és sed (vagy van?), így PowerShellt fogunk használni.
# Добавим определение версии из основного файла
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),
]A build folyamatának állapotáról elektromos postán fogunk értesítést küldeni.
c['services'] = []
template=u'''
<h4>Build állapot: {{ summary }}</h4>
<p> Használatban lévő munkás: {{ workername }}</p>
{% for step in build['steps'] %}
<p> {{ step['name'] }}: {{ step['result'] }}</p>
{% endfor %}
<p><b> -- A Buildbot</b></p>
'''
mailNotifier = reporters.MailNotifier(fromaddr="builder@domain.hu",
sendToInterestedUsers=False,
mode=('all'),
extraRecipients=["admin@domain.hu"],
relayhost="mail.domain.hu",
smtpPort=587,
smtpUser="builder@domain.hu",
smtpPassword="******",
messageFormatter=reporters.MessageFormatter(
template=template, template_type='html',
wantProperties=True, wantSteps=True))
c['services'].append(mailNotifier)
# A mester alapbeállításai
c['title'] = "A buildelési folyamat"
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"
}Mentjük a fájlt, és próbáljuk meg elindítani a master szolgáltatást:
systemctl restart buildbot-masterA naplóban ellenőrizzük, hogy a konfiguráció rendben van-e és minden megfelelően működik-e. Most minden munkatársunknak csatlakoznia kell, amiről a naplóban a »»'/home/buildbot/master/twistd.log'»»’ örömteli értesítést küld.
2019-07-24 16:50:35+0300 [-] A buildbot.tac betöltése...
2019-07-24 16:50:35+0300 [-] Betöltve.
2019-07-24 16:50:35+0300 [-] twistd 19.2.1 (\/usr\/bin\/python3.6 3.6.8) elindul.
2019-07-24 16:50:35+0300 [-] reaktor osztály: twisted.internet.epollreactor.EPollReactor.
2019-07-24 16:50:35+0300 [-] BuildMaster indítása -- buildbot.version: 2.3.1
2019-07-24 16:50:35+0300 [-] Konfiguráció betöltése a '\/home\/buildbot\/master\/master.cfg'-ből
2019-07-24 16:50:36+0300 [-] \/usr\/local\/lib\/python3.6\/site-packages\/buildbot\/config.py:90: buildbot.config.ConfigWarning: [0.9.0 és újabb] `buildbotNetUsageData` nincs konfigurálva, és alapértelmezetten alapértelmezett.
Ez a paraméter segít a buildbot fejlesztőcsapatának megérteni a telepítési bázist.
Nincs személyes adat gyűjtve.
Csak a telepítési szoftver verzióinformációját és a pluginok használatát küldik el.
A változót None értékre állítva leiratkozhatsz.
Vagy több információért válaszd a "full" értéket.
2019-07-24 16:50:36+0300 [-] Adatbázis beállítása a 'sqlite:\/state.sqlite' URL-en
2019-07-24 16:50:36+0300 [-] az adatbázis naplózási módját 'wal'-ra állítva
2019-07-24 16:50:36+0300 [-] 1 új szolgáltatás hozzáadva, 0 eltávolítva
2019-07-24 16:50:36+0300 [-] 1 új változásforrás hozzáadva, 0 eltávolítva
2019-07-24 16:50:36+0300 [-] gitpoller: a munkakönyvtár '\/home\/buildbot\/master\/gitpoller-work'
2019-07-24 16:50:36+0300 [-] 3 új építő hozzáadva, 0 eltávolítva
2019-07-24 16:50:36+0300 [-] 1 új ütemező hozzáadva, 0 eltávolítva
2019-07-24 16:50:36+0300 [-] www plugin 'waterfall_view' inicializálása
2019-07-24 16:50:36+0300 [-] www plugin 'console_view' inicializálása
2019-07-24 16:50:36+0300 [-] www plugin 'grid_view' inicializálása
2019-07-24 16:50:36+0300 [-] MEGJEGYZÉS: a www plugin 'sitenav' telepítve van, de nincs konfigurálva
2019-07-24 16:50:36+0300 [-] www plugin 'waterfall_view' inicializálása
2019-07-24 16:50:36+0300 [-] www plugin 'console_view' inicializálása
2019-07-24 16:50:36+0300 [-] www plugin 'grid_view' inicializálása
2019-07-24 16:50:36+0300 [-] MEGJEGYZÉS: a www plugin 'sitenav' telepítve van, de nincs konfigurálva
2019-07-24 16:50:36+0300 [-] BuildbotSite elindult a 80-as porton
2019-07-24 16:50:36+0300 [-] Gyártó indítása <buildbot.www.service.BuildbotSite object at 0x7fe31c2657b8>
2019-07-24 16:50:36+0300 [-] 3 új munkás hozzáadva, 0 eltávolítva
2019-07-24 16:50:36+0300 [-] PBServerFactory elindítva a 4000-esen
2019-07-24 16:50:36+0300 [-] Gyártó indítása <twisted.spread.pb.PBServerFactory object at 0x7fe31c147470>
2019-07-24 16:50:37+0300 [-] A BuildMaster működik
2019-07-24 16:50:37+0300 [-] buildbotNetUsageData: küldés {'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] munkás 'CentOS' csatlakozik az IPv4Address(type='TCP', host='127.0.0.1', port=37332)
2019-07-24 16:50:37+0300 [Broker,0,127.0.0.1] Munkás információ fogadva a 'CentOS'-tól
2019-07-24 16:50:37+0300 [-] bot csatlakozott
2019-07-24 16:50:37+0300 [Broker,0,127.0.0.1] A CentOS munkás csatlakozott a Rac-GUI-RPM-builderhez
2019-07-24 16:50:37+0300 [-] buildbotNetUsageData: a buildbot.net azt mondta: ok
2019-07-24 16:50:39+0300 [Broker,1,192.168.55.15] munkás 'Windows-10' csatlakozik az IPv4Address(type='TCP', host='192.168.5.145', port=49831)
2019-07-24 16:50:39+0300 [Broker,1,192.168.55.15] Munkás információ fogadva a 'Windows-10'-tól
2019-07-24 16:50:40+0300 [-] bot csatlakozott
2019-07-24 16:50:40+0300 [Broker,1,192.168.55.15] A Windows-10 munkás csatlakozott a Rac-GUI-WIN-builderhez
2019-07-24 16:50:41+0300 [Broker,2,192.168.55.99] munkás 'Debian-10' csatlakozik az IPv4Address(type='TCP', host='192.168.5.9', port=44430)
2019-07-24 16:50:41+0300 [Broker,2,192.168.55.99] Munkás információ fogadva a 'Debian-10'-tól
2019-07-24 16:50:41+0300 [-] bot csatlakozott
2019-07-24 16:50:41+0300 [Broker,2,192.168.55.99] A Debian-10 munkás csatlakozott a Rac-GUI-DEB-builderhezA beállítási folyamat véget ért. A jelenlegi állapotot webes felületen keresztül lehet ellenőrizni, ahol a build hibák is megtekinthetők, és leállíthatók az esetlegesen megakadt folyamatok.
A munkafolyamataink elindítása után az «Builds» -> «Workers» menüben lehet megtekinteni.

Miután az első build folyamat befejeződött (azaz változások történtek a Git-repozitóriumban), az első oldalon megjelenik a folyamatok állapota.

Ha rákattintunk a szükséges sorra, megnyílik egy oldal a folyamat aktuális állapotával, ahol láthatjuk, mi történik, milyen hibák léptek fel stb.

A teljes mester konfigurációt itt találja.
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
))
# A build szolgáltatás indítása
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)
)
# A verzió meghatározása a fő fájlból
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"
)
)
# A kiadás meghatározása a fő fájlból
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'
))
# Fájl átmásolása a mesterre
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)
)
# A verzió meghatározása a fő fájlból
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"
)
)
# A kiadás meghatározása a fő fájlból
rac_gui_build_DEB.addStep(
steps.SetPropertyFromCommand(
command="grep release rac_gui.tcl | grep -oE 'b[0-9]{1,3}b'", property="release"
)
)
# A végrehajtható fájl átnevezése
rac_gui_build_DEB.addStep(steps.ShellCommand(
command=["mv", "rac_gui.tcl", "racgui"]))
# Könyvtárak elérési útjának módosítása
rac_gui_build_DEB.addStep(steps.ShellCommand(
command=["sed", "-i", "s+^set dir(lib)+set dir(lib) \/usr\/share\/rac-gui\/lib ;#+g", "racgui"]))
# Fájlok elérési útjának módosítása
rac_gui_build_DEB.addStep(steps.ShellCommand(
command=["sed", "-i", "s+[pwd]+\/usr\/share\/rac-gui+g", "racgui"]))
# Források becsomagolása
rac_gui_build_DEB.addStep(steps.ShellCommand(
command=["tar", "czf", util.Interpolate("..\/rac-gui_%(prop:version)s.orig.tar.gz"), "."]))
# A csomag elkészítése
rac_gui_build_DEB.addStep(steps.ShellCommand(
command=["dpkg-buildpackage"]))
# Fájl átmásolása a mesterre
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)
)
# A verzió meghatározása a fő fájlból
rac_gui_build_WIN.addStep(
steps.SetPropertyFromCommand(
command="powershell -command "((Get-Content .rac_gui.tcl | Select-String -Pattern 'version:') -split 's')[2]",
property="version"
)
)
# A kiadás meghatározása a fő fájlból
rac_gui_build_WIN.addStep(
steps.SetPropertyFromCommand(
command="powershell -command "((Get-Content .rac_gui.tcl | Select-String -Pattern 'release:') -split 's')[2]",
property="release"
)
)
# A végrehajtható fájl létrehozása
rac_gui_build_WIN.addStep(steps.ShellCommand(
command=["c:binfreewrap.exe", "rac_gui.tcl"]))
# A kapott fájl tömörítése
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"]))
# Másolás a mesterre
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")
)
)
# Fájl átmásolása a tárhelyre
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>Build állapot: {{ summary }}</h4>
<p> Használatban lévő munkás: {{ workername }}</p>
{% for step in build['steps'] %}
<p> {{ step['name'] }}: {{ step['result'] }}</p>
{% endfor %}
<p><b> -- A 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'] = "Az építési folyamat"
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"
}Anyagok
A cikk készítése során a következő anyagokat használtuk:
- És a termék dokumentációját
Forrás: habr.com
