Ech brauch de Prozess opzestellen fir Software Packagen aus engem Git Repository op de Site ze sammelen an ze liwweren. A wéi ech, virun net esou laanger Zäit, hei um Habré en Artikel iwwer buildbot gesinn hunn (Link um Enn), hunn ech décidéiert et ze probéieren an et ëmzesetzen.
Well buildbot e verdeelt System ass, wier et logesch fir e separaten Buildhost fir all Architektur a Betribssystem ze kreéieren. An eisem Fall sinn dëst LXC Container (am Fall vu Linux) a qemu (am Fall vu Windows):
vm-srv-build1 - centos 7, et gëtt e buildbot Master an ee vun den Aarbechter
vm-srv-build2 - debian 10, fir DEB Packagen ze bauen
vm-srv-build3 - Windows 10, fir Assemblée, Dir wësst wat fir
Mir sammelen Rac GUI - eng grafesch Interface fir 1C rac fir e Cluster vu Serveren ze managen. Fir Linux ginn Standard Tools fir all OS benotzt; fir eng exe Datei fir Windows aus engem tcl Skript ze bauen, benotzt fräiwëlleg.
Kader
GNU / Linux
Et gëtt genuch Dokumentatioun um Internet fir d'Installatioun 1,2. Jo, an et verursaacht keng speziell Problemer:
Fir de Meeschter:
Natierlech wier et méi korrekt fir Packagen fir all OS ze sammelen, awer dëst ass iwwer den Ëmfang vum Artikel. Mir wäerten och d'Beschreiwung vun der Ariichten vu Container fir d'Aarbecht ausgoen, ech bemierken nëmmen datt ech ProxMox VE benotzen. An Dir musst och Pakete fir all Achs installéieren, déi fir d'Versammlung erfuerderlech ass (centos: rpmdevtools, etc.; debian: build-essential, dh-make, pbuilder, etc.)
Build Projeten a buildbot Servicer ginn als onprivilegéierte Benotzer gestart, also musst Dir een op all Hosten erstellen, déi um Prozess deelhuelen:
adduser buildbot
Als nächst konfiguréiere mir den automateschen Start vun de Servicer op jiddereng vun den Hosten (Container):
Duerno kënnt Dir eng Verzeechnesinfrastruktur fir "Aarbechter" erstellen (op all Hosten), fir dëst ze maachen, registréiert Iech ënner dem buildbot Benotzer a lafen déi folgend Kommandoen:
Op den éischte Host vm-srv-build1:
su - buildbot
mkdir /home/buildbot/worker
cd ~
buildbot-worker create-worker --umask=0o22 --keepalive=60 worker vm-srv-build1:4000 CentOS 123456
Um zweeten Host vm-srv-build2:
su - buildbot
mkdir /home/buildbot/worker
cd ~
buildbot-worker create-worker --umask=0o22 --keepalive=60 worker vm-srv-build1:4000 Debian-10 123456
Op Aarbechter Hosten kann de buildbot-worker Service gestart ginn
systemctl start buildbot-worker
MS Windows
Als "Aarbechter" fir Assemblée ënner Windows gëtt eng virtuell Maschinn mat der leschter Verëffentlechung vu Win10 benotzt.
Fir ze schaffen braucht Dir:
Nodeems alles uewendriwwer installéiert ass, kënnt Dir de buildbot selwer installéieren:
pip install buildbot-worker
Loosst eis en Aarbechtsverzeechnes erstellen
md c:worker
A loosst eis starten
buildbot-worker start c:worker
Wann alles funktionnéiert (kuckt de Log c:workertwistd.log), da kënnt Dir eisen "Aarbechter" als Service registréieren andeems Dir en Element mam Aarbechtsverzeichnis an d'Registry bäidréit (Kommandoe ginn a Powershell ausgefouert, déi als Administrator lafen):
Dat ass alles mat den "Aarbechter", Dir musst se net weider beréieren, all Kontroll kënnt vum Meeschter.
Wizard Setup
Fir unzefänken, loosst eis d'Infrastruktur fir de Master erstellen (op den Haapthost), fir dëst ze maachen, registréiert Iech ënner dem buildbot Benotzer a lafen déi folgend Kommandoen:
su - buildbot
mkdir /home/buildbot/master
cd ~
buildbot create-master master
Fir fäerdeg Packagen, erstellt e Build-Verzeichnis
mkdir /home/buildbot/builds
Eng master.cfg Datei gouf am /home/buildbot/master/ Verzeichnis erstallt. Dëse Fichier ass e Python-Code an enthält eng Beschreiwung vun all de Mechanismen vum System; mir wäerte mat deem an Zukunft schaffen.
Fir d'Assemblée vu Packagen vu verschiddene Versiounen ze automatiséieren, fir net an de Code vun der master.cfg Datei ze verdéiwen, am Haaptskript vum rac_gui.tcl Programm, Linnen mat der aktueller Versioun a Verëffentlechung goufen am Header bäigefüügt :
A baséiert op dëse Linnen, wäert buildbot d'Packagen nummeréieren. Fir Daten ze extrahieren, benotzt d'Konsole grep Call. Am buildbot kënnt Dir einfach keng Variablen fir "Aarbechter" definéieren (op d'mannst, ech hunn net fonnt wéi). Dëst ass wat Eegeschafte fir benotzt ginn. Déi. Am Montageprozess addéiere mir Schrëtt fir d'Versioun an d'Verëffentlechung ze bestëmmen an deementspriechend d'Versioun an d'Verëffentlechungseigenschaften ze setzen. D'Eegeschafte kënnen op verschidde Manéiere gesat ginn, an dësem Fall andeems Dir de Konsol Kommando rufft:
# Добавим определение версии из основного файла
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"
)
)
Dir kënnt déi resultéierend Wäerter ersetzen andeems Dir util.Interpolate() rufft.
Et sollt hei bemierkt ginn datt well den Host och fir manuell Montage vu Packagen benotzt gëtt, wäert d'Versammlung laanscht Standardweeër stattfannen.
Fir déi richteg Verëffentlechungs- a Versiounsnummeren ze setzen, benotzt e Standard Sed Call, d.h. de Kommando ersetzt d'Wäerter an der Spezifizéierungsdatei mat den erfuerderlechen
Mir kopéieren de fäerdege versammelt Package an d'Archiv mat Quellen un de Meeschter. Awer Dir kënnt direkt Dateien vun Ärer Aarbechtsdatei op Äre Repository oder Websäit kopéieren.
# Скопируем файл на мастер
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")
)
)
Loosst eis de Prozess starten fir déi gesammelt Packagen op den Hosting iwwer FTP um Master ze kopéieren. Fir dësen Zweck gëtt et benotzt Schrëft op tcl.
Dat ass et mat RPM. Loosst eis elo den Algorithmus beschreiwen fir en DEB Package ze bauen. Well d'Prozesser fir Pakete fir verschidde Systemer ze bauen onofhängeg vuneneen sinn, gi vill Schrëtt widderholl.
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)
)
# Добавим определение версии из основного файла
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"
)
)
# Добавим определение релиза из основного файла
rac_gui_build_DEB.addStep(
steps.SetPropertyFromCommand(
command="grep release rac_gui.tcl | grep -oE 'b[0-9]{1,3}b'", property="release"
)
)
# Переименуем запускаемый файл
rac_gui_build_DEB.addStep(steps.ShellCommand(
command=["mv", "rac_gui.tcl", "racgui"]))
Fir e RPM Package ginn e puer vun de folgende Prozedure vum RPM selwer während der Montage gemaach a ginn an der Spezifizéierung beschriwwen; fir Debian musst Dir et hei maachen:
# Поменяем пути к библиотекам
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")]
)
)
Späichert d'Datei an Dir kënnt probéieren de Wizard Service ze starten:
systemctl restart buildbot-master
Am Log wäerte mir kucken datt alles an der Rei ass mat der Configuratioun an alles funktionnéiert wéi normal. All eis Aarbechter sollen elo konnektéieren, wat glécklech am Logbuch gemellt gëtt »»'/home/buildbot/master/twistd.log»»':
2019-07-24 16:50:35+0300 [-] Loading buildbot.tac...
2019-07-24 16:50:35+0300 [-] Loaded.
2019-07-24 16:50:35+0300 [-] twistd 19.2.1 (/usr/bin/python3.6 3.6.8) starting up.
2019-07-24 16:50:35+0300 [-] reactor class: twisted.internet.epollreactor.EPollReactor.
2019-07-24 16:50:35+0300 [-] Starting BuildMaster -- buildbot.version: 2.3.1
2019-07-24 16:50:35+0300 [-] Loading configuration from '/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 and later] `buildbotNetUsageData` is not configured and defaults to basic.
This parameter helps the buildbot development team to understand the installation base.
No personal information is collected.
Only installation software version info and plugin usage is sent.
You can `opt-out` by setting this variable to None.
Or `opt-in` for more information by setting it to "full".
2019-07-24 16:50:36+0300 [-] Setting up database with URL 'sqlite:/state.sqlite'
2019-07-24 16:50:36+0300 [-] setting database journal mode to 'wal'
2019-07-24 16:50:36+0300 [-] adding 1 new services, removing 0
2019-07-24 16:50:36+0300 [-] adding 1 new change_sources, removing 0
2019-07-24 16:50:36+0300 [-] gitpoller: using workdir '/home/buildbot/master/gitpoller-work'
2019-07-24 16:50:36+0300 [-] adding 3 new builders, removing 0
2019-07-24 16:50:36+0300 [-] adding 1 new schedulers, removing 0
2019-07-24 16:50:36+0300 [-] initializing www plugin 'waterfall_view'
2019-07-24 16:50:36+0300 [-] initializing www plugin 'console_view'
2019-07-24 16:50:36+0300 [-] initializing www plugin 'grid_view'
2019-07-24 16:50:36+0300 [-] NOTE: www plugin 'sitenav' is installed but not configured
2019-07-24 16:50:36+0300 [-] initializing www plugin 'waterfall_view'
2019-07-24 16:50:36+0300 [-] initializing www plugin 'console_view'
2019-07-24 16:50:36+0300 [-] initializing www plugin 'grid_view'
2019-07-24 16:50:36+0300 [-] NOTE: www plugin 'sitenav' is installed but not configured
2019-07-24 16:50:36+0300 [-] BuildbotSite starting on 80
2019-07-24 16:50:36+0300 [-] Starting factory <buildbot.www.service.BuildbotSite object at 0x7fe31c2657b8>
2019-07-24 16:50:36+0300 [-] adding 3 new workers, removing 0
2019-07-24 16:50:36+0300 [-] PBServerFactory starting on 4000
2019-07-24 16:50:36+0300 [-] Starting factory <twisted.spread.pb.PBServerFactory object at 0x7fe31c147470>
2019-07-24 16:50:37+0300 [-] BuildMaster is running
2019-07-24 16:50:37+0300 [-] buildbotNetUsageData: sending {'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] worker 'CentOS' attaching from IPv4Address(type='TCP', host='127.0.0.1', port=37332)
2019-07-24 16:50:37+0300 [Broker,0,127.0.0.1] Got workerinfo from 'CentOS'
2019-07-24 16:50:37+0300 [-] bot attached
2019-07-24 16:50:37+0300 [Broker,0,127.0.0.1] Worker CentOS attached to Rac-GUI-RPM-builder
2019-07-24 16:50:37+0300 [-] buildbotNetUsageData: buildbot.net said: ok
2019-07-24 16:50:39+0300 [Broker,1,192.168.55.15] worker 'Windows-10' attaching from IPv4Address(type='TCP', host='192.168.5.145', port=49831)
2019-07-24 16:50:39+0300 [Broker,1,192.168.55.15] Got workerinfo from 'Windows-10'
2019-07-24 16:50:40+0300 [-] bot attached
2019-07-24 16:50:40+0300 [Broker,1,192.168.55.15] Worker Windows-10 attached to Rac-GUI-WIN-builder
2019-07-24 16:50:41+0300 [Broker,2,192.168.55.99] worker 'Debian-10' attaching from IPv4Address(type='TCP', host='192.168.5.9', port=44430)
2019-07-24 16:50:41+0300 [Broker,2,192.168.55.99] Got workerinfo from 'Debian-10'
2019-07-24 16:50:41+0300 [-] bot attached
2019-07-24 16:50:41+0300 [Broker,2,192.168.55.99] Worker Debian-10 attached to Rac-GUI-DEB-builder
Dëst fäerdeg de Setupprozess. Dir kënnt den aktuelle Status iwwer d'Webinterface gesinn. Wou kënnt Dir och Baufehler gesinn, e gefruerene Prozess starten wann eppes falsch gaang ass, etc.
Direkt nom Start kënnen eis haart Aarbechter iwwer de Menü "Builds" -> "Aarbechter" gekuckt ginn
Nodeems den éischte Bauprozess ofgeschloss ass (dh Ännerungen am Git Repository), erschéngt de Status vun de Prozesser op der éischter Säit.
Wann Dir op déi gewënscht Linn mat der Maus klickt, gëtt eng Säit mat dem aktuellen Zoustand vun dësem Prozess op, wou Dir kënnt gesinn wat geschitt, wéi eng Feeler, etc.