Necessitava configurar el procés de muntatge i lliurament de paquets de programari des d'un dipòsit de Git al lloc. I quan vaig veure, no fa tant, aquí a Habré un article sobre buildbot (enllaç al final), vaig decidir provar-lo i aplicar-lo.
Com que buildbot és un sistema distribuït, seria lògic crear un host de compilació independent per a cada arquitectura i sistema operatiu. En el nostre cas, aquests seran contenidors LXC (en el cas de Linux) i qemu (en el cas de Windows):
vm-srv-build1 - centos 7, hi haurà un mestre de buildbot i un dels treballadors
vm-srv-build2 - debian 10, per construir paquets DEB
vm-srv-build3 - Windows 10, per al muntatge, ja sabeu per a què
Recollirem GUI de Rac — una interfície gràfica per a 1C rac per gestionar un clúster de servidors. Per a Linux, s'utilitzaran eines estàndard per a cada sistema operatiu; per crear un fitxer exe per a Windows a partir d'un script tcl, utilitzeu embolcall lliure.
Instal · lació
GNU / Linux
Hi ha prou documentació a Internet per a la instal·lació 1,2. Sí, i no causa cap problema especial:
Per al mestre:
Per descomptat, seria més correcte recopilar paquets per a cada sistema operatiu, però això està fora de l'abast de l'article. També ometrem la descripció de la configuració de contenidors per a la feina, només notaré que faig servir ProxMox VE. I també haureu d'instal·lar paquets per a cada eix necessari per al muntatge (centos: rpmdevtools, etc.; debian: build-essential, dh-make, pbuilder, etc.)
Els projectes de creació i els serveis de buildbot es llançaran com a usuari sense privilegis, de manera que cal que en creeu un a tots els amfitrions que participen en el procés:
adduser buildbot
A continuació, configurarem el llançament automàtic de serveis, respectivament, a cadascun dels amfitrions (contenidors):
Després d'això, podeu crear una infraestructura de directoris per als "treballadors" (a tots els amfitrions), per fer-ho, registreu-vos a l'usuari de buildbot i executeu les ordres següents:
Al primer 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
Al segon 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
Als amfitrions de treball, es pot iniciar el servei buildbot-worker
systemctl start buildbot-worker
MS Windows
Com a "treballador" per al muntatge sota Windows, s'utilitzarà una màquina virtual amb la darrera versió de Win10.
Per treballar cal:
Després d'instal·lar tot l'anterior, podeu instal·lar el mateix buildbot:
pip install buildbot-worker
Creem un directori de treball
md c:worker
I anem a posar en marxa
buildbot-worker start c:worker
Si tot funciona (vegeu el registre c:workertwistd.log), aleshores podeu registrar el nostre "treballador" com a servei afegint un element amb el directori de treball al registre (les ordres s'executen a Powershell que s'executa com a administrador):
Això és tot amb els "treballadors", no cal tocar-los més, tot el control ve del mestre.
Configuració de l'assistent
Per començar, creem la infraestructura per al mestre (a l'amfitrió principal), per fer-ho, registreu-vos a l'usuari de buildbot i executeu les ordres següents:
su - buildbot
mkdir /home/buildbot/master
cd ~
buildbot create-master master
Per als paquets ja fets, creeu un directori de compilació
mkdir /home/buildbot/builds
Es va crear un fitxer master.cfg al directori /home/buildbot/master/. Aquest fitxer és un codi Python i conté una descripció de tots els mecanismes del sistema; treballarem amb ell en el futur.
Per automatitzar el muntatge de paquets de diferents versions, per no haver d'aprofundir en el codi del fitxer master.cfg, a l'script principal del programa rac_gui.tcl s'han afegit línies amb la versió actual i el llançament a la capçalera. :
I en funció d'aquestes línies, buildbot numerarà els paquets. Per extreure dades, utilitzeu la trucada grep de consola. A buildbot simplement no podeu definir variables per a "treballadors" (almenys, no he trobat com). Per a això s'utilitzen les propietats. Aquells. En el procés de muntatge, afegim passos per determinar la versió i el llançament i, en conseqüència, establim les propietats de versió i llançament. Les propietats es poden establir de diverses maneres, en aquest cas cridant l'ordre de la consola:
# Добавим определение версии из основного файла
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"
)
)
Podeu substituir els valors resultants cridant a util.Interpolate().
Per establir els números de versió i versió correctes, utilitzeu una trucada sed estàndard, és a dir. l'ordre substitueix els valors dins del fitxer d'especificacions amb els requerits
Copiem el paquet muntat acabat i l'arxiu amb les fonts al mestre. Però podeu copiar immediatament fitxers del vostre fitxer de treball al vostre dipòsit o lloc web.
# Скопируем файл на мастер
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")
)
)
Comencem el procés de còpia dels paquets recollits a l'allotjament mitjançant FTP al mestre. Amb aquesta finalitat s'utilitza guió a tcl.
Això és tot amb RPM. Ara comencem a descriure l'algorisme per construir un paquet DEB. Com que els processos per construir paquets per a diferents sistemes són independents entre si, es repetiran molts passos.
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"]))
Per a un paquet RPM, alguns dels procediments següents els fa el propi rpm durant el muntatge i es descriuen dins de l'especificació; per a Debian, ho heu de fer aquí:
# Поменяем пути к библиотекам
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")]
)
)
Deseu el fitxer i podeu provar d'iniciar el servei d'assistent:
systemctl restart buildbot-master
Al registre comprovarem que tot està en ordre amb la configuració i tot funciona amb normalitat. Tots els nostres treballadors s'haurien de connectar ara, cosa que s'informarà feliçment al registre »»'/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
Això completa el procés de configuració. Podeu veure l'estat actual mitjançant la interfície web. On també podeu veure errors de compilació, iniciar un procés congelat si alguna cosa ha fallat, etc.
Immediatament després del llançament, els nostres treballadors es poden veure a través del menú "Estructures" -> "Treballadors"
Un cop finalitzat el primer procés de compilació (és a dir, els canvis al repositori Git), l'estat dels processos apareixerà a la primera pàgina.
Si feu clic a la línia desitjada amb el ratolí, s'obrirà una pàgina amb l'estat actual d'aquest procés, on podreu veure què està passant, quins errors, etc.
Tota la configuració de l'assistent es pot trobar aquí