Jeg trengte å sette opp prosessen med å sette sammen og levere programvarepakker fra et Git-lager til nettstedet. Og da jeg så, for ikke så lenge siden, her på Habré en artikkel om buildbot (lenke på slutten), bestemte jeg meg for å prøve den og bruke den.
Siden buildbot er et distribuert system, ville det være logisk å lage en separat byggevert for hver arkitektur og operativsystem. I vårt tilfelle vil disse være LXC-beholdere (i tilfelle av Linux) og qemu (i tilfelle av Windows):
vm-srv-build1 - centos 7, det vil være en buildbot-mester og en av arbeiderne
vm-srv-build2 - debian 10, for å bygge DEB-pakker
vm-srv-build3 - windows 10, for montering, vet du hva for
Vi skal samle Rac GUI — et grafisk grensesnitt for 1C rac for å administrere en serverklynge. For Linux vil standardverktøy for hvert OS brukes; for å bygge en exe-fil for Windows fra et tcl-skript, bruk freewrap.
Installasjon
GNU / Linux
Det er nok dokumentasjon på Internett for installasjon 1,2. Ja, og det forårsaker ingen spesielle problemer:
For mesteren:
Selvfølgelig ville det være mer riktig å samle pakker for hvert OS, men dette er utenfor rammen av artikkelen. Vi kommer også til å utelate beskrivelsen av oppsett av containere for arbeid, jeg vil kun legge merke til at jeg bruker ProxMox VE. Og du må også installere pakker for hver akse som kreves for montering (centos: rpmdevtools, etc.; debian: build-essential, dh-make, pbuilder, etc.)
Byggprosjekter og buildbot-tjenester vil bli lansert som en uprivilegert bruker, så du må opprette en på alle verter som deltar i prosessen:
adduser buildbot
Deretter vil vi konfigurere den automatiske lanseringen av tjenester, henholdsvis på hver av vertene (beholdere):
Etter dette kan du opprette en kataloginfrastruktur for "arbeidere" (på alle verter), for å gjøre dette, registrer deg under buildbot-brukeren og kjør 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å arbeiderverter kan buildbot-worker-tjenesten startes
systemctl start buildbot-worker
MS Windows
Som en "arbeider" for montering under Windows, vil en virtuell maskin med den nyeste versjonen av Win10 bli brukt.
For å jobbe trenger du:
Etter at alt det ovennevnte er installert, kan du installere selve buildboten:
pip install buildbot-worker
La oss lage en arbeidskatalog
md c:worker
Og la oss lansere
buildbot-worker start c:worker
Hvis alt fungerer (se logg c:workertwistd.log), så kan du registrere vår "arbeider" som en tjeneste ved å legge til et element med arbeidskatalogen til registeret (kommandoer utføres i powershell som kjører som administrator):
Det er alt med "arbeiderne", du trenger ikke å røre dem lenger, all kontroll kommer fra mesteren.
Veiviseroppsett
Til å begynne med, la oss lage infrastrukturen for masteren (på hovedverten), for å gjøre dette, registrer deg under buildbot-brukeren og kjør følgende kommandoer:
su - buildbot
mkdir /home/buildbot/master
cd ~
buildbot create-master master
For ferdige pakker, opprett en build-katalog
mkdir /home/buildbot/builds
En master.cfg-fil ble opprettet i katalogen /home/buildbot/master/. Denne filen er en python-kode og inneholder en beskrivelse av alle mekanismene i systemet; vi vil jobbe med den i fremtiden.
For å automatisere sammenstillingen av pakker av forskjellige versjoner, for ikke å måtte fordype seg i koden til master.cfg-filen, i hovedskriptet til rac_gui.tcl-programmet, ble linjer med gjeldende versjon og utgivelse lagt til i overskriften :
Og basert på disse linjene vil buildbot nummerere pakkene. For å trekke ut data, bruk konsollen grep-kallet. I buildbot kan du ganske enkelt ikke definere variabler for "arbeidere" (i det minste har jeg ikke funnet hvordan). Det er dette egenskapene brukes til. De. I monteringsprosessen legger vi til trinn for å bestemme versjonen og utgivelsen, og deretter angi versjons- og utgivelsesegenskapene. Egenskaper kan settes på forskjellige måter, i dette tilfellet ved å ringe konsollkommandoen:
# Добавим определение версии из основного файла
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 erstatte de resulterende verdiene ved å ringe util.Interpolate().
For å angi riktige utgivelses- og versjonsnumre, bruk et standard sed-anrop, dvs. kommandoen erstatter verdiene inne i spesifikasjonsfilen med de nødvendige
Vi kopierer den ferdige sammensatte pakken og arkivet med kilder til mesteren. Men du kan umiddelbart kopiere filer fra arbeidsfilen din til depotet eller nettstedet ditt.
# Скопируем файл на мастер
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 innsamlede pakkene til hostingen via FTP på masteren. Til dette formålet brukes den manus på tcl.
Det er det med RPM. La oss nå begynne å beskrive algoritmen for å bygge en DEB-pakke. Siden prosessene for å bygge pakker for ulike systemer er uavhengige av hverandre, vil mange trinn gjentas.
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"]))
For en RPM-pakke gjøres noen av følgende prosedyrer av selve rpm under montering og er beskrevet i spesifikasjonen; for Debian må du gjøre det 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")]
)
)
Lagre filen og du kan prøve å starte veivisertjenesten:
systemctl restart buildbot-master
I loggen vil vi sjekke at alt er i orden med konfigurasjonen og at alt fungerer som normalt. Alle våre arbeidere skal nå koble seg til, noe som gjerne vil bli rapportert 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
Dette fullfører oppsettsprosessen. Du kan se gjeldende status via nettgrensesnittet. Hvor du også kan se byggefeil, sparke en frossen prosess hvis noe gikk galt, osv.
Umiddelbart etter lanseringen kan våre hardtarbeidere ses gjennom menyen "Bygger" -> "Arbeidere"
Etter at den første byggeprosessen er fullført (dvs. endringer i Git-depotet), vil statusen til prosessene vises på den første siden.
Hvis du klikker på ønsket linje med musen, åpnes en side med gjeldende status for denne prosessen, hvor du kan se hva som skjer, hvilke feil osv.