Un exemple d'implémentation d'intégration continue avec BuildBot

Un exemple d'implémentation d'intégration continue avec BuildBot
(Image par Informatiseur de pixabay)

Salut!

Je m'appelle Evgueni Tcherkine, je suis programmeur dans une équipe de développement dans une société minière Polymétal.

Lorsque vous démarrez un grand projet, vous commencez à penser : « Quel logiciel est-il préférable d'utiliser pour le gérer ? » Un projet informatique passe par plusieurs étapes avant de sortir la version suivante. C'est bien quand l'enchaînement de ces étapes est automatisé. Le processus automatisé de publication d'une nouvelle version d'un projet informatique lui-même est appelé Intégration continue. ConstruireBot s'est avéré être un bon assistant pour nous dans la mise en œuvre de ce processus.

Dans cet article, j'ai décidé de donner un aperçu des possibilités ConstruireBot. De quoi est capable ce logiciel ? Comment l’approcher et comment construire une RELATION DE TRAVAIL normale et EFFICACE avec lui ? Vous pouvez appliquer vous-même notre expérience en créant un service fonctionnel pour créer et tester votre projet sur votre machine.

Teneur

Teneur

1. Pourquoi BuildBot ?
2. Concept mené par BuildMaster
3. Installation
4. Premiers pas

5. Configuration. Recette étape par étape

5.1 BuildmasterConfig
travailleurs 5.2
5.3 changement_source
5.4 planificateurs

5.5 ConstruireFactory
5.6 constructeurs

6. Exemple de votre propre configuration

6.1 En route vers votre master.cfg
6.2 Travailler avec svn
6.3 Lettre à vous : les journalistes sont autorisés à déclarer

Nous l'avons fait! Toutes nos félicitations

1. Pourquoi BuildBot ?

Précédemment sur habr-e, je suis tombé sur des articles sur la mise en œuvre Intégration continue en utilisant ConstruireBot... Par exemple, celui-ci Je l'ai trouvé le plus instructif. Il y a un autre exemple - plus simple. Ces articles peuvent être assaisonnés exemple du manuelEt это après cela, en anglais. Le coupé constitue un bon point de départ. Après avoir lu ces articles, vous voudrez probablement immédiatement quelque chose sur ConstruireBot faire

Arrêt! Quelqu'un l'a-t-il réellement utilisé dans ses projets ? Il s'avère que oui beaucoup l'appliquaient dans leurs tâches. Peut être trouvé des exemples utiliser ConstruireBot et dans les archives de codes Google.

Alors, quelle est la logique des gens qui utilisent Robot de construction? Après tout, il existe d'autres outils : Cruisecontrol и Jenkins. Je vais répondre de cette façon. Pour la plupart des tâches Jenkins et la vérité suffira. À son tour, ConstruireBot - plus adaptatif, alors que les problèmes y sont résolus aussi simplement que dans Jenkins. Le choix t'appartient. Mais puisque nous recherchons un outil pour un projet cible en développement, pourquoi ne pas en choisir un qui permettra, à partir d'étapes simples, d'obtenir un système de build doté d'une interactivité et 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 possède une interface claire au niveau du langage utilisé dans le projet ? Et maintenant il est temps de présenter les avantages ConstruireBot.

Donc, notre « quatuor instrumental ». Pour ma part, j'ai identifié quatre caractéristiques ConstruireBot:

  1. C'est un framework open source sous licence GPL
  2. Il s'agit de l'utilisation de Python comme outil de configuration et de la description des actions requises
  3. C'est l'occasion de recevoir une réponse de la machine sur laquelle s'effectue le montage
  4. Ce sont enfin les exigences minimales pour un hôte. Le déploiement nécessite Python et Twisted, et ne nécessite pas de machine virtuelle ni de machine Java.

2. Concept mené par BuildMaster

Un exemple d'implémentation d'intégration continue avec BuildBot

Au cœur de l’architecture de répartition des tâches se trouve Maître de construction. C'est un service qui :

  • garde la trace changements dans l'arborescence des sources du projet
  • envoie commandes qui doivent être exécutées par le service Worker pour construire le projet et le tester
  • notifie les utilisateurs sur les résultats des actions entreprises

Maître de construction configuré via un fichier maître.cfg. Ce fichier est à la racine Maître de construction. Plus tard, je montrerai comment cette racine est créée. Le fichier lui-même maître.cfg contient un script python qui utilise des appels ConstruireBot.

Objet suivant le plus important ConstruireBot Il a un nom Ouvrier. Ce service peut être lancé sur un autre hôte avec un OS différent, ou peut-être sur celui où Maître de construction. 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 tels que virtualenv, venv.

Maître de construction diffuse des commandes à tout le monde Ouvrier-y, et lui, à son tour, les remplit. Autrement dit, il s'avère que le processus de construction et de test d'un projet peut se poursuivre Ouvrier-e exécutant Windows et sur un autre Worker exécutant Linux.

Paiement les codes sources du projet se produisent sur chaque Ouvriereh

3. Installation

Alors allons-y. J'utiliserai Ubuntu 18.04 comme hôte. je vais en mettre un dessus Maître de construction-un et un Ouvrier-un. 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 procéder comme 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

La prochaine étape consiste à installer Tweeté и ConstruireBot, ainsi que des packages qui vous permettent d'utiliser des fonctionnalités supplémentaires ConstruireBot-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. Premiers pas

Il est temps de créer Maître de construction. Ce sera dans notre dossier /home/habr/maître.

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

L'étape suivante. Créons Ouvrier. Ce sera dans notre dossier /home/habr/travailleur.

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

Quand tu cours Ouvrier, alors par défaut, il sera créé dans /home/habr/travailleur dossier avec le nom du projet, qui est spécifié dans maître.cfg. Et dans le dossier portant le nom du projet, il créera un répertoire construire, et je continuerai à le faire caisse. Répertoire de travail pour Ouvrier-et ça deviendra un répertoire /home/habr/votreProjet/build.

"Clé d'Or
Et maintenant ce pour quoi j'ai écrit le paragraphe précédent : un script qui Master exigera de Ouvrier-et effectué à distance dans ce répertoire ne sera pas exécuté car le script n'a pas les autorisations pour s'exécuter. Pour corriger la situation, vous aurez besoin d'une clé --umask=0o22, qui interdit d'écrire dans ce répertoire, mais conservera les droits de lancement. Et c'est tout ce dont nous avons besoin.

Maître de construction и Ouvrier établir une connexion les uns avec les autres. Il arrive qu'il se brise et Ouvrier j'attends un certain temps une réponse de Maître de construction-UN. S'il n'y a pas de réponse, la connexion est redémarrée. Clé --keepalive=60 il suffisait juste d'indiquer l'heure après laquelle connect redémarre.

5. Configuration. Recette étape par étape

Configuration Maître de construction s'effectue du côté de la machine où l'on a exécuté la commande créer-maître. Dans notre cas, il s'agit d'un répertoire /home/habr/maître. Fichier de configuration maître.cfg n'existe pas encore, mais la commande elle-même a déjà créé le fichier maître.cmg.sample. Vous devez le renommer en master.cfg.sample в maître.cfg

mv master.cfg.sample master.cfg

Ouvrons celui-ci maître.cfg. Et regardons en quoi cela consiste. Et après cela, essayons de créer notre propre fichier de configuration.

maître.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 BuildmasterConfig

c = BuildmasterConfig = {} 

BuildmasterConfig — dictionnaire de base du fichier de configuration. Il doit être inclus dans le fichier de configuration. Pour faciliter l'utilisation, un alias est introduit dans le code de configuration "c"... Noms clés в c["cléDeDist"] sont des éléments fixes pour interagir avec Maître de construction. Pour chaque clé, l'objet correspondant est substitué comme valeur.

travailleurs 5.2

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

Cette fois, nous indiquons Maître de construction-y liste de Ouvrier-s. Moi-même Ouvrier nous avons créé au-dessus, indiquant votre-nom-du-travailleur и Mot de passe. Maintenant, ils doivent être spécifiés à la place exemple-travailleur и pass .

5.3 changement_source

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

Par clé changement_source dictionnaire c, nous avons accès à la liste où nous voulons mettre un objet qui interroge le référentiel avec le code source du projet. L'exemple utilise un référentiel Git interrogé à certains intervalles.

Le premier argument est le chemin d'accès à votre référentiel.

répertoire de travail représente le chemin d'accès au dossier où sur le côté Ouvrier-a relatif au chemin /home/habr/worker/votreProjet/build git stockera la version locale du référentiel.

une succursale contient une branche spécifique dans le référentiel qui doit être suivie.

Intervalle de sondage contient le nombre de secondes après lesquelles Maître de construction interrogera le référentiel pour les modifications.

Il existe plusieurs méthodes pour suivre les modifications apportées au référentiel d'un projet.

La méthode la plus simple est Vote, ce qui implique que Maître de construction interroge périodiquement le serveur avec le référentiel. Si commettre reflété les changements dans le référentiel, puis Maître de construction créera un objet interne avec un certain retard Modifier et envoyez-le au gestionnaire d'événements Planificateur, qui lancera les étapes de construction et de test du projet sur Ouvrier-e. Parmi ces étapes seront indiquées Mise à jour dépôt. Exactement sur OuvrierCela créera une copie locale du référentiel. Les détails de ce processus seront abordés ci-dessous dans les deux sections suivantes. (5.4 и 5.5).

Une méthode encore plus élégante pour suivre les modifications apportées à un référentiel consiste à envoyer des messages directement depuis le serveur qui l'héberge vers Maître de construction- sur la modification des codes sources du projet. Dans ce cas, dès que le développeur fait commettre, le serveur avec le référentiel du projet enverra un message Maître de construction-y. Et lui, à son tour, l'interceptera en créant un objet PBChangeSource. Ensuite, cet objet sera transféré vers Planificateur, qui active les étapes pour construire le projet et le tester. Une partie importante de cette méthode consiste à travailler avec crochet-scripts de serveur dans le référentiel. Dans le scénario crochet-a, responsable du traitement des actions lorsque commettre-e, vous devez appeler l'utilitaire envoyerchanger et précisez l'adresse réseau Maître de construction-UN. Vous devez également spécifier le port réseau qui écoutera PBChangeSource. PBChangeSource, d'ailleurs, fait partie Maître de construction-UN. Cette méthode nécessitera une autorisation admin-a sur le serveur où se trouve le référentiel du projet. Vous devrez d'abord faire une sauvegarde du référentiel.

5.4 planificateurs


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"]))

planificateurs – c’est un élément qui fait office de déclencheur qui démarre toute la chaîne d’assemblage et de test du projet.
Un exemple d'implémentation d'intégration continue avec BuildBot

Les changements qui ont été enregistrés changement_source, transformé au cours du travail ConstruireBot-a pour s'opposer Modifier et maintenant chaque Planificateur sur cette base, il crée des demandes pour démarrer le processus de construction du projet. Cependant, il détermine également le moment où ces demandes sont transférées vers la file d'attente. Un objet Constructeur stocke une file d'attente de requêtes et suit l'état de l'assembly actuel sur un Ouvrier-est. Constructeur existe sur Maître de construction-e et ainsi de suite Ouvrier-e. Il envoie avec Maître de construction-un sur Ouvrier-et déjà précis construire - une série d'étapes à suivre.
Nous voyons que dans l'exemple actuel tel planificateurs 2 pièces sont créées. De plus, chacun a son propre type.

Planificateur de branche unique – l’un des cours les plus populaires du programme. Il surveille une branche et est déclenché par un changement enregistré dans celle-ci. Lorsqu'il constate des changements, il peut retarder l'envoi de la demande de build (différer pendant la période spécifiée dans le paramètre spécial arbreStableTimer) Dans prénom définit le nom du planning qui sera affiché dans ConstruireBot-interface Web. DANS Changer le filtre un filtre est défini, après passage duquel les modifications dans la branche incitent le planning à envoyer une demande de construction. DANS Noms du constructeur le nom est indiqué constructeur-a, que nous définirons un peu plus tard. Le nom dans notre cas sera le même que le nom du projet : votre projet.

Planificateur de force une chose très simple. Ce type de planning est déclenché par un clic de souris ConstruireBot-interface Web. Les paramètres ont la même essence que dans Planificateur de branche unique.

PS n°3. Peut-être que ça sera utile
Périodique est un programme qui s'exécute à une certaine fréquence fixe. L'appel ressemble à ceci


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

5.5 ConstruireFactory


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": "."}))

périodiqueBuildTimer précise l'heure de cette périodicité en secondes.

ConstruireUsine crée un spécifique construire, qui alors constructeur envoie à Ouvrier. la ConstruireUsine indique les étapes à suivre Ouvrier-y. Les étapes sont ajoutées en appelant la méthode ajouter une étape

La première étape ajoutée dans cet exemple est git clean -d -f -f –xpuis git caisse. Ces actions sont incluses dans le paramètre méthode, ce qui n'est pas clairement indiqué mais implique une valeur par défaut à la main. Paramètre mode='incrémental' indique que les fichiers proviennent du répertoire où se trouve le caisse, bien qu'absents du référentiel, restent intacts.

La deuxième étape ajoutée consiste à appeler le script procès avec paramètre hello sur le côté Ouvrier-a du répertoire /home/habr/worker/votreProjet/build avec la variable d'environnement PATHONPATH=... Ainsi, vous pouvez écrire vos propres scripts et les exécuter en parallèle Ouvrier-à chaque étape util.ShellCommand. Ces scripts peuvent être placés directement dans le référentiel. Puis à caisse-e ils tomberont dans /home/habr/worker/votreProjet/build. Cependant, il y a deux « mais » :

  1. Ouvrier doit être créé avec une clé --umask afin qu'il ne bloque pas les droits d'exécution après caisse-a.
  2. à git push-e de ces scripts, vous devez spécifier la propriété exécutablepour que plus tard caisse-e n'a pas perdu le droit d'exécuter le script Git.

5.6 constructeurs


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

A propos de ce qui est Constructeur a été dit ici. Maintenant, je vais vous expliquer plus en détail comment le créer. BuilderConfig est un constructeur constructeur. De tels designers dans c['constructeurs'] vous pouvez en spécifier plusieurs, puisqu'il s'agit d'une feuille d'objets constructeur taper. Réécrivons maintenant l'exemple de ConstruireBot, le rapprochant de notre tâche.


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

Maintenant je vais vous parler des paramètres BuilderConfig.

prénom précise le nom constructeur-un. Ici, nous l'avons nommé votre projet... Cela signifie que sur Ouvrier- ce même chemin sera créé /home/habr/worker/votreProjet/build. Planificateur à la recherche de constructeur juste par ce nom.

noms des travailleurs contient une feuille Ouvrier-s. Chacun d'entre eux doit être ajouté à c['travailleurs'].

PERSONNEL - spécifique construire, auquel il est associé constructeur. Il enverra l'objet construire sur Ouvrier pour effectuer toutes les étapes incluses dans ce construire-a.

6. Exemple de votre propre configuration

Voici l'exemple d'architecture de projet que je propose de mettre en œuvre via ConstruireBot
.

Nous utiliserons comme système de contrôle de version svn. Le référentiel lui-même sera situé dans une sorte de cloud. Voici l'adresse de ce cloud svn.host/svn/votreProjet/trunk. Dans le nuage en dessous svn il y a un nom d'utilisateur de compte : utilisateur, mot de passe : Mot de passe. Scripts qui représentent des étapes construire-a sera également dans la branche svn, dans un dossier séparé buildbot/worker_linux. Ces scripts se trouvent dans le référentiel avec la propriété enregistrée exécutable.

Maître de construction и Ouvrier exécuter sur le même hôte projet.host .Maître de construction stocke ses fichiers dans un dossier /home/habr/maître. Ouvrier il est stocké dans le chemin suivant /home/habr/travailleur. Communication de processus Maître de construction-un je Ouvrier-a est effectué via le port 4000 selon le protocole ConstruireBot-a, c'est 'pb' protocole.

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 par e-mail indiquant que l'action a échoué.

Affichage Web ConstruireBot nous nous connecterons au port 80 pour projet.host. Il n'est pas nécessaire d'installer Apatch. Dans le cadre de la bibliothèque tordu il existe déjà un serveur web, ConstruireBot l'utilise.

Pour stocker des informations internes pour ConstruireBot ем использовать sqlite.

Un hébergeur est requis pour le mailing smtp.votre.domaine - il permet d'envoyer des lettres depuis la poste [email protected] sans authentification. Également sur l'hôte 'smtp « Le procès-verbal est entendu au poste 1025.

Deux personnes sont impliquées dans le processus : admin и utilisateur. l'administrateur administre ConstruireBot. l'utilisateur est la personne qui commet commettre-s.

Le fichier exécutable est généré via pyinstaller. La documentation est générée via doxygène.

Pour cette architecture, j'ai écrit ceci : maître.cfg:

maître.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"
}

Vous avez d'abord besoin créer Maître de construction-un je Ouvrier-un. Collez ensuite ce fichier maître.cfg в /home/habr/maître.

La prochaine étape consiste à démarrer le service Maître de constructionS


sudo buildbot start /home/habr/master

Puis démarrez le service Ouvrier-a


buildbot-worker start /home/habr/worker

Prêt! Maintenant Robot de construction suivra les changements et déclenchera commettre-y dans svn, en effectuant les étapes de construction et de test d'un projet avec l'architecture ci-dessus.

Ci-dessous, je décrirai quelques caractéristiques de ce qui précède maître.cfg.

6.1 En route vers votre master.cfg


En écrivant mon maître.cfg De nombreuses erreurs seront commises, la lecture du fichier journal sera donc nécessaire. Il est stocké comme Maître de construction-ec chemin absolu /home/habr/master/twistd.log, et sur le côté Ouvrier-a avec chemin absolu /home/habr/worker/twistd.log. Au fur et à mesure que vous lisez l'erreur et la corrigez, vous devrez redémarrer le service Maître de construction-un. 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)

Pour commencer, regardons svn_poller. Il s'agit toujours de la même interface, interrogeant régulièrement le référentiel une fois par minute. Dans ce cas svn_poller accède uniquement à la succursale tronc. Paramètre mystérieux split_file=util.svn.split_file_alwaystrunk définit les règles : comment diviser la structure des dossiers svn sur les branches. Il leur propose également des chemins relatifs. À son tour split_file_alwaystrunk simplifie le processus en disant que le référentiel ne contient que tronc.

В Planificateurs est indiqué Changer le filtrequi voit Aucun et y associe une branche tronc selon une association donnée à travers split_file_alwaystrunk. Répondre aux changements dans tronc, Lancements constructeur avec nom votre projet.

propriétés ici, il est nécessaire pour que l'administrateur reçoive les listes de diffusion des résultats de construction et de test en tant que propriétaire du processus.

Étape construire-a caisse capable de supprimer complètement tous les fichiers situés dans la version locale du référentiel Ouvrier-UN. Et puis fais le plein svn mise à jour. Le mode est configuré via le paramètre mode = complet, méthode = frais. Paramètre haltOnTailure dit que si svn mise à jour sera exécuté avec une erreur, alors l'ensemble du processus de construction et de test doit être suspendu, car d'autres actions n'ont aucun sens.

6.3 Lettre à vous : les journalistes sont autorisés à déclarer


journalistes est un service d'envoi de notifications par email.


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]

Il peut envoyer des messages différentes façons.

MailNotifier utilise le courrier électronique pour envoyer des notifications.

modèle_html définit le modèle de texte pour la newsletter. HTML est utilisé pour créer du balisage. Il est modifié par le moteur Jinja2 (peut être comparé à Django). ConstruireBot possède un ensemble de variables dont les valeurs sont remplacées dans le modèle pendant le processus de génération du texte du message. Ces variables sont entourées de {{ doubles accolades }}. Par exemple, résumé affiche l'état des opérations terminées, c'est-à-dire réussite ou échec. UN projets produira votre projet. Ainsi, en utilisant les commandes de contrôle dans Jinja2, variable ConstruireBot-a et les outils de formatage de chaîne python, vous pouvez créer un message très informatif.

MailNotifier contient les arguments suivants.

adresse de provenance – l’adresse à partir de laquelle chacun recevra la newsletter.

envoyer aux utilisateurs intéressés=True envoie un message au propriétaire et à l'utilisateur qui ont créé commettre.

rechercher — un suffixe qui doit être ajouté aux noms des utilisateurs recevant la newsletter. Donc admin comment l'utilisateur recevra la newsletter à l'adresse [email protected].

hôte de relais spécifie le nom d'hôte sur lequel le serveur est ouvert smtpun smptPort spécifie le numéro de port qui écoute smtp serveur.

mode="avertissement" dit que l'envoi ne doit être effectué que s'il y a au moins une étape construire-a, qui se termine par l'échec ou l'avertissement d'état. En cas de succès, il n’est pas nécessaire d’envoyer une newsletter.

extraDestinataires contient une liste des personnes à qui l'envoi doit être adressé en plus du propriétaire et de la personne qui a effectué l'envoi. commettre.

messageFormatter est un objet qui spécifie le format du message, son modèle et un ensemble de variables disponibles depuis Jinja2. Des options telles que WantProperties=Vrai и WantSteps = Vrai définir cet ensemble de variables disponibles.

avec['services']=[sendMessageToAll] fournit une liste de services, parmi lesquels le nôtre sera journaliste.

Nous l'avons fait! Toutes nos félicitations

Nous avons créé notre propre configuration et vu les fonctionnalités dont elle est capable. ConstruireBot. Cela, je pense, suffit pour comprendre si cet outil est nécessaire pour créer votre projet. Êtes-vous intéressé par lui? Est-ce que cela vous sera utile ? Est-il à l’aise de travailler avec lui ? Alors je n’écris pas cet article en vain.

Et plus loin. J'aimerais que la communauté professionnelle utilise ConstruireBot, s'est élargi, les manuels ont été traduits et il y a eu encore plus d'exemples.

Merci à tous pour votre attention. Bonne chance.

Source: habr.com

Ajouter un commentaire