Ich musste den Prozess zum Erstellen und Bereitstellen von Softwarepaketen aus einem Git-Repository an die Site einrichten. Und als ich vor nicht allzu langer Zeit hier auf Habré einen Artikel über Buildbot sah (Link am Ende), beschloss ich, es auszuprobieren und anzuwenden.
Da es sich bei Buildbot um ein verteiltes System handelt, wäre es logisch, für jede Architektur und jedes Betriebssystem einen separaten Build-Host zu erstellen. In unserem Fall sind dies LXC-Container (im Fall von Linux) und qemu (im Fall von Windows):
vm-srv-build1 – Centos 7, es wird einen Buildbot-Master und einen der Arbeiter geben
vm-srv-build2 – Debian 10, zum Erstellen von DEB-Paketen
vm-srv-build3 – Windows 10, für die Montage, Sie wissen, wofür
Wir werden sammeln Rac-GUI — eine grafische Oberfläche für 1C RAC zur Verwaltung eines Serverclusters. Für Linux werden Standardtools für jedes Betriebssystem verwendet. Um eine Exe-Datei für Windows aus einem TCL-Skript zu erstellen, verwenden Sie Freewrap.
Einstellung
GNU / Linux
Für die Installation gibt es im Internet ausreichend Dokumentation 1,2. Ja, und es verursacht keine besonderen Probleme:
Für den Meister:
Natürlich wäre es richtiger, Pakete für jedes Betriebssystem zu sammeln, aber das würde den Rahmen des Artikels sprengen. Auch auf die Beschreibung der Einrichtung von Containern für die Arbeit verzichten wir, ich verweise lediglich darauf, dass ich ProxMox VE verwende. Außerdem müssen Sie Pakete für jede für die Montage erforderliche Achse installieren (Centos: rpmdevtools usw.; Debian: build-essential, dh-make, pbuilder usw.).
Build-Projekte und Buildbot-Dienste werden als nicht privilegierter Benutzer gestartet, daher müssen Sie einen auf allen am Prozess beteiligten Hosts erstellen:
adduser buildbot
Als nächstes konfigurieren wir den automatischen Start von Diensten auf jedem der Hosts (Container):
Danach können Sie eine Verzeichnisinfrastruktur für „Worker“ (auf allen Hosts) erstellen. Registrieren Sie sich dazu unter dem Buildbot-Benutzer und führen Sie die folgenden Befehle aus:
Auf dem ersten 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
Auf dem zweiten 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
Auf Worker-Hosts kann der Buildbot-Worker-Dienst gestartet werden
systemctl start buildbot-worker
MS Windows
Als „Worker“ für die Montage unter Windows wird eine virtuelle Maschine mit der neuesten Version von Win10 verwendet.
Zum Arbeiten benötigen Sie:
Nachdem alles oben Genannte installiert ist, können Sie den Buildbot selbst installieren:
pip install buildbot-worker
Lassen Sie uns ein Arbeitsverzeichnis erstellen
md c:worker
Und lasst uns starten
buildbot-worker start c:worker
Wenn alles funktioniert (siehe Protokoll c:workertwistd.log), können Sie unseren „Worker“ als Dienst registrieren, indem Sie ein Element mit dem Arbeitsverzeichnis zur Registrierung hinzufügen (Befehle werden in Powershell ausgeführt, die als Administrator ausgeführt wird):
Das ist alles mit den „Arbeitern“, man muss sie nicht weiter anfassen, die gesamte Kontrolle kommt vom Meister.
Assistent zur Einrichtung
Erstellen wir zunächst die Infrastruktur für den Master (auf dem Haupthost), registrieren Sie sich dazu unter dem Buildbot-Benutzer und führen Sie die folgenden Befehle aus:
su - buildbot
mkdir /home/buildbot/master
cd ~
buildbot create-master master
Erstellen Sie für vorgefertigte Pakete ein Build-Verzeichnis
mkdir /home/buildbot/builds
Im Verzeichnis /home/buildbot/master/ wurde eine Datei „master.cfg“ erstellt. Diese Datei ist ein Python-Code und enthält eine Beschreibung aller Mechanismen des Systems; wir werden in Zukunft damit arbeiten.
Um die Zusammenstellung von Paketen unterschiedlicher Versionen zu automatisieren und nicht in den Code der Datei master.cfg eintauchen zu müssen, wurden im Header des Hauptskripts des Programms rac_gui.tcl Zeilen mit der aktuellen Version und dem aktuellen Release hinzugefügt:
Und basierend auf diesen Zeilen nummeriert Buildbot die Pakete. Um Daten zu extrahieren, verwenden Sie den Konsolen-Grep-Aufruf. In Buildbot können Sie einfach keine Variablen für „Arbeiter“ definieren (zumindest habe ich nicht herausgefunden, wie das geht). Dafür werden Eigenschaften verwendet. Diese. Im Montageprozess fügen wir Schritte hinzu, um die Version und das Release zu bestimmen und dementsprechend die Versions- und Release-Eigenschaften festzulegen. Eigenschaften können auf verschiedene Arten festgelegt werden, in diesem Fall durch Aufrufen des Konsolenbefehls:
# Добавим определение версии из основного файла
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"
)
)
Sie können die resultierenden Werte ersetzen, indem Sie util.Interpolate() aufrufen.
Hierbei ist zu beachten, dass die Zusammenstellung auf Standardpfaden erfolgt, da der Host auch für die manuelle Zusammenstellung von Paketen verwendet wird.
Um die richtigen Release- und Versionsnummern festzulegen, verwenden Sie einen Standard-Sed-Aufruf, d. h. Der Befehl ersetzt die Werte in der Spezifikationsdatei durch die erforderlichen
Wir kopieren das fertig zusammengestellte Paket und das Archiv mit Quellen auf den Master. Sie können Dateien jedoch sofort aus Ihrer Arbeitsdatei in Ihr Repository oder Ihre Website kopieren.
# Скопируем файл на мастер
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")
)
)
Beginnen wir mit dem Kopieren der gesammelten Pakete auf das Hosting per FTP auf dem Master. Zu diesem Zweck wird es verwendet Skript auf tcl.
Das war's mit RPM. Beginnen wir nun mit der Beschreibung des Algorithmus zum Erstellen eines DEB-Pakets. Da die Prozesse zum Erstellen von Paketen für verschiedene Systeme unabhängig voneinander sind, werden viele Schritte wiederholt.
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 ein RPM-Paket werden einige der folgenden Vorgänge vom RPM selbst während der Assemblierung durchgeführt und sind in der Spezifikation beschrieben; für Debian müssen Sie dies hier tun:
# Поменяем пути к библиотекам
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")]
)
)
Speichern Sie die Datei und Sie können versuchen, den Assistentendienst zu starten:
systemctl restart buildbot-master
Im Protokoll überprüfen wir, ob mit der Konfiguration alles in Ordnung ist und alles normal funktioniert. Alle unsere Arbeiter sollten sich jetzt verbinden, was gerne im Protokoll »»'/home/buildbot/master/twistd.log»»' gemeldet wird:
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
Damit ist der Einrichtungsvorgang abgeschlossen. Den aktuellen Status können Sie über die Weboberfläche einsehen. Hier können Sie auch Build-Fehler sehen, einen eingefrorenen Prozess starten, wenn etwas schief gelaufen ist usw.
Unmittelbar nach dem Start können unsere fleißigen Arbeiter über das Menü „Builds“ -> „Workers“ eingesehen werden.
Nachdem der erste Build-Prozess abgeschlossen ist (d. h. Änderungen am Git-Repository), wird der Status der Prozesse auf der ersten Seite angezeigt.
Wenn Sie mit der Maus auf die gewünschte Zeile klicken, öffnet sich eine Seite mit dem aktuellen Stand dieses Vorgangs, auf der Sie sehen können, was passiert, welche Fehler usw. vorliegen.
Die gesamte Assistentenkonfiguration finden Sie hier