Necesitaba configurar o proceso de montaxe e entrega de paquetes de software desde un repositorio de Git ao sitio. E cando vin, non hai moito tempo, aquí en Habré un artigo sobre buildbot (enlace ao final), decidín probalo e aplicalo.
Dado que buildbot é un sistema distribuído, sería lóxico crear un host de compilación separado para cada arquitectura e sistema operativo. No noso caso, estes serán contedores LXC (no caso de Linux) e qemu (no caso de Windows):
vm-srv-build1 - centos 7, haberá un mestre de buildbot e un dos traballadores
vm-srv-build2 - debian 10, para construír paquetes DEB
vm-srv-build3 - Windows 10, para a montaxe, xa sabes para que
Imos recoller GUI de Rac — unha interface gráfica para 1C rac para xestionar un clúster de servidores. Para Linux, utilizaranse ferramentas estándar para cada sistema operativo; para crear un ficheiro exe para Windows a partir dun script tcl, use envoltura libre.
Instalación
GNU / Linux
Hai documentación suficiente en Internet para a instalación 1,2. Si, e non causa ningún problema especial:
Para o mestre:
Por suposto, sería máis correcto recoller paquetes para cada sistema operativo, pero isto está fóra do alcance do artigo. Tamén omitiremos a descrición da configuración de contedores para o traballo, só notarei que uso ProxMox VE. E tamén terás que instalar paquetes para cada eixe necesario para a montaxe (centos: rpmdevtools, etc.; debian: build-essential, dh-make, pbuilder, etc.)
Os proxectos de compilación e os servizos de buildbot lanzaranse como un usuario sen privilexios, polo que debes crear un en todos os hosts que participen no proceso:
adduser buildbot
A continuación, configuraremos o lanzamento automático dos servizos, respectivamente, en cada un dos hosts (contedores):
Despois diso, pode crear unha infraestrutura de directorios para "traballadores" (en todos os hosts), para facelo, rexístrese no usuario de buildbot e execute os seguintes comandos:
No primeiro 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
No segundo 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
Nos hosts de traballo pódese iniciar o servizo buildbot-worker
systemctl start buildbot-worker
MS Windows
Como "traballador" para a montaxe en Windows, empregarase unha máquina virtual coa última versión de Win10.
Para traballar necesitarás:
Despois de instalar todo o anterior, podes instalar o propio buildbot:
pip install buildbot-worker
Imos crear un directorio de traballo
md c:worker
E lanzamos
buildbot-worker start c:worker
Se todo funciona (consulta o rexistro c:workertwistd.log), entón podes rexistrar o noso "traballador" como servizo engadindo un elemento co directorio de traballo ao rexistro (os comandos execútanse en Powershell executando como administrador):
Iso é todo cos "traballadores", non tes que tocarlles máis, todo o control vén do mestre.
Configuración do asistente
Para comezar, imos crear a infraestrutura para o mestre (no host principal), para facelo, rexístrese no usuario de buildbot e execute os seguintes comandos:
su - buildbot
mkdir /home/buildbot/master
cd ~
buildbot create-master master
Para paquetes preparados, cree un directorio de compilacións
mkdir /home/buildbot/builds
Creouse un ficheiro master.cfg no directorio /home/buildbot/master/. Este ficheiro é un código Python e contén unha descrición de todos os mecanismos do sistema; traballaremos con el no futuro.
Para automatizar a montaxe de paquetes de diferentes versións, para non ter que afondar no código do ficheiro master.cfg, no script principal do programa rac_gui.tcl engadíronse na cabeceira liñas coa versión e release actual. :
E en función destas liñas, buildbot numerará os paquetes. Para extraer datos, use a chamada grep da consola. En buildbot simplemente non pode definir variables para "traballadores" (polo menos, non atopei como). Para iso se utilizan as propiedades. Eses. No proceso de montaxe, engadimos pasos para determinar a versión e o lanzamento e, en consecuencia, establecer as propiedades da versión e do lanzamento. As propiedades pódense establecer de varias maneiras, neste caso chamando ao comando da 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"
)
)
Podes substituír os valores resultantes chamando a util.Interpolate().
Para establecer os números de versión e versión correctos, use unha chamada sed estándar, é dicir. o comando substitúe os valores dentro do ficheiro de especificacións polos necesarios
Copiamos o paquete montado rematado e o arquivo coas fontes ao mestre. Pero pode copiar inmediatamente ficheiros do seu ficheiro de traballo ao seu repositorio ou sitio 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")
)
)
Comecemos o proceso de copia dos paquetes recollidos no hospedaxe mediante FTP no mestre. Para este fin úsase guión en tcl.
Iso é todo con RPM. Agora imos comezar a describir o algoritmo para construír un paquete DEB. Dado que os procesos para construír paquetes para diferentes sistemas son independentes entre si, repetiranse moitos pasos.
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"]))
Para un paquete RPM, algúns dos seguintes procedementos son feitos polo propio rpm durante a montaxe e descríbense dentro da especificación; para Debian, tes que facelo 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")]
)
)
Garda o ficheiro e podes tentar iniciar o servizo de asistente:
systemctl restart buildbot-master
No rexistro comprobaremos que todo está en orde coa configuración e que todo funciona normalmente. Todos os nosos traballadores deberían conectarse agora, o que estará felizmente informado no rexistro »»'/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
Isto completa o proceso de configuración. Podes ver o estado actual a través da interface web. Onde tamén podes ver erros de compilación, iniciar un proceso conxelado se algo saíu mal, etc.
Inmediatamente despois do lanzamento, os nosos traballadores poden verse a través do menú "Construcións" -> "Traballadores"
Despois de completar o primeiro proceso de compilación (é dicir, cambios no repositorio de Git), o estado dos procesos aparecerá na primeira páxina.
Se fai clic co rato na liña desexada, abrirase unha páxina co estado actual deste proceso, onde se pode ver o que está a suceder, que erros, etc.
A configuración completa do asistente pódese atopar aquí