Jag behövde ställa in processen för att montera och leverera mjukvarupaket från ett Git-förråd till webbplatsen. Och när jag såg, för inte så länge sedan, här på Habré en artikel om buildbot (länk i slutet), bestämde jag mig för att prova den och tillämpa den.
Eftersom buildbot är ett distribuerat system skulle det vara logiskt att skapa en separat byggvärd för varje arkitektur och operativsystem. I vårt fall kommer dessa att vara LXC-behållare (i fallet med Linux) och qemu (i fallet med Windows):
vm-srv-build1 - centos 7, det kommer att finnas en buildbot master och en av arbetarna
vm-srv-build2 - debian 10, för att bygga DEB-paket
vm-srv-build3 - windows 10, för montering, du vet vad för
Vi kommer att samla Rac GUI — ett grafiskt gränssnitt för 1C rac för att hantera ett kluster av servrar. För Linux kommer standardverktyg för varje OS att användas; för att bygga en exe-fil för Windows från ett tcl-skript, använd freewrap.
Installation
GNU / Linux
Det finns tillräckligt med dokumentation på Internet för installation 1,2. Ja, och det orsakar inga speciella problem:
För mästaren:
Naturligtvis skulle det vara mer korrekt att samla in paket för varje OS, men detta ligger utanför artikelns ram. Vi kommer också att utelämna beskrivningen av att sätta upp containrar för arbete, jag kommer bara att notera att jag använder ProxMox VE. Och du kommer också att behöva installera paket för varje axel som krävs för montering (centos: rpmdevtools, etc.; debian: build-essential, dh-make, pbuilder, etc.)
Byggprojekt och buildbot-tjänster kommer att lanseras som en oprivilegierad användare, så du måste skapa ett på alla värdar som deltar i processen:
adduser buildbot
Därefter kommer vi att konfigurera den automatiska lanseringen av tjänster, respektive, på var och en av värdarna (behållare):
Efter detta kan du skapa en kataloginfrastruktur för "arbetare" (på alla värdar), för att göra detta, registrera dig under buildbot-användaren och kör följande kommandon:
På den första värden 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 andra värden 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å arbetarvärdar kan buildbot-worker-tjänsten startas
systemctl start buildbot-worker
MS Windows
Som en "arbetare" för montering under Windows kommer en virtuell maskin med den senaste versionen av Win10 att användas.
För att arbeta behöver du:
När allt ovanstående är installerat kan du installera själva buildboten:
pip install buildbot-worker
Låt oss skapa en arbetskatalog
md c:worker
Och låt oss lansera
buildbot-worker start c:worker
Om allt fungerar (se logg c:workertwistd.log), kan du registrera vår "arbetare" som en tjänst genom att lägga till ett objekt med arbetskatalogen till registret (kommandon körs i powershell som körs som administratör):
Det är allt med "arbetarna", du behöver inte röra dem längre, all kontroll kommer från mästaren.
Installation av guiden
Till att börja med, låt oss skapa infrastrukturen för mastern (på huvudvärden), för att göra detta, registrera dig under buildbot-användaren och kör följande kommandon:
su - buildbot
mkdir /home/buildbot/master
cd ~
buildbot create-master master
För färdiga paket, skapa en builds-katalog
mkdir /home/buildbot/builds
En master.cfg-fil skapades i katalogen /home/buildbot/master/. Den här filen är en python-kod och innehåller en beskrivning av alla mekanismer i systemet; vi kommer att arbeta med den i framtiden.
För att automatisera sammansättningen av paket av olika versioner, för att inte behöva fördjupa sig i koden för filen master.cfg, i huvudskriptet för programmet rac_gui.tcl, lades rader med den aktuella versionen och versionen till i rubriken :
Och baserat på dessa rader kommer buildbot att numrera paketen. För att extrahera data, använd konsolanropet grep. I buildbot kan du helt enkelt inte definiera variabler för "arbetare" (åtminstone jag har inte hittat hur). Detta är vad egenskaper används till. De där. I monteringsprocessen lägger vi till steg för att bestämma versionen och releasen och ställer därför in versions- och releaseegenskaperna. Egenskaper kan ställas in på olika sätt, i det här fallet genom att anropa konsolkommandot:
# Добавим определение версии из основного файла
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"
)
)
Du kan ersätta de resulterande värdena genom att anropa util.Interpolate().
För att ställa in rätt release- och versionsnummer, använd ett vanligt sed-samtal, d.v.s. kommandot ersätter värdena inuti spec-filen med de nödvändiga
Vi kopierar det färdiga sammansatta paketet och arkivet med källor till befälhavaren. Men du kan omedelbart kopiera filer från din arbetsfil till ditt arkiv eller webbplats.
# Скопируем файл на мастер
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")
)
)
Låt oss börja processen med att kopiera de insamlade paketen till hosting via FTP på mastern. För detta ändamål används den manus på tcl.
Det är det med RPM. Låt oss nu börja beskriva algoritmen för att bygga ett DEB-paket. Eftersom processerna för att bygga paket för olika system är oberoende av varandra kommer många steg att upprepas.
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"]))
För ett RPM-paket görs några av följande procedurer av rpm själv under monteringen och beskrivs i specifikationen; för Debian måste du göra det här:
# Поменяем пути к библиотекам
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")]
)
)
I loggen kommer vi att kontrollera att allt är i sin ordning med konfigurationen och att allt fungerar som vanligt. Alla våra arbetare bör nu ansluta, vilket med glädje kommer att rapporteras i loggen »»'/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
Detta slutför installationsprocessen. Du kan se aktuell status via webbgränssnittet. Där du också kan se byggfel, sparka en frusen process om något gick fel osv.
Omedelbart efter lanseringen kan våra hårt arbetande ses via menyn "Byggnader" -> "Arbetare"
Efter att den första byggprocessen är klar (d.v.s. ändringar av Git-förvaret), kommer status för processerna att visas på första sidan.
Om du klickar på önskad rad med musen öppnas en sida med det aktuella läget för denna process, där du kan se vad som händer, vilka fel osv.