(Image par Computerizer de Pixabay)
Salut
Je m'appelle
Evgeny Cherkin , je suis le programmeur de l'équipe de développement de la société minière
Polymetal .
Lorsque vous lancez un projet majeur, vous commencez à penser: "Quel logiciel est préférable d'utiliser pour sa maintenance?". Un projet informatique avant la sortie de la prochaine version passe par une série d'étapes. C'est bien quand la chaîne de ces étapes est automatisée. Le processus automatisé de publication d'une nouvelle version d'un projet informatique est appelé
intégration continue .
BuildBot s'est avéré être une bonne aide pour nous, implémentant ce processus.
Dans cet article, j'ai décidé de fournir un aperçu des fonctionnalités de
BuildBot . De quoi est capable ce logiciel? Comment l'approcher et comment construire avec lui une RELATION DE TRAVAIL EFFICACE normale? Vous pouvez également vous appliquer notre expérience en créant sur votre machine un service de travail pour assembler et tester votre projet.
1. Pourquoi BuildBot?
Plus tôt sur habr-e, je suis tombé sur des articles sur la mise en œuvre de l'
intégration continue à l' aide de
BuildBot . Par exemple,
celui-ci m'a semblé le plus instructif. Il y a un autre exemple -
plus simple . Ces articles peuvent être assaisonnés avec
un exemple tiré du manuel , et
ce après, en anglais. Le coupé est un bon point de départ. Après avoir lu ces articles, vous voudrez probablement faire quelque chose sur
BuildBot tout de suite .
Arrête ça! Quelqu'un l'a-t-il même utilisé dans ses projets? Il s'avère que oui,
beaucoup l'ont appliqué dans leurs tâches. Vous pouvez trouver des
exemples d' utilisation de
BuildBot dans les archives de code Google.
Alors, quelle est la logique des gens qui utilisent
buildbot ? Après tout, il existe d'autres outils:
CruiseControl et
Jenkins . Je répondrai de cette façon. Pour la plupart des tâches,
Jenkins sera vraiment suffisant.
BuildBot , à son tour, est plus adaptatif, et les tâches y sont résolues aussi facilement que dans
Jenkins . Choisissez-vous. Mais comme nous recherchons un outil pour un projet cible en développement, pourquoi ne pas choisir celui qui nous permet, à partir d'étapes simples, d'obtenir un système de build interactif et doté d'une interface unique.
Pour ceux dont le projet cible est écrit en python, la question se pose: «Pourquoi ne pas choisir un système d'intégration qui a une interface claire en termes de langage utilisé dans le projet?». Et puis il est temps de présenter les avantages de
BuildBot .
Alors, notre «quatuor instrumental». Pour moi, j'ai défini les quatre fonctionnalités de BuildBot :
- Ceci est un framework open source sous la GPL
- Cela utilise python comme outil de configuration et décrit les actions requises.
- C'est l'occasion de recevoir une réponse de la machine sur laquelle se déroule le montage.
- Ce sont enfin les exigences minimales pour l'hôte. Le déploiement nécessite python et twisted, et aucune machine virtuelle ou machine java n'est requise.
2. Concept dirigé par BuildMaster
BuildMaster est au
cœur de l' architecture de distribution des
tâches . C'est un service qui:
- suit les changements dans l'arborescence source du projet
- envoie les commandes que le service Worker doit exécuter pour créer un projet et le tester
- informe les utilisateurs des résultats des actions entreprises
BuildMaster est configuré via le
fichier master.cfg . Ce fichier est à la racine de
BuildMaster . Plus tard, je montrerai comment cette racine est créée. Le
fichier master.cfg lui -
même contient python, un script qui utilise les appels
BuildBot .
Le prochain
BuildBot le plus important est appelé
Worker . Ce service peut être exécuté sur un hôte différent avec un système d'exploitation différent, ou peut-être sur l'emplacement de
BuildMaster . Il peut également exister dans un environnement virtuel spécialement préparé avec ses propres packages et variables. Ces environnements virtuels peuvent être préparés à l'aide d'utilitaires python comme
vertualenv, venv .
BuildMaster diffuse des commandes à chaque
Worker , qui, à son tour, les exécute. Autrement dit, il s'avère que le processus de construction et de test du projet peut aller au
Worker sous Windows et à un autre Worker sous Linux.
La récupération du code source du projet se produit sur chaque
Worker .
3. Installation
Alors allons-y. J'utiliserai Ubuntu 18.04 comme hôte. Je vais y placer un
BuildMaster -a et un
Worker -a. Mais vous devez d'abord installer python3.7:
sudo apt-get update sudo apt-get install python3.7
Pour ceux qui ont besoin de python3.7.2 au lieu de 3.7.1, vous pouvez faire ce qui suit:
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
L'étape suivante consiste à installer
Twited et
BuildBot , ainsi que des packages qui activent des fonctionnalités
BuildBot -a supplémentaires.
/* sudo /usr/local/lib/python3.7/dist-packages*/
4. Premières étapes
Il est temps de créer un
BuildMaster . Nous l'aurons dans le dossier
/ home / habr / master .
mkdir master buildbot create-master master
La prochaine étape. Créez un
travailleur . Nous l'aurons dans le dossier
/ home / habr / worker .
mkdir worker buildbot-worker create-worker --umask=0o22 --keepalive=60 worker localhost:4000 yourWorkerName password
Lorsque vous démarrez
Worker , par défaut, il crée un dossier dans
/ home / habr / worker avec le nom du projet, qui est spécifié dans
master.cfg . Et dans le dossier avec le nom du projet, il créera le répertoire de
construction , puis la
vérification y sera effectuée. Le répertoire de travail de
Worker sera le répertoire
/ home / habr / yourProject / build .
Clé d'orEt maintenant, pour ce que j'ai écrit le paragraphe précédent: le script que
Master exigera que
Worker fasse à distance dans ce répertoire ne sera pas exécuté, car le script n'a pas la permission de s'exécuter. Pour corriger la situation, vous avez besoin d'une clé
--umask = 0o22 , ce qui interdit d'écrire dans ce répertoire, mais laisse les droits de démarrage. Et nous en avons seulement besoin.
BuildMaster et
Worker établissent une connexion entre eux. Il arrive qu'il se casse et
Worker attend une réponse de
BuildMaster pendant un certain temps. Si aucune réponse n'est reçue, la connexion est redémarrée. La clé
--keepalive = 60 est exactement ce dont vous avez besoin pour indiquer le temps après lequel la
connexion redémarre.
5. Configuration. Recette étape par étape
La configuration de
BuildMaster se fait côté machine, où nous avons exécuté la commande
create-master . Dans notre cas, il s'agit du répertoire
/ home / habr / master . Le
fichier de configuration
master.cfg n'existe pas encore, mais la commande elle-même a déjà créé le
fichier master.cmg.sample . Vous devez le renommer dans
master.cfg.sample en
master.cfg mv master.cfg.sample master.cfg
Ouvrons ce
master.cfg . Et nous analyserons en quoi il consiste. Et après cela, nous essaierons de créer notre propre fichier de configuration.
master.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.imtqy.com/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 BuildmasterConfig
c = BuildmasterConfig = {}
BuildmasterConfig - le dictionnaire de base du fichier de configuration. Il doit être impliqué dans le fichier de configuration. Pour plus de facilité d'utilisation, son alias
"c" est saisi dans le code de configuration.
Les noms de
clés dans
c ["keyFromDist"] sont des éléments fixes pour interagir avec
BuildMaster . Sous chaque clé, l'objet correspondant est substitué en tant que valeur.
5.2 travailleurs
c['workers'] = [worker.Worker("example-worker", "pass")]
Cette fois, nous
signalons la liste
BuildMaster des
travailleurs . Nous avons créé
Worker ci-dessus en spécifiant
votre nom de travailleur et votre
mot de passe . Maintenant, ils doivent être spécifiés au lieu d'
exemple-travailleur et
passer .
5.3 change_source
c['change_source'] = [] c['change_source'].append(changes.GitPoller( 'git://github.com/buildbot/hello-world.git', workdir='gitpoller-workdir', branch='master', pollInterval=300))
En utilisant la clé
change_source du dictionnaire
c , nous avons accès à la liste où vous souhaitez placer l'objet qui interroge le référentiel avec le code source du projet. L'exemple utilise le référentiel Git, qui est interrogé à une certaine périodicité.
Le premier argument est le chemin d'accès à votre référentiel.
workdir est le chemin d'accès au dossier où,
du côté
du travailleur , par rapport au chemin
/ home / habr / worker / yourProject / build, git stockera la version locale du référentiel.
branche contient une branche spécifique dans le référentiel qui doit être surveillée.
pollInterval contient le nombre de secondes après lesquelles
BuildMaster interrogera le référentiel pour les modifications.
Il existe plusieurs méthodes pour suivre les modifications dans un référentiel de projet.
La méthode la plus simple est
Polling , ce qui implique que
BuildMaster interroge périodiquement le serveur avec le référentiel. Si
commit reflétait les changements dans le référentiel, alors
BuildMaster créera un certain délai un objet
Change interne et l'enverra au gestionnaire d'événements du
planificateur , qui lancera les étapes de génération et de test du projet sur
Worker . Parmi ces étapes, la
mise à jour du référentiel sera indiquée. C'est sur
Worker qu'une copie locale du référentiel sera créée. Les détails de ce processus seront divulgués ci-dessous dans les deux sections suivantes
( 5.4 et 5.5 ) .
Une méthode encore plus élégante de suivi des modifications dans le référentiel consiste à envoyer des messages directement depuis le serveur sur lequel il se trouve à
BuildMaster concernant la modification des codes source du projet. Dans ce cas, dès que le développeur effectue une
validation , le serveur avec le référentiel de projet enverra un message à
BuildMaster . Et cela, à son tour, sera intercepté en créant un objet
PBChangeSource . De plus, cet objet sera transféré à
Scheduler , qui activera les étapes de construction du projet et ses tests. Une partie importante de cette méthode consiste à travailler avec des scripts de
hook de serveur dans le référentiel. Dans le script de
raccordement responsable de la gestion des actions lors de la
validation , vous devez appeler l'utilitaire
sendchange et spécifier l'adresse réseau de
BuildMaster . Vous devez
spécifier le port réseau qui écoutera
PBChangeSource .
Soit dit en passant,
PBChangeSource fait partie de
BuildMaster . Cette méthode nécessite le privilège
admin -a sur le serveur où se trouve le référentiel de projet. Vous devez d'abord créer un référentiel de sauvegarde.
5.4 déchiqueteurs
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"]))
Les ordonnanceurs sont un élément qui agit comme un déclencheur qui exécute l'ensemble de la chaîne d'assemblage et de test d'un projet.

Ces modifications qui ont été enregistrées par
change_source ont été converties pendant le fonctionnement de
BuildBot -a en l'objet
Change et maintenant chaque
Sheduler en fonction d'eux crée des demandes pour démarrer le processus de génération de projet. Cependant, il détermine également quand envoyer ces demandes à la file d'attente. Objet
Le générateur conserve une file d'attente de demandes et surveille le statut de l'assembly actuel sur un
Worker -e distinct.
Le générateur existe sur
BuildMaster -e et
Worker -e. Il envoie une
build spécifique de
BuildMaster à
Worker , une série d'étapes qui doivent être suivies.
Nous voyons que dans l'exemple actuel de tels
ordonnanceurs , 2 pièces sont créées. De plus, chacun a son propre type.
SingleBranchScheduler est l'une des classes d'horaires les plus populaires. Il surveille une branche et est déclenché par un changement enregistré dans celle-ci. Lorsqu'il voit les modifications, il peut reporter l'envoi d'une demande de construction (reporter pour la période spécifiée dans le paramètre spécial
treeStableTimer ). Le
nom spécifie le nom de la planification qui sera affichée dans l'interface
BuildBot -web. Un
filtre est défini dans
ChangeFilter , après avoir traversé les modifications de la branche qui invitent la planification à envoyer une demande de génération. Le nom
builder -a est spécifié dans
builderNames , que nous préciserons un peu plus tard. Le nom dans notre cas sera le même que le nom du projet:
yourProject .
ForceScheduler est une chose très simple. Ce type de planification est déclenché par un clic de souris via l'interface
BuildBot -web. Les paramètres ont la même essence que dans
SingleBranchScheduler .
PS n ° 3. Soudainement utilePériodique est un programme qui est déclenché à une fréquence fixe dans le temps. Cela ressemble à un appel comme celui-ci
from buildbot.plugins import schedulers nightly = schedulers.Periodic(name="daily", builderNames=["full-solaris"], periodicBuildTimer=24*60*60) c['schedulers'] = [nightly]
5.5 BuildFactory
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": "."}))
periodicalBuildTimer définit le temps de cette périodicité en secondes.
BuildFactory crée une
construction en béton, que le
générateur envoie ensuite au
Worker .
BuildFactory indique les étapes qu'un
Worker doit suivre. Les étapes sont ajoutées en appelant la méthode
addStep.
La première étape ajoutée dans cet exemple est
git clean -d -f -f –x , puis
git checkout . Ces actions sont intégrées dans le paramètre de
méthode , qui n'est pas clairement indiqué, mais implique la valeur par défaut de
fresh . Le paramètre
mode = 'incremental' indique que les fichiers du répertoire où
s'effectue le
chechout, bien qu'ils soient absents du référentiel, restent intacts.
La deuxième étape ajoutée consiste à appeler le script d'
essai avec le paramètre
hello du côté
Worker depuis le répertoire
/ home / habr / worker / yourProject / build avec la variable d'environnement PATHONPATH = ... Vous pouvez donc écrire vos propres scripts et les exécuter du côté
Worker -a via l'étape
util.ShellCommand . Ces scripts peuvent être placés directement dans le référentiel. Ensuite, pendant le
chechout, ils iront dans
/ home / habr / worker / yourProject / build . Cependant, il y a ensuite deux «mais»:
- Le travailleur doit être créé avec le commutateur --umask afin qu'il ne bloque pas les droits d'exécution après l' extraction -a.
- Lorsque git envoie ces scripts, il est nécessaire de spécifier la propriété exacutable , afin qu'avec chechout -e Git ne perde pas le droit d'exécuter le script.
5.6 constructeurs
c['builders'] = [] c['builders'].append(util.BuilderConfig(name="runtests", workernames=["example-worker"], factory=factory))
À propos de ce que
Builder a été décrit
ici . Je vais maintenant parler plus en détail de la façon de le créer.
BuilderConfig est un constructeur
constructeur . Vous pouvez spécifier plusieurs de ces constructeurs dans
c ['constructeurs'] , car il s'agit d'une liste d'objets de type
constructeur . Nous allons maintenant réécrire légèrement l'exemple de
BuildBot , en le rapprochant de notre tâche.
c['builders'] = [] c['builders'].append(util.BuilderConfig(name="yourProject", workernames=["yourWorkerName"], factory=factory))
Je vais maintenant parler des paramètres
BuilderConfig .
nom définit le
constructeur de noms -a. Ici, nous l'avons appelé votre
projet . Cela signifie que sur le
Worker, ce chemin
/ home / habr / worker / yourProject / build sera créé.
Sheduler recherche un
constructeur par ce nom.
workernames contient une liste de
Workers . Dont chacun doit être ajouté à
c [«travailleurs»] .
factory est le
build spécifique auquel le
constructeur est associé. Il enverra un objet de
génération à
Worker pour terminer toutes les étapes qui composent cette
génération -a.
6. Exemple de configuration propre
Voici l'architecture d'un exemple de projet que je propose de mettre en œuvre via
BuildBot
.
Nous utiliserons
svn comme système de contrôle de version. Le référentiel lui-même sera dans un certain cloud. Voici l'adresse de ce cloud
svn.host/svn/yourProject/trunk . Dans le cloud sous
svn, il y a un nom d'utilisateur:
utilisateur , passwd:
mot de passe . Les scripts qui constituent les étapes de
build -a se trouvent également dans la branche
svn , dans un
dossier buildbot / worker_linux distinct . Ces scripts sont dans le référentiel avec la propriété
exécutable enregistrée.
BuildMaster et
Worker fonctionnent sur le même hôte
project.host .
BuildMaster stocke ses fichiers dans le dossier
/ home / habr / master .
Worker stocke le chemin suivant
/ home / habr / worker . La communication entre les processus
BuildMaster et
Worker s'effectue via le port 4000 à l'aide du protocole
BuildBot -a, c'est-à-dire le protocole
«pb» .
Le projet cible est entièrement écrit en python. La tâche consiste à suivre ses modifications, à créer un fichier exécutable, à générer de la documentation et à effectuer des tests. En cas d'échec, tous les développeurs doivent envoyer un message au courrier électronique indiquant qu'une action a échoué.
Nous allons connecter la cartographie Web
BuildBot au port 80 pour
project.host . Apatch est facultatif. La bibliothèque
torsadée possède déjà un serveur Web,
BuildBot l' utilise.
Nous utiliserons
sqlite pour stocker des informations internes pour
BuildBot .
Pour l'envoi, vous avez besoin de l'hôte
smtp.your.domain - il permet d'envoyer des e-mails depuis
projectHost@your.domain sans authentification. Également sur l'hôte «
smtp », le protocole est écouté à 1025.
Il y a deux personnes impliquées dans le processus: l'
administrateur et l'
utilisateur . admin administre
BuildBot . utilisateur est la personne qui commet la
validation .
Un fichier exacutable est généré via
pyinstaller . La documentation est générée via
doxygen .
Pour cette architecture, j'ai écrit ce
master.cfg :
master.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="projectHost@your.domain", sendToInterestedUsers=True, lookup="your.domain", relayhost="smtp.your.domain", smtpPort=1025, mode="warnings", extraRecipients=['user@your.domain'], 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" }
Vous devez
d'abord créer BuildMaster et
Worker -a.
Collez ensuite ce
fichier master.cfg dans
/ home / habr / master .
L'étape suivante consiste à démarrer le service
BuildMaster sudo buildbot start /home/habr/master
Ensuite, démarrez le service
Worker -a
buildbot-worker start /home/habr/worker
C'est fait! Maintenant,
Buildbot suivra les modifications et
s'exécutera lors de la
validation dans
svn , en suivant les étapes de construction et de test du projet avec l'architecture ci-dessus.
Ci-dessous, je décrirai quelques fonctionnalités du
master.cfg ci-dessus
.
6.1 En route vers votre master.cfg
Lors de l'écriture de votre
master.cfg, de nombreuses erreurs seront commises, vous devrez donc lire le fichier journal. Il est stocké à la fois sur le chemin absolu
BuildMaster -ec
/home/habr/master/twistd.log et sur le côté
Worker -a avec le chemin absolu
/home/habr/worker/twistd.log . Lorsque vous lisez l'erreur et la
corrigez , vous devrez redémarrer le service
BuildMaster -a. Voici comment procéder:
sudo buildbot stop /home/habr/master sudo buildbot upgrade-master /home/habr/master sudo buildbot start /home/habr/master
6.2 Travailler avec 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)
Tout d'abord, jetez un œil à
svn_poller . Il s'agit de la même interface qui interroge régulièrement le référentiel une fois par minute. Dans ce cas,
svn_poller accède uniquement à la branche du
tronc . Le mystérieux paramètre
split_file = util.svn.split_file_alwaystrunk définit les règles: comment diviser la structure des dossiers
svn en branches. Il leur propose des moyens relatifs. À son tour,
split_file_alwaystrunk simplifie le processus en disant que seul le
tronc est dans le référentiel.
Dans
Schedulers ,
ChangeFilter est
spécifié , qui voit
None et associe la branche de
jonction avec elle en fonction de l'association spécifiée via
split_file_alwaystrunk . Répondant aux modifications du
tronc , il démarre le
générateur nommé
yourProject .
Les propriétés ici sont nécessaires pour que l'administrateur reçoive la newsletter de l'assembly et teste les résultats en tant que propriétaire du processus.
L'étape de
vérification de build -a est capable de supprimer complètement tous les fichiers qui se trouvent dans la version locale du référentiel
Worker . Faites ensuite la
mise à jour svn complète. Le mode est configuré via le paramètre
mode = full ,
method = fresh . Le paramètre
haltOnTailure indique que si la
mise à jour svn échoue , l'ensemble du processus d'assemblage et de test doit être suspendu, car les étapes ultérieures n'ont aucun sens.
6.3 Une lettre à vous: les journalistes sont autorisés à déclarer
reporters est un service de notification par courrier.
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="projectHost@your.domain", sendToInterestedUsers=True, lookup="your.domain", relayhost="smtp.your.domain", smtpPort=1025, mode="warnings", extraRecipients=['user@your.domain'], messageFormatter=reporters.MessageFormatter( template=template_html, template_type='html', wantProperties=True, wantSteps=True) ) c['services'] = [sendMessageToAll]
Il peut envoyer des messages de
plusieurs manières .
MailNotifier utilise le courrier électronique pour envoyer des notifications.
template_html définit le modèle de texte pour la newsletter. Pour créer un balisage, utilisez html. Il est modifié par le moteur
jinja2 (peut être comparé à
django ).
BuildBot a un ensemble de variables, dont les valeurs sont substituées dans le modèle dans le processus de formation du texte du message. Ces variables sont inscrites entre {{accolades doubles}}. Ainsi, par exemple, le
résumé affiche l'état des opérations terminées, c'est-à-dire le succès ou l'échec. Et les
projets généreront votre projet . Ainsi, en utilisant les commandes de contrôle dans
jinja2 , les variables
BuildBot et les formateurs de chaînes python, vous pouvez créer un message très informatif.
MailNotifier contient les arguments suivants.
fromaddr - l'adresse à partir de laquelle tout le monde recevra la newsletter.
sendToInterestedUsers = True envoie un message au propriétaire et à l'utilisateur qui ont effectué la
validation .
recherche - suffixe à ajouter aux noms des utilisateurs recevant la newsletter. L'
administrateur en tant qu'utilisateur recevra donc la newsletter à admin@your.domain.
relayhost spécifie le nom d'hôte sur lequel le serveur
smtp est ouvert et
smptPort spécifie le numéro de port sur lequel le serveur
smtp écoute.
mode = «warning» indique que l'envoi ne doit être effectué que s'il y a au moins une étape de génération qui s'est terminée avec un état d'échec ou d'avertissement. En cas de succès, l'envoi n'est pas obligatoire.extraRecipients contient une liste de personnes à qui le mailing doit être fait en plus du propriétaire et de la personne qui a effectué la validation .messageFormatter est un objet qui définit le format du message, son modèle et l'ensemble de variables disponibles à partir de jinja2 . Des paramètres tels que wantProperties = True et wantSteps = True spécifient cet ensemble de variables disponibles.with ['services'] = [sendMessageToAll] fournit une liste de services, parmi lesquels nosjournaliste .Nous l'avons fait! Mes félicitations
Nous avons créé notre propre configuration et vu les fonctionnalités dont BuildBot est capable . Je pense que cela suffit pour comprendre si cet outil est nécessaire pour créer votre projet. Est-ce qu'il vous intéresse? Cela vous sera-t-il utile? Est-il pratique de travailler avec? Ensuite, j'écris cet article pour une bonne raison.Et encore une chose.
J'aimerais que la communauté professionnelle utilisant BuildBot devienne plus large, des manuels traduits et plus d'exemples.Merci à tous pour votre attention. Bonne chance