Potřeboval jsem nastavit proces sestavování a dodávání softwarových balíků z úložiště Git na web. A když jsem, není to tak dávno, co jsem tady na Habré viděl článek o buildbotovi (odkaz na konci), rozhodl jsem se to vyzkoušet a aplikovat.
Protože buildbot je distribuovaný systém, bylo by logické vytvořit samostatného hostitele sestavení pro každou architekturu a operační systém. V našem případě to budou kontejnery LXC (v případě Linuxu) a qemu (v případě Windows):
vm-srv-build1 - centos 7, bude zde buildbot master a jeden z pracovníků
vm-srv-build2 - debian 10, pro sestavování DEB balíčků
vm-srv-build3 - windows 10, pro montáž, víte na co
Budeme sbírat Rac GUI — grafické rozhraní pro 1C rac pro správu clusteru serverů. Pro Linux budou použity standardní nástroje pro každý OS, pro sestavení exe souboru pro Windows ze skriptu tcl použijte freewrap.
Instalace
GNU / Linux
Na internetu je k instalaci dostatek dokumentace 1,2. Ano a nezpůsobuje žádné zvláštní problémy:
Pro mistra:
Samozřejmě by bylo správnější sbírat balíčky pro každý OS, ale to je nad rámec článku. Vynecháme i popis nastavování kontejnerů pro práci, podotýkám pouze, že používám ProxMox VE. A také budete muset nainstalovat balíčky pro každou osu požadovanou pro sestavení (centos: rpmdevtools atd.; debian: build-essential, dh-make, pbuilder atd.)
Sestavovací projekty a služby buildbotů budou spuštěny jako neprivilegovaný uživatel, takže je musíte vytvořit na všech hostitelích účastnících se procesu:
adduser buildbot
Dále nakonfigurujeme automatické spouštění služeb na každém z hostitelů (kontejnerů):
Poté můžete vytvořit adresářovou infrastrukturu pro „pracovníky“ (na všech hostitelích), k tomu se zaregistrujte pod uživatelem buildbot a spusťte následující příkazy:
Na prvním hostiteli 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
Na druhém hostiteli 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
Na pracovních hostitelích lze spustit službu buildbot-worker
systemctl start buildbot-worker
MS Windows
Jako „pracovník“ pro sestavení pod Windows bude použit virtuální stroj s nejnovější verzí Win10.
K práci budete potřebovat:
Po instalaci všeho výše uvedeného můžete nainstalovat samotného buildbota:
pip install buildbot-worker
Vytvoříme pracovní adresář
md c:worker
A jdeme na start
buildbot-worker start c:worker
Pokud vše funguje (viz log c:workertwistd.log), můžete našeho „pracovníka“ zaregistrovat jako službu přidáním položky s pracovním adresářem do registru (příkazy se spouštějí v powershell běžícím jako správce):
To je vše s „pracovníky“, nemusíte se jich dále dotýkat, veškeré ovládání pochází od mistra.
Nastavení průvodce
Začněme tím, že vytvoříme infrastrukturu pro master (na hlavním hostiteli), za tím účelem se zaregistrujte pod uživatelem buildbot a spusťte následující příkazy:
su - buildbot
mkdir /home/buildbot/master
cd ~
buildbot create-master master
Pro hotové balíčky vytvořte adresář sestavení
mkdir /home/buildbot/builds
V adresáři /home/buildbot/master/ byl vytvořen soubor master.cfg. Tento soubor je kód pythonu a obsahuje popis všech mechanismů systému, budeme s ním v budoucnu pracovat.
Pro automatizaci sestavování balíčků různých verzí, abyste se nemuseli vrtat v kódu souboru master.cfg, byly v hlavním skriptu programu rac_gui.tcl v záhlaví přidány řádky s aktuální verzí a vydáním. :
A na základě těchto řádků bude buildbot očíslovat balíčky. Chcete-li extrahovat data, použijte volání konzoly grep. V buildbotu prostě nemůžete definovat proměnné pro „pracovníky“ (alespoň jsem nenašel jak). K tomu slouží vlastnosti. Tito. V procesu sestavení přidáváme kroky k určení verze a vydání a podle toho nastavujeme vlastnosti verze a vydání. Vlastnosti lze nastavit různými způsoby, v tomto případě voláním příkazu konzoly:
# Добавим определение версии из основного файла
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"
)
)
Výsledné hodnoty můžete nahradit voláním util.Interpolate().
Hotový sestavený balíček a archiv se zdroji zkopírujeme na master. Ale můžete okamžitě kopírovat soubory z vašeho pracovního souboru do vašeho úložiště nebo webové stránky.
# Скопируем файл на мастер
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")
)
)
Začněme proces kopírování sebraných balíčků na hosting přes FTP na masteru. K tomuto účelu se používá skript na tcl.
To je vše s RPM. Nyní začněme popisovat algoritmus pro sestavení balíčku DEB. Vzhledem k tomu, že procesy vytváření balíčků pro různé systémy jsou na sobě nezávislé, mnoho kroků se bude opakovat.
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"]))
U balíčku RPM jsou některé z následujících procedur prováděny samotným rpm během sestavování a jsou popsány uvnitř specifikace; pro Debian to musíte udělat zde:
# Поменяем пути к библиотекам
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")]
)
)
Uložte soubor a můžete zkusit spustit službu průvodce:
systemctl restart buildbot-master
V logu zkontrolujeme, že je vše v pořádku s konfigurací a vše funguje normálně. Všichni naši pracovníci by se nyní měli připojit, což bude šťastně hlášeno v protokolu »»'/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
Tím je proces nastavení dokončen. Aktuální stav můžete sledovat přes webové rozhraní. Kde můžete také vidět chyby sestavení, nakopnout zmrazený proces, pokud se něco pokazilo atd.
Ihned po spuštění si naši pracanti můžete prohlédnout v nabídce „Builds“ -> „Workers“
Po dokončení prvního procesu sestavení (tj. změn v repozitáři Git) se stav procesů zobrazí na první stránce.
Pokud kliknete myší na požadovaný řádek, otevře se stránka s aktuálním stavem tohoto procesu, kde vidíte, co se děje, jaké chyby atd.