Musiałem skonfigurować proces składania i dostarczania pakietów oprogramowania z repozytorium Git do witryny. A kiedy nie tak dawno temu zobaczyłem tutaj na Habré artykuł o buildbocie (link na końcu), postanowiłem go wypróbować i zastosować.
Ponieważ buildbot jest systemem rozproszonym, logiczne byłoby utworzenie osobnego hosta kompilacji dla każdej architektury i systemu operacyjnego. W naszym przypadku będą to kontenery LXC (w przypadku Linuksa) oraz qemu (w przypadku Windowsa):
vm-srv-build1 - centos 7, będzie mistrz buildbota i jeden z pracowników
vm-srv-build2 - debian 10, do budowania pakietów DEB
vm-srv-build3 - Windows 10, do montażu, wiesz po co
Zbierzemy Interfejs graficzny Raka — interfejs graficzny dla 1C rac do zarządzania klastrem serwerów. W przypadku systemu Linux zostaną użyte standardowe narzędzia dla każdego systemu operacyjnego; aby zbudować plik exe dla systemu Windows ze skryptu tcl, użyj darmowe zawijanie.
Instalacja
GNU / Linux
W Internecie jest wystarczająca dokumentacja dotycząca instalacji 1,2. Tak i nie powoduje to żadnych specjalnych problemów:
Dla mistrza:
Oczywiście bardziej poprawne byłoby zbieranie pakietów dla każdego systemu operacyjnego, ale wykracza to poza zakres artykułu. Pominiemy też opis rozstawiania kontenerów do pracy, zaznaczę tylko, że korzystam z ProxMox VE. Będziesz także musiał zainstalować pakiety dla każdej osi wymaganej do montażu (centos: obr/mindevtools itp.; debian: build-essential, dh-make, pbuilder itp.)
Projekty kompilacji i usługi buildbota zostaną uruchomione jako użytkownik nieuprzywilejowany, dlatego musisz je utworzyć na wszystkich hostach uczestniczących w procesie:
adduser buildbot
Następnie skonfigurujemy odpowiednio automatyczne uruchamianie usług na każdym z hostów (kontenerów):
Następnie możesz utworzyć infrastrukturę katalogową dla „pracowników” (na wszystkich hostach), w tym celu zarejestruj się jako użytkownik buildbot i uruchom następujące polecenia:
Na pierwszym hoście 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 drugim hoście 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 hostach roboczych można uruchomić usługę buildbot-worker
systemctl start buildbot-worker
MS Windows
Jako „pracownik” do montażu pod Windowsem będzie wykorzystywana maszyna wirtualna z najnowszą wersją Win10.
Do pracy będziesz potrzebować:
Po zainstalowaniu wszystkich powyższych elementów możesz zainstalować samego buildbota:
pip install buildbot-worker
Utwórzmy katalog roboczy
md c:worker
I wystartujmy
buildbot-worker start c:worker
Jeżeli wszystko działa (patrz log c:workerttwistd.log), to możesz zarejestrować naszego „pracownika” jako usługę dodając do rejestru pozycję z katalogiem roboczym (polecenia wykonywane są w PowerShell działającym jako administrator):
To wszystko z „robotnikami”, nie musisz ich dalej dotykać, cała kontrola pochodzi od mistrza.
Konfiguracja kreatora
Na początek stwórzmy infrastrukturę dla mastera (na głównym hoście), w tym celu zarejestruj się jako użytkownik buildbot i uruchom następujące polecenia:
su - buildbot
mkdir /home/buildbot/master
cd ~
buildbot create-master master
W przypadku gotowych pakietów utwórz katalog builds
mkdir /home/buildbot/builds
W katalogu /home/buildbot/master/ utworzono plik master.cfg. Ten plik jest kodem Pythona i zawiera opis wszystkich mechanizmów systemu, będziemy z nim pracować w przyszłości.
Aby zautomatyzować składanie pakietów różnych wersji, tak aby nie trzeba było zagłębiać się w kod pliku master.cfg, w głównym skrypcie programu rac_gui.tcl w nagłówku dodano linie z aktualną wersją i wydaniem :
Na podstawie tych linii buildbot ponumeruje pakiety. Aby wyodrębnić dane, użyj wywołania konsoli grep. W buildbocie po prostu nie można definiować zmiennych dla „pracowników” (przynajmniej nie znalazłem jak). Do tego służą właściwości. Te. W procesie montażu dodajemy kroki pozwalające określić wersję i wydanie oraz odpowiednio ustawić właściwości wersji i wydania. Właściwości można ustawić na różne sposoby, w tym przypadku wywołując komendę konsoli:
# Добавим определение версии из основного файла
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"
)
)
Otrzymane wartości możesz zastąpić wywołując funkcję util.Interpolate().
Aby ustawić prawidłowe numery wydania i wersji, użyj standardowego wywołania sed, tj. polecenie zastępuje wartości znajdujące się w pliku specyfikacji wymaganymi
Kopiujemy gotowy zmontowany pakiet i archiwum ze źródłami do wzorca. Możesz jednak natychmiast skopiować pliki z pliku służbowego do repozytorium lub witryny internetowej.
# Скопируем файл на мастер
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")
)
)
Rozpocznijmy proces kopiowania zebranych pakietów na hosting poprzez FTP na masterze. W tym celu się go używa scenariusz na tcl.
To tyle z RPM. Zacznijmy teraz opisywać algorytm budowania pakietu DEB. Ponieważ procesy budowania pakietów dla różnych systemów są od siebie niezależne, wiele kroków będzie powtarzanych.
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"]))
W przypadku pakietu RPM niektóre z poniższych procedur są wykonywane przez sam pakiet RPM podczas montażu i są opisane w specyfikacji; w przypadku Debiana musisz to zrobić tutaj:
# Поменяем пути к библиотекам
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")]
)
)
Zapisz plik i możesz spróbować uruchomić usługę kreatora:
systemctl restart buildbot-master
W logu sprawdzimy, czy wszystko jest w porządku z konfiguracją i wszystko działa normalnie. Wszyscy nasi pracownicy powinni się teraz połączyć, co zostanie z radością odnotowane w logu »»'/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
To kończy proces konfiguracji. Aktualny status można sprawdzić za pośrednictwem interfejsu internetowego. Gdzie możesz także zobaczyć błędy kompilacji, kopnąć zamrożony proces, jeśli coś poszło nie tak itp.
Natychmiast po uruchomieniu naszych ciężko pracujących pracowników można zobaczyć w menu „Buddy” -> „Robotnicy”
Po zakończeniu pierwszego procesu kompilacji (tj. zmian w repozytorium Git) na pierwszej stronie pojawi się status procesów.
Jeśli klikniesz myszką żądaną linię, otworzy się strona z aktualnym stanem tego procesu, na której możesz zobaczyć, co się dzieje, jakie błędy itp.