Eu precisava configurar o processo de montagem e entrega de pacotes de software do repositório Git para o site. E tendo visto, não muito tempo atrás, aqui no Habr, o artigo sobre o buildbot (o link no final) decidiu tentar e se candidatar a isso.
Como o buildbot é um sistema distribuído, será lógico para cada arquitetura e sistema operacional criar um host de montagem separado. No nosso caso, serão contêineres LXC (no caso do linux) e qemu (no caso do windows):
- vm-srv-build1 - centos 7, haverá um mestre do buildbot e um dos trabalhadores
- vm-srv-build2 - debian 10, para compilação de pacotes DEB
- vm-srv-build3 - windows 10, para montagem, você mesmo entende o que
Coletaremos a GUI do Rac - uma face gráfica do rac 1C para gerenciar um cluster de servidores. No Linux, ferramentas padrão para cada sistema operacional serão usadas, o freewrap é usado para criar um arquivo exe para Windows a partir de um script tcl.
Instalação
GNU / Linux
Para a instalação, a documentação na rede é suficiente 1 , 2 . E isso não causa problemas especiais:
Para o mestre:
pip3 install buildbot pip3 install twisted pip3 install autobahn pip3 install pysqlite3 pip3 install sqlalchemy sqlalchemy-migrate pip3 install buildbot-www buildbot-grid-view buildbot-console-view buildbot-waterfall-view pip3 install python-dateutil
Para os "trabalhadores", isso é suficiente:
pip3 install buildbot-worker
Obviamente, seria mais correto coletar pacotes para cada sistema operacional, mas isso não está incluído no escopo do artigo. Também omitimos a descrição da configuração de contêineres para o trabalho, apenas observo que uso o ProxMox VE. E você também precisa instalar pacotes para cada eixo necessário para a montagem (centos: rpmdevtools, etc .; debian: build-essential, dh-make, pbuilder, etc.)
Os serviços de montagem e buildbot do projeto serão lançados em nome de um usuário sem privilégios, portanto, é necessário criá-lo em todos os hosts envolvidos no processo:
adduser buildbot
Em seguida, configure o lançamento automático de serviços, respectivamente, em cada um dos hosts (contêineres):
Unidade Systemd para executar o assistente:
touch /etc/systemd/buildbot-master.service [Unit] Description=BuildBot master service After=network.target [Service] User=buildbot Group=buildbot WorkingDirectory=/home/buildbot/master ExecStart=/usr/local/bin/buildbot start --nodaemon ExecReload=/bin/kill -HUP $MAINPID [Install] WantedBy=multi-user.target
e "trabalhador"
touch /etc/systemd/buildbot-worker.service [Unit] Description=BuildBot worker service After=network.target [Service]master User=buildbot Group=buildbot WorkingDirectory=/home/buildbot/worker ExecStart=/usr/local/bin/buildbot-worker start --nodaemon [Install] WantedBy=buildbot-master.service
Como todos os scripts (no nosso caso) estão em / usr / local /, você deve escrever o caminho para eles nas variáveis de ambiente:
nano /root/.bash_profile PATH=$PATH:$HOME/.local/bin:$HOME/bin:/usr/local/bin
Depois disso, você pode criar uma infraestrutura de diretório para os "trabalhadores" (em todos os hosts); para isso, registre-se no usuário 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
Em hosts de trabalho, o serviço buildbot-worker pode ser iniciado
systemctl start buildbot-worker
MS Windows
Como uma compilação "funcional" para Windows, será usada uma máquina virtual com a versão mais recente do Win10.
Para trabalhar, você precisa:
Após a instalação de todas as opções acima, você pode instalar o buildbot:
pip install buildbot-worker
Crie um diretório de trabalho
md c:\worker
E corra
buildbot-worker start c:\worker
Se tudo funcionar (consulte o log c: \ worker \ twistd.log), você poderá registrar nosso "trabalhador" como um serviço adicionando um item com o diretório de trabalho ao registro (os comandos são executados no PowerShell executando como administrador):
buildbot_worker_windows_service.exe --user VM-SRV-BUILD3\buildbot --password 123456 --startup auto install New-ItemProperty -path Registry::HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\BuildBot\Parameters -Name directories -PropertyType String -Value c:\worker
E você pode executar um servo
Start-Service buildbot
Isso é tudo com os "trabalhadores", então você não precisa mais tocá-los, toda a gerência é do mestre.
Assistente de instalação
Para começar, criaremos a infraestrutura para o assistente (no host principal), para isso nos registraremos no usuário buildbot e executaremos os seguintes comandos:
su - buildbot mkdir /home/buildbot/master cd ~ buildbot create-master master
Para pacotes concluídos, crie o diretório builds
mkdir /home/buildbot/builds
O arquivo master.cfg foi criado no diretório / home / buildbot / master /. Este arquivo é um código python e contém uma descrição de todos os mecanismos do sistema, continuaremos trabalhando com ele.
nano /home/buildbot/master/master.cfg
import os, re from buildbot.plugins import steps, util, schedulers, worker, changes, reporters c= BuildmasterConfig ={}
Para automatizar a montagem de pacotes de versões diferentes, para que você não precise acessar o código do arquivo master.cfg, no script principal do programa rac_gui.tcl no cabeçalho, são adicionadas linhas com a versão atual e o release:
E com base nessas linhas, o buildbot numerará os pacotes. Para extrair dados, use a chamada grep do console. No buildbot, você simplesmente não pode definir variáveis para "trabalhadores" (em qualquer caso, não encontrei como). Para fazer isso, use propriedades. I.e. no processo de montagem, adicione as etapas para determinar a versão e o release e, em conformidade, defina as propriedades da versão e do release. As propriedades podem ser definidas de várias maneiras, neste caso, uma chamada para um comando do console:
Substitua os valores obtidos chamando util.Interpolate ().
Note-se que, como o host também é usado para montagem manual de pacotes, a montagem ocorrerá ao longo de caminhos padrão.
Para definir os números corretos de versão e versão, use a chamada sed padrão, ou seja, o comando substitui os valores dentro do arquivo de especificação pelos necessários
Copiamos o pacote montado e arquivamos os códigos-fonte para o mestre. Mas você pode copiar imediatamente os arquivos da área de trabalho para o repositório ou site.
No assistente, iniciamos o processo de cópia dos pacotes coletados para a hospedagem FTP. Para fazer isso, use o script tcl.
rac_gui_build_RPM.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.noarch.rpm"), util.Interpolate("--remote-file=uploads/rac-gui/rac-gui-%(prop:version)s-%(prop:release)s.noarch.rpm")] ) ) rac_gui_build_RPM.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.tar.gz"), util.Interpolate("--remote-file=uploads/rac-gui/rac-gui-%(prop:version)s-%(prop:release)s.tar.gz")] ) )
Nele com o RPM terminado. Agora vamos começar a descrição do algoritmo de montagem para o pacote DEB. Como os processos de criação de pacotes para sistemas diferentes são independentes, muitas etapas serão repetidas.
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) )
Para o pacote RPM, parte dos procedimentos a seguir é feita pelo próprio rpm durante a montagem e é descrita dentro da especificação, para o debian você deve fazer isso aqui:
E DEB é feito, agora janelas!
rac_gui_build_WIN = util.BuildFactory() rac_gui_build_WIN.addStep(steps.Git( repourl = 'https://bitbucket.org/svk28/rac-gui.git', haltOnFailure = True, submodules = True, mode='full', workdir='build', progress = True) )
Como o Windows não possui grep e sed (ou existe?), Usaremos o PowerShell
Para notificar sobre o estado do processo de montagem, usaremos e-mail
c['services'] = [] template=u'''\ <h4>Build status: {{ summary }}</h4> <p> Worker used: {{ workername }}</p> {% for step in build['steps'] %} <p> {{ step['name'] }}: {{ step['result'] }}</p> {% endfor %} <p><b> -- The Buildbot</b></p> ''' mailNotifier = reporters.MailNotifier(fromaddr="builder@domain.ru", sendToInterestedUsers=False, mode=('all'), extraRecipients=["admin@domain.ru"], relayhost="mail.domain.ru", smtpPort=587, smtpUser="builder@domain.ru", smtpPassword="******", messageFormatter=reporters.MessageFormatter( template=template, template_type='html', wantProperties=True, wantSteps=True)) c['services'].append(mailNotifier)
Salvamos o arquivo e você pode tentar iniciar o serviço do assistente:
systemctl restart buildbot-master
No log, verificamos que tudo está em ordem com a configuração e tudo funciona normalmente. Todos os nossos funcionários agora devem se conectar, como será relatado com satisfação no log '' '' '' /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
Isso completa o processo de instalação. Você pode visualizar o status atual através da face da web. Onde você também pode ver erros de montagem, iniciar um processo congelado se algo der errado, etc.
Imediatamente após o lançamento de nossos trabalhadores, você pode ver através do menu "Construções" -> "Trabalhadores"

Após a conclusão do primeiro processo de compilação (ou seja, alterações no repositório Git), o estado dos processos aparecerá na primeira página.

Se você pressionar o mouse na linha desejada, uma página será aberta com o estado atual do processo, onde você poderá ver o que está acontecendo, quais erros etc.

Você pode pegar toda a configuração principal aqui import os, re from buildbot.plugins import steps, util, schedulers, worker, changes, reporters c= BuildmasterConfig ={} c['workers'] = [ worker.Worker('CentOS', '123456'), worker.Worker('Debian-10', '123456'), worker.Worker('Windows-10', '123456')] c['protocols'] = {'pb': {'port': 4000}} c['change_source'] = [] c['change_source'].append(changes.GitPoller( repourl = 'https://bitbucket.org/svk28/rac-gui.git', project = 'Rac-GUI', branches = True, pollInterval = 600 ))
: