Un ejemplo de implementación de la integración continua con BuildBot

Un ejemplo de implementación de la integración continua con BuildBot
(Imagen de informatizador en pixabay)

Hi!

Mi nombre es Evgeniy Cherkin, Soy programador en un equipo de desarrollo en una empresa minera. Polimetal.

Al iniciar cualquier proyecto grande, comienza a pensar: "¿Qué software es mejor utilizar para darle servicio?" Un proyecto de TI pasa por varias etapas antes de lanzar la siguiente versión. Es bueno que la cadena de estas etapas esté automatizada. El proceso automatizado de lanzar una nueva versión de un proyecto de TI se llama Integración continua. ConstruirBot resultó ser un buen asistente para nosotros en la implementación de este proceso.

En este artículo decidí ofrecer una visión general de las posibilidades. ConstruirBot. ¿De qué es capaz este software? ¿Cómo acercarse a él y cómo construir una RELACIÓN DE TRABAJO EFECTIVA normal con él? Puede aplicar nuestra experiencia usted mismo creando un servicio funcional para construir y probar su proyecto en su máquina.

contenido

contenido

1. ¿Por qué BuildBot?
2. Concepto liderado por BuildMaster
3. Instalación
4. Primeros pasos

5. Configuración. Receta paso a paso

5.1 Configuración maestra de compilación
5.2 trabajadores
5.3 cambiar_fuente
5.4 programadores

5.5 Construir fábrica
5.6 constructores

6. Ejemplo de configuración propia

6.1 De camino a tu master.cfg
6.2 Trabajando con svn
6.3 Carta a usted: los periodistas están autorizados a declarar

¡Lo hicimos! Felicidades

1. ¿Por qué BuildBot?

Anteriormente en habr-e encontré artículos sobre implementación. Integración continua utilizando ConstruirBot. Por ejemplo, este Lo encontré más informativo. Hay otro ejemplo - más simple. Estos artículos se pueden condimentar. ejemplo del manualY это después de eso, en inglés. El cupé es un buen punto de partida. Después de leer estos artículos, probablemente querrás inmediatamente algo en ConstruirBot para hacer

¡Detener! ¿Alguien realmente lo ha usado en sus proyectos? resulta que si muchos lo aplicaban en sus tareas. Puede ser encontrado ejemplos utilizar ConstruirBot y en archivos de códigos de Google.

Entonces, ¿cuál es la lógica de que la gente utilice Construir bot? Después de todo, existen otras herramientas: Control de crucero и Jenkins. Responderé de esta manera. Para la mayoría de las tareas Jenkins y la verdad será suficiente. A su momento, ConstruirBot - más adaptable, mientras que los problemas se resuelven allí tan simplemente como en Jenkins. La decisión es tuya. Pero ya que estamos buscando una herramienta para un proyecto objetivo en desarrollo, ¿por qué no elegir una que permita, a partir de pasos simples, obtener un sistema de compilación que tenga interactividad y una interfaz única?

Para aquellos cuyo proyecto objetivo está escrito en Python, surge la pregunta: "¿Por qué no elegir un sistema de integración que tenga una interfaz clara en términos del lenguaje utilizado en el proyecto?" Y ahora es el momento de presentar los beneficios. ConstruirBot.

Entonces, nuestro “cuarteto instrumental”. Por mi parte, he identificado cuatro características ConstruirBot:

  1. Es un framework de código abierto bajo licencia GPL.
  2. Este es el uso de Python como herramienta de configuración y descripción de las acciones requeridas.
  3. Esta es una oportunidad para recibir una respuesta de la máquina en la que se realiza el montaje.
  4. Estos son, finalmente, los requisitos mínimos para un Anfitrión. La implementación requiere Python y Twisted, y no requiere una máquina virtual ni una máquina Java.

2. Concepto liderado por BuildMaster

Un ejemplo de implementación de la integración continua con BuildBot

Lo central para la arquitectura de distribución de tareas es Construir Maestro. Es un servicio que:

  • realiza un seguimiento cambios en el árbol de fuentes del proyecto
  • envía Comandos que debe ejecutar el servicio Worker para construir el proyecto y probarlo.
  • notifica usuarios sobre los resultados de las acciones tomadas

Construir Maestro configurado mediante archivo maestro.cfg. Este archivo está en la raíz. Construir Maestro. Más adelante mostraré cómo se crea esta raíz. El archivo en sí maestro.cfg contiene un script en Python que utiliza llamadas ConstruirBot.

Siguiente objeto más importante ConstruirBot Tiene un nombre Trabajador. Este servicio se puede iniciar en otro host con un sistema operativo diferente, o tal vez en aquel donde Construir Maestro. También puede existir en un entorno virtual especialmente preparado con sus propios paquetes y variables. Estos entornos virtuales se pueden preparar utilizando utilidades de Python como entorno virtual, venv.

Construir Maestro transmite comandos a todos Trabajador-y, y él, a su vez, los cumple. Es decir, resulta que el proceso de construcción y prueba de un proyecto puede continuar. Trabajador-e ejecutando Windows y en otro Worker ejecutando Linux.

Pagar Los códigos fuente del proyecto ocurren en cada Trabajador-e

3. Instalación

Entonces vamos. Usaré Ubuntu 18.04 como host. le colocaré uno Construir Maestro-a y uno Trabajador-a. Pero primero necesitas instalar python3.7:

sudo apt-get update
sudo apt-get install python3.7

Para aquellos que necesitan python3.7.2 en lugar de 3.7.1, pueden hacer lo siguiente:


sudo apt-get update
sudo apt-get software-properties-common
sudo add-apt-repository ppa:deadsnakes/ppa
sudo apt-get install python3.7
sudo ln -fs /usr/bin/python3.7 /usr/bin/python3
pip3 install --upgrade pip

El siguiente paso es instalar Tuiteó и ConstruirBot, así como paquetes que le permiten utilizar funciones adicionales ConstruirBot-a.


/*Все что под sudo будет установленно для всех пользователей в директорию /usr/local/lib/python3.7/dist-packages*/

#На хосте который производит мониторинг Worker-ов 
sudo pip install twisted #Библиотека twisted
sudo pip install buildbot #BuildMaster
#Дополнительный функционал
pip install pysqlite3 #Устанавливаем базу sqllite в учебных целях
pip install jinja2 #framework наподобие django, для web и для почтовых рассыллок
pip install autobahn #Web cокеты для связи BuildMaster->Worker
pip install sqlalchemy sqlalchemy-migrate #Для отображения схемы базы данных
#Для Web отображения BuildBot-a
pip install buildbot-www buildbot-grid-view buildbot-console-view buildbot-waterfall-view
pip install python-dateutil #Отображение дат в web
#На стороне хоста который непосредственно осуществляет сборку и тестирование 
pip install buildbot-worker #Worker
#Дополнительный функционал
sudo pip install virtualenv #Виртуальная среда 

4. Primeros pasos

hora de crear Construir Maestro. Estará en nuestra carpeta. /home/habr/master.

mkdir master
buildbot create-master master # Собственно сдесь и создаем

Próximo paso. Vamos a crear Trabajador. Estará en nuestra carpeta. /home/habr/trabajador.

mkdir worker
buildbot-worker create-worker --umask=0o22 --keepalive=60 worker localhost:4000 yourWorkerName password

cuando corres Trabajador, entonces de forma predeterminada se creará en /home/habr/trabajador carpeta con el nombre del proyecto, que se especifica en maestro.cfg. Y en la carpeta con el nombre del proyecto creará un directorio build, y seguiré haciéndolo caja. Directorio de trabajo para Trabajador-y se convertirá en un directorio /home/habr/tuProyecto/build.

"Llave dorada
Y ahora para qué escribí el párrafo anterior: un guión que Dominar exigirá de Trabajador-y hecho de forma remota en este directorio no se ejecutará porque el script no tiene permisos para ejecutarse. Para corregir la situación, necesitará una clave. --umask=0o22, que prohíbe escribir en este directorio, pero conservará los derechos de inicio. Y eso es todo lo que necesitamos.

Construir Maestro и Trabajador establecer una conexión entre sí. Sucede que se rompe y Trabajador esperando algún tiempo una respuesta de Construir Maestro-A. Si no hay respuesta, se reinicia la conexión. Llave --mantener vivo=60 sólo necesitaba indicar el tiempo después del cual conectamos se reinicia.

5. Configuración. Receta paso a paso

Configuración Construir Maestro se realiza en el lado de la máquina donde ejecutamos el comando crear-maestro. En nuestro caso, este es un directorio. /home/habr/master. Archivo de configuración maestro.cfg no existe todavía, pero el comando en sí ya ha creado el archivo master.cmg.muestra. Necesitas cambiarle el nombre a master.cfg.muestra в maestro.cfg

mv master.cfg.sample master.cfg

abramos este maestro.cfg. Y veamos en qué consiste. Y después de eso, intentemos crear nuestro propio archivo de configuración.

maestro.cfg

c['change_source'] = []
c['change_source'].append(changes.GitPoller(
    'git://github.com/buildbot/hello-world.git',
         workdir='gitpoller-workdir', branch='master',
         pollInterval=300))
                        
c['schedulers'] = []
c['schedulers'].append(schedulers.SingleBranchScheduler(
        name="all",
        change_filter=util.ChangeFilter(branch='master'),
        treeStableTimer=None,
        builderNames=["runtests"]))
c['schedulers'].append(schedulers.ForceScheduler(
        name="force",
        builderNames=["runtests"]))
                        
factory = util.BuildFactory()
                        
factory.addStep(steps.Git(repourl='git://github.com/buildbot/hello-world.git', mode='incremental'))
factory.addStep(steps.ShellCommand(command=["trial", "hello"],
                                   env={"PYTHONPATH": "."}))
                        
c['builders'] = []
c['builders'].append(
    util.BuilderConfig(name="runtests",
    workernames=["example-worker"],
    factory=factory))
                         
c['services'] = []
                        
c['title'] = "Hello World CI"
c['titleURL'] = "https://buildbot.github.io/hello-world/"
                        
                        
c['buildbotURL'] = "http://localhost:8010/"
                        
c['www'] = dict(port=8010,
                plugins=dict(waterfall_view={}, console_view={}, grid_view={}))
                        
c['db'] = {
    'db_url' : "sqlite:///state.sqlite",
}

5.1 Configuración maestra de compilación

c = BuildmasterConfig = {} 

Configuración maestra de compilación — diccionario básico del archivo de configuración. Debe estar incluido en el archivo de configuración. Para facilitar su uso, se introduce un alias en el código de configuración. "C". Títulos de llaves в c["claveDeDista"] son elementos fijos para la interacción con Construir Maestro. Para cada clave, el objeto correspondiente se sustituye como valor.

5.2 trabajadores

c['workers'] = [worker.Worker("example-worker", "pass")]

Esta vez indicamos Construir Maestro-y lista de Trabajador-s. Mí mismo Trabajador creamos arriba, indicando tu-nombre-trabajador и la contraseña. Ahora es necesario especificarlos. trabajador-ejemplo и pass .

5.3 cambiar_fuente

c['change_source'] = []
c['change_source'].append(changes.GitPoller(
                            'git://github.com/buildbot/hello-world.git',
                             workdir='gitpoller-workdir', branch='master',
                             pollInterval=300))                

Por clave fuente_cambio diccionario c obtenemos acceso a la lista donde queremos colocar un objeto que sondea el repositorio con el código fuente del proyecto. El ejemplo utiliza un repositorio Git que se sondea en determinados intervalos.

El primer argumento es la ruta a su repositorio.

trabajodir representa la ruta a la carpeta donde en el lado Trabajador-a relativo al camino /home/habr/worker/tuProyecto/build git almacenará la versión local del repositorio.

biblioteca contiene una rama específica en el repositorio que se debe seguir.

intervalo de encuesta contiene el número de segundos después de los cuales Construir Maestro sondeará el repositorio en busca de cambios.

Existen varios métodos para realizar un seguimiento de los cambios en el repositorio de un proyecto.

El método más simple es Sondeo, lo que implica que Construir Maestro sondea periódicamente el servidor con el repositorio. Si hacer reflejó los cambios en el repositorio, luego Construir Maestro creará un objeto interno con cierto retraso Cambios y enviarlo al controlador de eventos Programador, que iniciará los pasos para construir y probar el proyecto en Trabajador-mi. Entre estos pasos se indicarán actualización repositorio. exactamente en TrabajadorEsto creará una copia local del repositorio. Los detalles de este proceso se cubrirán a continuación en las dos secciones siguientes. (5.4 и 5.5).

Un método aún más elegante de rastrear cambios en un repositorio es enviar mensajes directamente desde el servidor que lo aloja a Construir Maestro- sobre cambiar los códigos fuente del proyecto. En este caso, tan pronto como el desarrollador haga hacer, el servidor con el repositorio del proyecto enviará un mensaje Construir Maestro-y. Y él, a su vez, lo interceptará creando un objeto. PBCambiarFuente. A continuación, este objeto será transferido a Programador, que activa los pasos para construir el proyecto y probarlo. Una parte importante de este método es trabajar con Gancho.-scripts del servidor en el repositorio. en el guión Gancho.-a, responsable de procesar las acciones cuando hacer-e, necesitas llamar a la utilidad enviar cambio y especifique la dirección de red Construir Maestro-A. También debe especificar el puerto de red que escuchará PBCambiarFuente. PBCambiarFuente, por cierto, es parte Construir Maestro-A. Este método requerirá permiso. Admin-a en el servidor donde se encuentra el repositorio del proyecto. Primero deberá realizar una copia de seguridad del repositorio.

5.4 programadores


c['schedulers'] = []
c['schedulers'].append(schedulers.SingleBranchScheduler(
        name="all",
        change_filter=util.ChangeFilter(branch='master'),
        treeStableTimer=None,
        builderNames=["runtests"]))
c['schedulers'].append(schedulers.ForceScheduler(
        name="force",
        builderNames=["runtests"]))

programadores – este es un elemento que actúa como detonante que inicia toda la cadena de montaje y prueba del proyecto.
Un ejemplo de implementación de la integración continua con BuildBot

Los cambios que se registraron. fuente_cambio, transformado en el proceso de trabajo ConstruirBot-a para oponerse Cambios y ahora cada programador en base a ellos, genera solicitudes para iniciar el proceso de construcción del proyecto. Sin embargo, también determina cuándo estas solicitudes se transfieren a la cola. Un objeto Astillero almacena una cola de solicitudes y rastrea el estado del ensamblaje actual en un archivo separado. Trabajador-mi. Astillero existe en Construir Maestro-e y sigue Trabajador-mi. el envia con Construir Maestro-a en Trabajador-y ya específico build - una serie de pasos que se deben seguir.
Vemos que en el ejemplo actual tales programadores Se crean 2 piezas. Además, cada uno tiene su propio tipo.

Programador de sucursal única – una de las clases más populares del programa. Observa una rama y se activa cuando se registra un cambio en ella. Cuando ve cambios, puede retrasar el envío de la solicitud de compilación (aplazar durante el período especificado en el parámetro especial árbolEstableTemporizador). En nombre establece el nombre del programa que se mostrará en ConstruirBot-interfaz web. EN Cambiar filtro Se establece un filtro, después de pasar qué cambios en la sucursal solicitan al cronograma que envíe una solicitud de construcción. EN nombres de constructor se indica el nombre constructor-a, que configuraremos un poco más tarde. El nombre en nuestro caso será el mismo que el nombre del proyecto: tu proyecto.

Programador de fuerza algo muy sencillo. Este tipo de programación se activa con un clic del mouse ConstruirBot-interfaz web. Los parámetros tienen la misma esencia que en Programador de sucursal única.

PD No. 3. Tal vez sea útil
Periódico Es un programa que se ejecuta con una frecuencia determinada en el tiempo. La llamada se parece a esto


from buildbot.plugins import schedulers
nightly = schedulers.Periodic(name="daily",
                              builderNames=["full-solaris"],
                              periodicBuildTimer=24*60*60)
c['schedulers'] = [nightly]                    

5.5 Construir fábrica


factory = util.BuildFactory()
                        
factory.addStep(steps.Git(repourl='git://github.com/buildbot/hello-world.git', mode='incremental'))
factory.addStep(steps.ShellCommand(command=["trial", "hello"],
                                   env={"PYTHONPATH": "."}))

periódicoBuildTimer especifica el tiempo de esta periodicidad en segundos.

construirfábrica crea un específico build, que luego constructor envía a Trabajador. En construirfábrica indica los pasos a seguir Trabajador-y. Los pasos se agregan llamando al método. añadirPaso

El primer paso agregado en este ejemplo es git limpio -d -f -f –xentonces pago git. Estas acciones están incluidas en el parámetro. Método, que no está claramente indicado pero implica un valor predeterminado fresco. Parámetro modo = 'incremental' indica que los archivos son del directorio donde se encuentra chequear, aunque falta en el repositorio, permanece intacto.

El segundo paso agregado es llamar al script. juicio con parámetro ¡Hola en el lado Trabajador-a del directorio /home/habr/worker/tuProyecto/build con la variable de entorno PATHONPATH=... Por lo tanto, puede escribir sus propios scripts y ejecutarlos en el lado Trabajador-a cada paso util.ShellCommand. Estos scripts se pueden colocar directamente en el repositorio. Entonces en chequear-e caerán en /home/habr/worker/tuProyecto/build. Sin embargo, luego hay dos “peros”:

  1. Trabajador debe crearse con una clave --mascarilla para que no bloquee los derechos de ejecución después caja-a.
  2. en git push-e de estos scripts necesita especificar la propiedad ejecutablepara que luego chequear-e no perdió el derecho a ejecutar el script Git.

5.6 constructores


c['builders'] = []
c['builders'].append(util.BuilderConfig(name="runtests",
                                        workernames=["example-worker"],
                                        factory=factory))

Sobre lo que es Astillero fue dicho aquí. Ahora te contaré con más detalle cómo crearlo. Configuración del constructor es un constructor constructor. Tales diseñadores en c['constructores'] puedes especificar varios, ya que esta es una hoja de objetos constructor tipo. Ahora reescribamos el ejemplo de ConstruirBot, acercándolo a nuestra tarea.


c['builders'] = []
c['builders'].append(util.BuilderConfig(name="yourProject",
                                            workernames=["yourWorkerName"],
                                            factory=factory))

Ahora te hablaré de los parámetros. Configuración del constructor.

nombre especifica el nombre constructor-a. Aquí lo nombramos tu proyecto. Esto significa que en Trabajador- este mismo camino será creado /home/habr/worker/tuProyecto/build. programador Buscando constructor sólo con este nombre.

nombres de trabajadores contiene hoja Trabajador-s. Cada uno de los cuales debe agregarse a c['trabajadores'].

personal - específico build, con el que está asociado constructor. Él enviará el objeto. build en Trabajador para completar todos los pasos incluidos en este build-a.

6. Ejemplo de configuración propia

Aquí está la arquitectura de proyecto de ejemplo que propongo implementar a través de ConstruirBot
.

Lo usaremos como sistema de control de versiones. svn. El repositorio en sí estará ubicado en algún tipo de nube. Aquí está la dirección de esta nube. svn.host/svn/tuProyecto/trunk. En la nube debajo svn hay un nombre de usuario de cuenta: usuario, contraseña: la contraseña. Guiones que representan pasos build-a también estará en la rama svn, en una carpeta separada buildbot/trabajador_linux. Estos scripts se encuentran en el repositorio con la propiedad guardada. ejecutable.

Construir Maestro и Trabajador ejecutar en el mismo host proyecto.host .Construir Maestro almacena sus archivos en una carpeta /home/habr/master. Trabajador se almacena en la siguiente ruta /home/habr/trabajador. Comunicación de proceso Construir Maestro-a yo Trabajador-a se realiza a través del puerto 4000 según el protocolo ConstruirBot-a, eso es 'pb' protocolo.

El proyecto de destino está escrito completamente en Python. La tarea es rastrear sus cambios, crear un archivo ejecutable, generar documentación y realizar pruebas. En caso de falla, todos los desarrolladores deben enviar un mensaje por correo electrónico indicando que se ha realizado una acción fallida.

visualización web ConstruirBot Nos conectaremos al puerto 80 para proyecto.host. No es necesario instalar Apatch. Como parte de la biblioteca. retorcido ya existe un servidor web, ConstruirBot lo usa.

Para almacenar información interna para ConstruirBot usaremos sqlite.

Se requiere un host para enviar correo smtp.tu.dominio - permite enviar cartas desde el correo [email protected] sin autenticación. También en el anfitrión 'smtp ' El acta se escucha en el puesto 1025.

Hay dos personas involucradas en el proceso: Admin и usuario. administrador administra ConstruirBot. usuario es la persona que comete hacer-s.

El archivo ejecutable se genera mediante pyinstaller. La documentación se genera mediante oxígeno.

Para esta arquitectura escribí esto: maestro.cfg:

maestro.cfg


import os, re
from buildbot.plugins import steps, util, schedulers, worker, changes, reporters

c= BuildmasterConfig ={}

c['workers'] = [ worker.Worker('yourWorkerName', 'password') ]
c['protocols'] = {'pb': {'port': 4000}} 


svn_poller = changes.SVNPoller(repourl="https://svn.host/svn/yourProject/trunk",
                                svnuser="user",
                                svnpasswd="password",
                                pollinterval=60,
				split_file=util.svn.split_file_alwaystrunk
                                )

c['change_source'] =  svn_poller

hourlyscheduler = schedulers.SingleBranchScheduler(
                                name="your-project-schedulers",
				change_filter=util.ChangeFilter(branch=None),
                                builderNames=["yourProject"],
				properties = {'owner': 'admin'}
                                )

c['schedulers'] = [hourlyscheduler]

checkout = steps.SVN(repourl='https://svn.host/svn/yourProject/trunk',
                        mode='full',
                        method='fresh',
                        username="user",
                        password="password",
                        haltOnFailure=True)

	
projectHost_build = util.BuildFactory()  


cleanProject = steps.ShellCommand(name="Clean",
                 command=["buildbot/worker_linux/pyinstaller_project", "clean"]
                                )
buildProject = steps.ShellCommand(name="Build",
                 command=["buildbot/worker_linux/pyinstaller_project", "build"]
                                )
doxyProject = steps.ShellCommand(name="Update Docs",
                                command=["buildbot/worker_linux/gendoc", []]
                                )
testProject = steps.ShellCommand(name="Tests",
                                command=["python","tests/utest.py"],
                                env={'PYTHONPATH': '.'}
                                )

projectHost_build.addStep(checkout)
projectHost_build.addStep(cleanProject)
projectHost_build.addStep(buildProject)
projectHost_build.addStep(doxyProject)
projectHost_build.addStep(testProject)


c['builders'] = [
        util.BuilderConfig(name="yourProject", workername='yourWorkerName', factory=projectHost_build)
]


template_html=u'''
<h4>Статус построенного релиза: {{ summary }}</h4>
<p>Используемый сервис для постраения: {{ workername }}</p>
<p>Проект: {{ projects }}</p>
<p>Для того что бы посмотреть интерфейс управления пройдите по ссылке: {{ buildbot_url }}</p>
<p>Для того что бы посмотреть результат сборки пройдите по ссылке: {{ build_url }}</p>
<p>Используя WinSCP можно подключиться к серверу c ip:xxx.xx.xxx.xx. Войдя под habr/password, забрать собранный executable файл с директории ~/worker/yourProject/build/dist.</p>
<p><b>Построение было произведено через Buildbot</b></p>
'''

sendMessageToAll = reporters.MailNotifier(fromaddr="[email protected]",
					sendToInterestedUsers=True,
					lookup="your.domain",
					relayhost="smtp.your.domain",
					smtpPort=1025,
					mode="warnings",
					extraRecipients=['[email protected]'],
              messageFormatter=reporters.MessageFormatter(
						template=template_html,
						template_type='html',
						wantProperties=True, 
                                                wantSteps=True)
					)
c['services'] = [sendMessageToAll]

c['title'] = "The process of bulding"
c['titleURL'] = "http://project.host:80/"

c['buildbotURL'] = "http://project.host"

c['www'] = dict(port=80,
                plugins=dict(waterfall_view={}, console_view={}, grid_view={}))


c['db'] = {
    'db_url' : "sqlite:///state.sqlite"
}

Primero necesitas создать Construir Maestro-a yo Trabajador-a. Luego pega este archivo maestro.cfg в /home/habr/master.

El siguiente paso es iniciar el servicio. Construir Maestroaa


sudo buildbot start /home/habr/master

Luego inicia el servicio Trabajador-a


buildbot-worker start /home/habr/worker

¡Listo! Ahora Construir bot rastreará los cambios y activará hacer-y en svn, realizando los pasos de construcción y prueba de un proyecto con la arquitectura anterior.

A continuación describiré algunas características de lo anterior. maestro.cfg.

6.1 De camino a tu master.cfg


mientras escribía mi maestro.cfg Se cometerán muchos errores, por lo que será necesario leer el archivo de registro. Se almacena como Construir Maestro-ec ruta absoluta /home/habr/master/twistd.log, y al lado Trabajador-a con ruta absoluta /home/habr/worker/twistd.log. A medida que lea el error y lo solucione, deberá reiniciar el servicio. Construir Maestro-a. Así es como se hace:


sudo buildbot stop /home/habr/master
sudo buildbot upgrade-master /home/habr/master
sudo buildbot start /home/habr/master

6.2 Trabajando con svn


svn_poller = changes.SVNPoller(repourl="https://svn.host/svn/yourProject/trunk",
                               svnuser="user",
                               svnpasswd="password",
                               pollinterval=60,
                               split_file=util.svn.split_file_alwaystrunk
                        )

c['change_source'] =  svn_poller

hourlyscheduler = schedulers.SingleBranchScheduler(
                            name="your-project-schedulers",
                            change_filter=util.ChangeFilter(branch=None),
                            builderNames=["yourProject"],
                            properties = {'owner': 'admin'}
                        )

c['schedulers'] = [hourlyscheduler]

checkout = steps.SVN(repourl='https://svn.host/svn/yourProject/trunk',
                     mode='full',
                     method='fresh',
                     username="user",
                     password="password",
                     haltOnFailure=True)

Para empezar, echemos un vistazo a svn_poller. Esta sigue siendo la misma interfaz, sondeando periódicamente el repositorio una vez por minuto. En este caso svn_poller solo accede a la sucursal tronco. Parámetro misterioso split_file=util.svn.split_file_alwaystrunk establece las reglas: cómo dividir la estructura de carpetas svn en las ramas. También les ofrece caminos relativos. A su momento split_file_alwaystrunk simplifica el proceso diciendo que el repositorio solo contiene tronco.

В Programadores esta indicado Cambiar filtroquien ve Ninguna y le asocia una sucursal tronco según una determinada asociación a través de split_file_alwaystrunk. Respondiendo a los cambios en tronco, Lanzamientos constructor con nombre tu proyecto.

propiedades aquí es necesario para que el administrador reciba listas de correo de resultados de compilación y pruebas como propietario del proceso.

Paso build-a caja capaz de eliminar completamente cualquier archivo ubicado en la versión local del repositorio Trabajador-A. Y luego haz el completo svn actualización. El modo se configura a través del parámetro modo = completo, método = fresco. Parámetro detenerEnTailure dice que si svn actualización se ejecutará con un error, entonces se debe suspender todo el proceso de construcción y prueba, ya que otras acciones no tienen sentido.

6.3 Carta a usted: los periodistas están autorizados a declarar


periodistas es un servicio de envío de notificaciones por correo electrónico.


template_html=u'''
<h4>Статус построенного релиза: {{ summary }}</h4>
<p>Используемый сервис для постраения: {{ workername }}</p>
<p>Проект: {{ projects }}</p>
<p>Для того что бы посмотреть интерфейс управления пройдите по ссылке: {{ buildbot_url }}</p>
<p>Для того что бы посмотреть результат сборки пройдите по ссылке: {{ build_url }}</p>
<p>Используя WinSCP можно подключиться к серверу c ip:xxx.xx.xxx.xx. Войдя под habr/password, забрать собранный executable файл с директории ~/worker/yourProject/build/dist.</p>
<p><b>Построение было произведено через Buildbot</b></p>
'''
                        
sendMessageToAll = reporters.MailNotifier(fromaddr="[email protected]",
                                          sendToInterestedUsers=True,
                                          lookup="your.domain",
                                          relayhost="smtp.your.domain",
                                          smtpPort=1025,
                                          mode="warnings",
                                          extraRecipients=['[email protected]'],
                                    messageFormatter=reporters.MessageFormatter(
                                                    template=template_html,
                                                    template_type='html',
                                                    wantProperties=True, 
                                                    wantSteps=True)
                                        )
c['services'] = [sendMessageToAll]

Él puede enviar mensajes. diferentes caminos.

Notificador de correo utiliza el correo electrónico para enviar notificaciones.

plantilla_html establece la plantilla de texto para el boletín. HTML se utiliza para crear marcas. Es modificado por el motor. jinja2 (se puede comparar con django). ConstruirBot Tiene un conjunto de variables cuyos valores se sustituyen en la plantilla durante el proceso de generación del texto del mensaje. Estas variables están encerradas entre {{ llaves dobles }}. Por ejemplo, resumen muestra el estado de las operaciones completadas, es decir, éxito o fracaso. A proyecta saldrá tu proyecto. Entonces, usar comandos de control en jinja2, variables ConstruirBot-a y las herramientas de formato de cadenas de Python, puede crear un mensaje bastante informativo.

Notificador de correo contiene los siguientes argumentos.

desdeaddr – la dirección desde la que todos recibirán el boletín.

enviar a usuarios interesados=Verdadero envía un mensaje al propietario y usuario que realizó hacer.

búsqueda — un sufijo que debe agregarse a los nombres de los usuarios que reciben el boletín. Entonces Admin cómo recibirá el usuario el boletín en la dirección [email protected].

servidor de retransmisión especifica el nombre de host en el que se abre el servidor smtp, puerto smpt especifica el número de puerto que escucha smtp servidor.

modo="advertencia" dice que el envío por correo solo debe realizarse si hay al menos un paso build-a, que terminó con el estado falla o advertencia. En caso de éxito, no es necesario enviar un boletín.

Destinatarios adicionales contiene una lista de personas a quienes se debe enviar el correo además del propietario y la persona que realizó el envío hacer.

formateador de mensajes es un objeto que especifica el formato del mensaje, su plantilla y un conjunto de variables disponibles en jinja2. Opciones como quieroProperties=Verdadero и quieroPasos=Verdadero definir este conjunto de variables disponibles.

con['servicios']=[enviarMessageToAll] proporciona una lista de servicios, entre los cuales el nuestro estará molécula indicadora.

¡Lo hicimos! Felicidades

Creamos nuestra propia configuración y vimos la funcionalidad de la que es capaz. ConstruirBot. Creo que esto es suficiente para comprender si esta herramienta es necesaria para crear su proyecto. ¿Estás interesado en él? ¿Te será útil? ¿Se siente cómodo trabajando con él? Entonces no escribo este artículo en vano.

Y además. Me gustaría que la comunidad profesional utilice ConstruirBot, se hizo más amplio, se tradujeron manuales y hubo aún más ejemplos.

Gracias a todos por su atención. Buena suerte.

Fuente: habr.com

Añadir un comentario