Eine Beispielimplementierung von Continuous Integration mit BuildBot

Eine Beispielimplementierung von Continuous Integration mit BuildBot
(Bild von Computerisierer für pixabay)

Hallo!

Ich heiße Evgeniy CherkinIch bin Programmierer in einem Entwicklungsteam bei einem Bergbauunternehmen Polymetall.

Wenn Sie ein großes Projekt starten, denken Sie: „Welche Software eignet sich am besten für die Wartung?“ Ein IT-Projekt durchläuft mehrere Phasen, bevor die nächste Version veröffentlicht wird. Es ist gut, wenn die Kette dieser Phasen automatisiert ist. Der automatisierte Prozess der Veröffentlichung einer neuen Version eines IT-Projekts selbst wird als bezeichnet Kontinuierliche Integration. BuildBot erwies sich für uns als guter Helfer bei der Umsetzung dieses Prozesses.

In diesem Artikel habe ich beschlossen, einen Überblick über die Möglichkeiten zu geben BuildBot. Was kann diese Software? Wie kann man auf ihn zugehen und eine normale, effektive Arbeitsbeziehung mit ihm aufbauen? Sie können unsere Erfahrung selbst nutzen, indem Sie einen funktionierenden Service zum Erstellen und Testen Ihres Projekts auf Ihrer Maschine erstellen.

Inhalt

Inhalt

1. Warum BuildBot?
2. Konzept geleitet von BuildMaster
3. Installation
4. Erste Schritte

5. Konfiguration. Schritt-für-Schritt-Rezept

5.1 BuildmasterConfig
5.2 Arbeiter
5.3 change_source
5.4 Planer

5.5 BuildFactory
5.6 Bauherren

6. Beispiel Ihrer eigenen Konfiguration

6.1 Auf dem Weg zu Ihrer master.cfg
6.2 Arbeiten mit svn
6.3 Brief an Sie: Reporter sind zur Erklärung berechtigt

Wir haben es geschafft! Herzliche Glückwünsche

1. Warum BuildBot?

Zuvor bin ich auf habr-e auf Artikel über die Implementierung gestoßen Kontinuierliche Integration mit BuildBot. Zum Beispiel, dieser hier Ich fand es am informativsten. Es gibt noch ein anderes Beispiel - einfacher. Diese Artikel können gewürzt werden Beispiel aus dem HandbuchUnd es danach auf Englisch. Das Coupé ist ein guter Ausgangspunkt. Nachdem Sie diese Artikel gelesen haben, werden Sie wahrscheinlich sofort Lust auf etwas haben BuildBot zu tun.

Stoppen! Hat es tatsächlich jemand in seinen Projekten verwendet? Es stellt sich heraus, ja viele wendeten es in ihren Aufgaben an. Kann gefunden werden Beispiele verwenden BuildBot und in Google-Codearchiven.

Was ist also die Logik der Menschen? Baubot? Schließlich gibt es noch andere Tools: Tempomat и Jenkins. Ich werde so antworten. Für die meisten Aufgaben Jenkins und die Wahrheit wird genügen. Wiederum, BuildBot - adaptiver, während Probleme dort genauso einfach gelöst werden wie in Jenkins. Es ist deine Entscheidung. Aber da wir nach einem Tool für ein sich entwickelndes Zielprojekt suchen, warum nicht eines wählen, das es ermöglicht, ausgehend von einfachen Schritten ein Build-System zu erhalten, das über Interaktivität und eine einzigartige Schnittstelle verfügt.

Für diejenigen, deren Zielprojekt in Python geschrieben ist, stellt sich die Frage: „Warum nicht ein Integrationssystem wählen, das eine klare Schnittstelle hinsichtlich der im Projekt verwendeten Sprache hat?“ Und jetzt ist es an der Zeit, die Vorteile vorzustellen BuildBot.

Also unser „Instrumentalquartett“. Für mich selbst habe ich vier Merkmale identifiziert BuildBot:

  1. Es handelt sich um ein Open-Source-Framework unter der GPL-Lizenz
  2. Dies ist die Verwendung von Python als Konfigurationstool und die Beschreibung der erforderlichen Aktionen
  3. Dies ist eine Gelegenheit, eine Antwort von der Maschine zu erhalten, auf der die Montage stattfindet
  4. Dies sind schließlich die Mindestanforderungen für einen Host. Die Bereitstellung erfordert Python und Twisted und erfordert keine virtuelle Maschine und Java-Maschine.

2. Konzept geleitet von BuildMaster

Eine Beispielimplementierung von Continuous Integration mit BuildBot

Im Mittelpunkt der Aufgabenverteilungsarchitektur steht Baumeister. Es handelt sich um einen Dienst, der:

  • führt Buch Änderungen im Quellbaum des Projekts
  • sendet Befehle, die vom Worker-Dienst ausgeführt werden sollten, um das Projekt zu erstellen und zu testen
  • benachrichtigt Benutzer über die Ergebnisse der ergriffenen Maßnahmen

Baumeister per Datei konfiguriert master.cfg. Diese Datei befindet sich im Stammverzeichnis Baumeister. Später werde ich zeigen, wie diese Wurzel erstellt wird. Die Datei selbst master.cfg enthält ein Python-Skript, das Aufrufe verwendet BuildBot.

Das zweitwichtigste Objekt BuildBot Es hat einen Namen Arbeitnehmer. Dieser Dienst kann auf einem anderen Host mit einem anderen Betriebssystem gestartet werden, oder möglicherweise auf dem Host, auf dem Baumeister. Es kann auch in einer speziell vorbereiteten virtuellen Umgebung mit eigenen Paketen und Variablen existieren. Diese virtuellen Umgebungen können mit Python-Dienstprogrammen wie vorbereitet werden virtualenv, venv.

Baumeister sendet Befehle an alle Arbeitnehmer-y, und er wiederum erfüllt sie. Das heißt, es stellt sich heraus, dass der Prozess des Erstellens und Testens eines Projekts fortgesetzt werden kann Arbeitnehmer-e unter Windows und auf einem anderen Worker unter Linux.

Kasse Projektquellcodes sind jeweils vorhanden Arbeitnehmer-e.

3. Installation

So lass uns gehen. Ich werde Ubuntu 18.04 als Host verwenden. Ich werde eins darauf platzieren Baumeister-a und eins Arbeitnehmer-A. Aber zuerst müssen Sie Python3.7 installieren:

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

Für diejenigen, die Python3.7.2 anstelle von 3.7.1 benötigen, können Sie Folgendes tun:


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

Der nächste Schritt ist die Installation Getwittert и BuildBotsowie Pakete, mit denen Sie zusätzliche Funktionen nutzen können BuildBot-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. Erste Schritte

Zeit zum Schaffen Baumeister. Es wird in unserem Ordner sein /home/habr/master.

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

Nächster Schritt. Lasst uns kreieren Arbeitnehmer. Es wird in unserem Ordner sein /home/habr/worker.

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

Wenn du rennst Arbeitnehmer, dann wird es standardmäßig in erstellt /home/habr/worker Ordner mit dem Namen des Projekts, das in angegeben ist master.cfg. Und im Ordner mit dem Namen des Projekts wird ein Verzeichnis erstellt bauenund werde es auch weiterhin tun Kasse. Arbeitsverzeichnis für Arbeitnehmer-und es wird ein Verzeichnis /home/habr/yourProject/build.

"Goldener Schlüssel
Und nun, wofür ich den vorherigen Absatz geschrieben habe: ein Skript, das Master wird verlangen von Arbeitnehmer-und aus der Ferne in diesem Verzeichnis ausgeführt werden, werden nicht ausgeführt, da das Skript nicht über die Berechtigung zum Ausführen verfügt. Um die Situation zu korrigieren, benötigen Sie einen Schlüssel --umask=0o22, was das Schreiben in dieses Verzeichnis verbietet, aber die Startrechte behält. Und das ist alles, was wir brauchen.

Baumeister и Arbeitnehmer eine Verbindung zueinander herstellen. Es kommt vor, dass es abbricht und Arbeitnehmer Ich warte einige Zeit auf eine Antwort von Baumeister-A. Erfolgt keine Reaktion, wird die Verbindung neu gestartet. Schlüssel --keepalive=60 Es muss lediglich die Zeit angegeben werden, nach der es vergeht Connect startet neu.

5. Konfiguration. Schritt-für-Schritt-Rezept

Konfiguration Baumeister wird auf der Seite der Maschine ausgeführt, auf der wir den Befehl ausgeführt haben Create-Master. In unserem Fall handelt es sich um ein Verzeichnis /home/habr/master. Konfigurationsdatei master.cfg existiert noch nicht, aber der Befehl selbst hat die Datei bereits erstellt master.cmg.sample. Sie müssen es umbenennen master.cfg.sample в master.cfg

mv master.cfg.sample master.cfg

Lassen Sie uns dieses öffnen master.cfg. Und schauen wir uns an, woraus es besteht. Und danach versuchen wir, unsere eigene Konfigurationsdatei zu erstellen.

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.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 – Basiswörterbuch der Konfigurationsdatei. Es muss in der Konfigurationsdatei enthalten sein. Zur Vereinfachung der Verwendung wird im Konfigurationscode ein Alias ​​eingeführt "gegen"... Namen ключей в c["keyFromDist"] sind feste Elemente zur Interaktion mit Baumeister. Für jeden Schlüssel wird das entsprechende Objekt als Wert ersetzt.

5.2 Arbeiter

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

Diesmal geben wir an Baumeister-y Liste von Arbeitnehmer-S. Ich selbst Arbeitnehmer wir kreierten oben, anzeigt Ihr-Arbeiter-Name и Passwort. Jetzt müssen sie stattdessen angegeben werden Beispielarbeiter и passieren .

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

Per Schlüssel change_source Wörterbuch c erhalten wir Zugriff auf die Liste, in der wir ein Objekt ablegen möchten, das das Repository mit dem Quellcode des Projekts abfragt. Das Beispiel verwendet ein Git-Repository, das in bestimmten Abständen abgefragt wird.

Das erste Argument ist der Pfad zu Ihrem Repository.

Arbeitsverzeichnis stellt den Pfad zum Ordner dar, wo auf der Seite Arbeitnehmer-a relativ zum Pfad /home/habr/worker/yourProject/build Git speichert die lokale Version des Repositorys.

Filiale enthält einen bestimmten Zweig im Repository, dem gefolgt werden sollte.

pollInterval enthält die Anzahl der Sekunden, nach denen Baumeister fragt das Repository nach Änderungen ab.

Es gibt verschiedene Methoden, um Änderungen am Repository eines Projekts zu verfolgen.

Die einfachste Methode ist Polling, was das impliziert Baumeister fragt den Server regelmäßig mit dem Repository ab. Wenn verpflichten spiegelte dann die Änderungen im Repository wider Baumeister erstellt mit einiger Verzögerung ein internes Objekt Change und senden Sie es an den Event-Handler Scheduler, wodurch die Schritte zum Erstellen und Testen des Projekts gestartet werden Arbeitnehmer-e. Unter diesen Schritten wird angegeben Aktualisierung Repository. Genau auf ArbeitnehmerDadurch wird eine lokale Kopie des Repositorys erstellt. Die Einzelheiten dieses Prozesses werden weiter unten in den nächsten beiden Abschnitten behandelt. (5.4 и 5.5).

Eine noch elegantere Methode, Änderungen an einem Repository zu verfolgen, besteht darin, Nachrichten direkt von dem Server zu senden, an den es gehostet wird Baumeister- über die Änderung der Quellcodes des Projekts. In diesem Fall, sobald der Entwickler dies vornimmt verpflichten, sendet der Server mit dem Projekt-Repository eine Nachricht Baumeister-y. Und er wiederum wird es abfangen, indem er ein Objekt erstellt PBChangeSource. Als nächstes wird dieses Objekt übertragen Scheduler, wodurch die Schritte zum Erstellen und Testen des Projekts aktiviert werden. Ein wichtiger Teil dieser Methode ist die Arbeit mit Haken-Server-Skripte im Repository. Im Drehbuch Haken-a, verantwortlich für die Verarbeitung von Aktionen, wenn verpflichten-e, Sie müssen das Dienstprogramm aufrufen sendchange und geben Sie die Netzwerkadresse an Baumeister-A. Sie müssen auch den Netzwerkport angeben, der lauscht PBChangeSource. PBChangeSource, ist übrigens ein Teil Baumeister-A. Für diese Methode ist eine Genehmigung erforderlich Administrator-a auf dem Server, auf dem sich das Projekt-Repository befindet. Sie müssen zunächst ein Backup des Repositorys erstellen.

5.4 Planer


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

Planer – Dies ist ein Element, das als Auslöser fungiert und die gesamte Montage- und Testkette des Projekts in Gang setzt.
Eine Beispielimplementierung von Continuous Integration mit BuildBot

Die Änderungen, die aufgezeichnet wurden change_source, im Arbeitsprozess verändert BuildBot-a um Einspruch zu erheben Change und jetzt alle Planer Auf dieser Grundlage werden Anforderungen erstellt, um den Projekterstellungsprozess zu starten. Es bestimmt jedoch auch, wann diese Anfragen weiter in die Warteschlange weitergeleitet werden. Ein Objekt Baumeister speichert eine Warteschlange mit Anforderungen und verfolgt den Status der aktuellen Assembly auf einer separaten Arbeitnehmer-ist. Baumeister existiert auf Baumeister-e und so weiter Arbeitnehmer-e. Er sendet mit Baumeister-a auf Arbeitnehmer-und schon konkret bauen - eine Reihe von Schritten, die befolgt werden müssen.
Wir sehen das im aktuellen Beispiel wie z Planer Es entstehen 2 Stück. Darüber hinaus hat jeder seinen eigenen Typ.

SingleBranchScheduler – einer der beliebtesten Kurse im Stundenplan. Es überwacht einen Zweig und wird durch eine darin aufgezeichnete Änderung ausgelöst. Wenn er Änderungen sieht, kann er das Senden der Build-Anfrage verzögern (um den im speziellen Parameter angegebenen Zeitraum verschieben). treeStableTimer) In Name Legt den Namen des Zeitplans fest, der angezeigt wird BuildBot-Webschnittstelle. IN ChangeFilter Es wird ein Filter gesetzt, nach dessen Bestehen Änderungen in der Verzweigung den Zeitplan dazu veranlassen, eine Bauanfrage zu senden. IN BuilderNames Name ist angegeben Baumeister-a, das wir etwas später festlegen werden. Der Name ist in unserem Fall derselbe wie der Projektname: dein Projekt.

ForceScheduler eine ganz einfache Sache. Diese Art von Zeitplan wird durch einen Mausklick ausgelöst BuildBot-Webschnittstelle. Die Parameter haben das gleiche Wesen wie in SingleBranchScheduler.

PS Nr. 3. Vielleicht ist es nützlich
Periodisch ist ein Zeitplan, der in einer bestimmten zeitlich festgelegten Häufigkeit ausgeführt wird. Der Anruf sieht in etwa so aus


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

periodicBuildTimer gibt die Zeit dieser Periodizität in Sekunden an.

BuildFactory schafft ein bestimmtes bauen, was dann Baumeister sendet an Arbeitnehmer. In BuildFactory gibt die zu befolgenden Schritte an Arbeitnehmer-y. Schritte werden durch den Aufruf der Methode hinzugefügt addStep

Der erste hinzugefügte Schritt in diesem Beispiel ist git clean -d -f -f –xDann Git Checkout. Diese Aktionen sind im Parameter enthalten Methode, was nicht klar angegeben ist, aber einen Standardwert impliziert frisch. Parameter mode='inkrementell' gibt an, dass die Dateien aus dem Verzeichnis stammen, in dem sich die Dateien befinden Kasse, obwohl sie im Repository fehlen, bleiben unberührt.

Der zweite hinzugefügte Schritt ist das Aufrufen des Skripts Versuch mit Parameter HELLO auf der Seite Arbeitnehmer-a aus dem Verzeichnis /home/habr/worker/yourProject/build mit der Umgebungsvariablen PATHONPATH=... So können Sie eigene Skripte schreiben und diese nebenbei ausführen Arbeitnehmer-a jeder Schritt util.ShellCommand. Diese Skripte können direkt im Repository abgelegt werden. Dann um Kasse-e, in die sie fallen werden /home/habr/worker/yourProject/build. Allerdings gibt es dann zwei „Aber“:

  1. Arbeitnehmer muss mit einem Schlüssel erstellt werden --umask damit die Ausführungsrechte danach nicht blockiert werden Kasse-a.
  2. bei Git drücken-e dieser Skripte müssen Sie die Eigenschaft angeben ausführbardamit später Kasse-e hat das Recht, das Git-Skript auszuführen, nicht verloren.

5.6 Bauherren


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

Darüber, was es ist Baumeister wurde gesagt hier. Jetzt erzähle ich Ihnen genauer, wie Sie es erstellen. BuilderConfig ist ein Konstruktor Baumeister. Solche Designer in c['builders'] Sie können mehrere angeben, da es sich um ein Blatt mit Objekten handelt Baumeister Typ. Schreiben wir nun das Beispiel von um BuildBot, was es unserer Aufgabe näher bringt.


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

Jetzt erzähle ich Ihnen etwas über die Parameter BuilderConfig.

Name gibt den Namen an Baumeister-A. Hier haben wir es benannt dein Projekt. Das bedeutet, dass auf Arbeitnehmer- genau dieser Weg wird geschaffen /home/habr/worker/yourProject/build. Planer Auf der Suche nach Baumeister nur mit diesem Namen.

Arbeiternamen enthält Blatt Arbeitnehmer-S. Jedes davon muss ergänzt werden c['Arbeiter'].

Fabrik - Spezifisch bauen, mit dem es verbunden ist Baumeister. Er wird das Objekt verschicken bauen auf Arbeitnehmer um alle darin enthaltenen Schritte abzuschließen bauen-a.

6. Beispiel Ihrer eigenen Konfiguration

Hier ist die Beispielprojektarchitektur, über die ich vorschlage, sie zu implementieren BuildBot
.

Wir werden es als Versionskontrollsystem verwenden svn. Das Repository selbst wird sich in einer Art Cloud befinden. Hier ist die Adresse dieser Cloud svn.host/svn/yourProject/trunk. In der Wolke darunter svn Es gibt einen Kontobenutzernamen: Benutzer, Passwort: Passwort. Skripte, die Schritte darstellen bauen-a wird auch in der Filiale sein svn, in einem separaten Ordner buildbot/worker_linux. Diese Skripte befinden sich im Repository mit der gespeicherten Eigenschaft ausführbar.

Baumeister и Arbeitnehmer auf dem gleichen Host laufen project.host .Baumeister speichert seine Dateien in einem Ordner /home/habr/master. Arbeitnehmer Es wird im folgenden Pfad gespeichert /home/habr/worker. Prozesskommunikation Baumeister-a und Arbeitnehmer-a wird gemäß Protokoll über Port 4000 ausgeführt BuildBot-a, das ist 'pb' Protokoll.

Das Zielprojekt ist vollständig in Python geschrieben. Die Aufgabe besteht darin, die Änderungen zu verfolgen, eine ausführbare Datei zu erstellen, eine Dokumentation zu erstellen und Tests durchzuführen. Im Falle eines Fehlers müssen alle Entwickler per E-Mail eine Nachricht senden, dass eine Aktion nicht erfolgreich war.

Web-Anzeige BuildBot Wir werden uns mit Port 80 verbinden project.host. Es ist nicht notwendig, Apatch zu installieren. Als Teil der Bibliothek verdreht es gibt bereits einen Webserver, BuildBot nutzt es.

Zum Speichern interner Informationen für BuildBot удем использовать SQLite.

Für den Mailing ist ein Host erforderlich smtp.Ihre.Domain - Es ermöglicht das Versenden von Briefen per Post [E-Mail geschützt] ohne Authentifizierung. Auch auf dem Host 'smtp „Das Protokoll wird unter Posten 1025 verhandelt.

An dem Prozess sind zwei Personen beteiligt: Administrator и Benutzer. Admin verwaltet BuildBot. Der Benutzer ist die Person, die etwas tut verpflichten-S.

Die ausführbare Datei wird über generiert Pyinstaller. Die Dokumentation erfolgt über Sauerstoff.

Für diese Architektur habe ich Folgendes geschrieben: 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="[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"
}

Zuerst brauchst du создать Baumeister-a und Arbeitnehmer-A. Fügen Sie dann diese Datei ein master.cfg в /home/habr/master.

Der nächste Schritt besteht darin, den Dienst zu starten Baumeister-a


sudo buildbot start /home/habr/master

Starten Sie dann den Dienst Arbeitnehmer-a


buildbot-worker start /home/habr/worker

Bereit! Jetzt Baubot wird Änderungen verfolgen und auslösen verpflichten-y rein svn, Durchführen der Schritte zum Erstellen und Testen eines Projekts mit der oben genannten Architektur.

Im Folgenden werde ich einige der oben genannten Funktionen beschreiben master.cfg.

6.1 Auf dem Weg zu Ihrer master.cfg


Während ich meine schreibe master.cfg Es werden viele Fehler gemacht, daher ist das Lesen der Protokolldatei erforderlich. Es wird gespeichert als Baumeister-ec absoluter Pfad /home/habr/master/twistd.log, und auf der Seite Arbeitnehmer-a mit absolutem Pfad /home/habr/worker/twistd.log. Wenn Sie den Fehler gelesen und behoben haben, müssen Sie den Dienst neu starten Baumeister-A. So wird es gemacht:


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

6.2 Arbeiten mit 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)

Werfen wir zunächst einen Blick darauf svn_poller. Dies ist immer noch dieselbe Schnittstelle, die das Repository regelmäßig einmal pro Minute abfragt. In diesem Fall svn_poller greift nur auf die Filiale zu Kofferraum. Geheimnisvoller Parameter split_file=util.svn.split_file_alwaystrunk legt die Regeln fest: wie man die Ordnerstruktur auflöst svn auf den Ästen. Er bietet ihnen auch relative Pfade an. Wiederum split_file_alwaystrunk vereinfacht den Prozess, indem es besagt, dass das Repository nur enthält Kofferraum.

В Scheduler angezeigt wird ChangeFilterWer sieht Andere und ordnet ihm einen Zweig zu Kofferraum entsprechend einer gegebenen Assoziation durch split_file_alwaystrunk. Auf Veränderungen reagieren Kofferraum, Startet Baumeister mit Namen dein Projekt.

immobilien Hier wird es benötigt, damit der Administrator als Eigentümer des Prozesses Mailinglisten mit Build- und Testergebnissen erhält.

Schritt bauen-a Kasse ist in der Lage, alle Dateien, die sich in der lokalen Version des Repositorys befinden, vollständig zu löschen Arbeitnehmer-A. Und dann das Ganze machen SVN-Aktualisierung. Der Modus wird über den Parameter konfiguriert Modus=voll, Methode=frisch. Parameter haltOnTailure sagt das, wenn SVN-Aktualisierung mit einem Fehler ausgeführt wird, sollte der gesamte Prozess des Erstellens und Testens angehalten werden, da weitere Aktionen keinen Sinn ergeben.

6.3 Brief an Sie: Reporter sind zur Erklärung berechtigt


Reporter ist ein Dienst zum Versenden von Benachrichtigungen per E-Mail.


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]

Er kann Nachrichten senden auf verschiedene Weise.

MailNotifier verwendet E-Mail zum Versenden von Benachrichtigungen.

template_html legt die Textvorlage für den Newsletter fest. HTML wird zum Erstellen von Markups verwendet. Es wird durch den Motor verändert Jinja2 (kann verglichen werden mit django). BuildBot verfügt über eine Reihe von Variablen, deren Werte während der Generierung des Nachrichtentextes in die Vorlage eingefügt werden. Diese Variablen sind in {{ doppelte geschweifte Klammern }} eingeschlossen. Zum Beispiel, Zusammenfassung Zeigt den Status abgeschlossener Vorgänge an, d. h. Erfolg oder Misserfolg. A Projekte wird ausgegeben dein Projekt. Verwenden Sie also Steuerbefehle in Jinja2, Variablen BuildBot-a und Python-Zeichenfolgenformatierungstools können Sie eine recht informative Nachricht erstellen.

MailNotifier enthält die folgenden Argumente.

fromaddr – die Adresse, von der jeder den Newsletter erhält.

sendToInterestedUsers=True sendet eine Nachricht an den Eigentümer und Benutzer, der die Nachricht erstellt hat verpflichten.

Nachschlagen – ein Suffix, das den Namen der Benutzer hinzugefügt werden muss, die den Newsletter erhalten. Also Administrator wie der Benutzer den Newsletter an die Adresse erhält [E-Mail geschützt] .

Relayhost Gibt den Hostnamen an, auf dem der Server geöffnet ist smtp, eine smptPort Gibt die Portnummer an, die lauscht smtp Server.

mode="Warnung" besagt, dass der Mailing nur erfolgen sollte, wenn es mindestens einen Schritt gibt bauen-a, die mit dem Status „Fehler“ oder „Warnung“ endete. Im Erfolgsfall entfällt der Versand eines Newsletters.

extraRecipients enthält neben dem Eigentümer und der Person, die das Mailing durchgeführt hat, auch eine Liste der Personen, an die das Mailing gesendet werden soll verpflichten.

messageFormatter ist ein Objekt, das das Nachrichtenformat, seine Vorlage und eine Reihe verfügbarer Variablen angibt Jinja2. Optionen wie wantProperties=True и wantSteps=True Definieren Sie diesen Satz verfügbarer Variablen.

with['services']=[sendMessageToAll] stellt eine Liste von Dienstleistungen bereit, darunter auch unsere Reporter.

Wir haben es geschafft! Herzliche Glückwünsche

Wir haben unsere eigene Konfiguration erstellt und die Funktionalität gesehen, die sie bietet. BuildBot. Ich denke, das reicht aus, um zu verstehen, ob dieses Tool zum Erstellen Ihres Projekts benötigt wird. Interessieren Sie sich für ihn? Wird es für Sie nützlich sein? Fühlt sich die Zusammenarbeit mit ihm angenehm? Dann schreibe ich diesen Artikel nicht umsonst.

Und weiter. Ich möchte die professionelle Gemeinschaft nutzen BuildBotwurde umfangreicher, Handbücher wurden übersetzt und es gab noch mehr Beispiele.

Vielen Dank für Ihre Aufmerksamkeit. Viel Glück.

Source: habr.com

Kommentar hinzufügen