 (Bild von Computerizer von Pixabay)
(Bild von Computerizer von Pixabay) 
Hallo!
Mein Name ist 
Evgeny Cherkin , ich bin Programmierer im Entwicklungsteam von 
Polymetal .
Wenn Sie ein Großprojekt starten, denken Sie: „Welche Software ist für die Wartung besser geeignet?“. Ein IT-Projekt vor der Veröffentlichung der nächsten Version durchläuft eine Reihe von Phasen. Es ist gut, wenn die Kette dieser Schritte automatisiert ist. Der automatisierte Prozess zum Freigeben einer neuen Version eines IT-Projekts wird als 
kontinuierliche Integration bezeichnet . 
BuildBot hat sich als guter Helfer für uns erwiesen und diesen Prozess implementiert.
In diesem Artikel habe ich beschlossen, einen Überblick über die Funktionen von 
BuildBot zu geben . Was kann diese Software? Wie kann man sich ihm nähern und wie kann man mit ihm eine normale EFFEKTIVE ARBEITSBEZIEHUNG aufbauen? Sie können unsere Erfahrung auch auf sich selbst anwenden, indem Sie auf Ihrer Maschine einen funktionierenden Service zum Zusammenstellen und Testen Ihres Projekts erstellen.
1. Warum ist BuildBot?
Früher bei habr-e bin ich auf Artikel zur Implementierung der 
kontinuierlichen Integration mit 
BuildBot gestoßen . Zum Beispiel schien mir dieser am informativsten. Es gibt noch ein anderes Beispiel - 
einfacher . Diese Artikel können mit 
einem Beispiel aus dem Handbuch gewürzt werden, und 
das ist danach in englischer Sprache. Das Coupé ist ein guter Ausgangspunkt. Nachdem Sie diese Artikel gelesen haben, möchten Sie wahrscheinlich 
sofort etwas auf 
BuildBot tun.
Hör auf! Hat es jemand in seinen Projekten verwendet? Es stellt sich heraus, ja, 
viele haben es in ihren Aufgaben angewendet. 
Beispiele für die Verwendung von 
BuildBot finden 
Sie in den Google- 
Codearchiven .
Was ist die Logik von Leuten, die 
Buildbot verwenden ? Immerhin gibt es noch andere Tools: 
CruiseControl und 
Jenkins . Ich werde so antworten. Für die meisten Aufgaben wird 
Jenkins wirklich ausreichen. 
BuildBot wiederum ist anpassungsfähiger und die dortigen Aufgaben lassen sich genauso einfach lösen wie in 
Jenkins . Wähle dich. Da wir jedoch nach einem Tool für ein sich entwickelndes Zielprojekt suchen, wählen Sie das Tool, mit dem wir ausgehend von einfachen Schritten ein Build-System mit Interaktivität und einer einzigartigen Benutzeroberfläche erstellen können.
Für diejenigen, deren Zielprojekt in Python geschrieben ist, stellt sich die Frage: „Warum nicht ein Integrationssystem wählen, das eine klare Schnittstelle in Bezug auf die im Projekt verwendete Sprache hat?“. Und dann ist es Zeit, die Vorteile von 
BuildBot vorzustellen .
Also unser „Instrumentalquartett“. Für mich selbst habe ich die vier Funktionen von BuildBot definiert :
- Dies ist ein Open Source Framework unter der GPL
- Hierbei wird Python als Konfigurationstool verwendet und die erforderlichen Aktionen beschrieben.
- Dies ist eine Gelegenheit, eine Antwort von der Maschine zu erhalten, auf der die Montage stattfindet.
- Dies sind schließlich die Mindestanforderungen für den Host. Die Bereitstellung erfordert Python und Twisted, und es ist keine virtuelle Maschine oder Java-Maschine erforderlich.
2. Konzept unter der Leitung von BuildMaster

Im Zentrum der Aufgabenverteilungsarchitektur steht 
BuildMaster . Es ist ein Dienst, der:
- Verfolgt Änderungen im Projektquellbaum
- Sendet die Befehle, die der Worker-Dienst ausführen soll, um ein Projekt zu erstellen und zu testen
- benachrichtigt Benutzer über die Ergebnisse der ergriffenen Maßnahmen
BuildMaster wird über die Datei 
master.cfg konfiguriert. Diese Datei befindet sich im Stammverzeichnis von 
BuildMaster . Später werde ich zeigen, wie diese Wurzel erstellt wird. Die Datei 
master.cfg selbst enthält Python, ein Skript, das 
BuildBot- Aufrufe verwendet.
Der 
nächstwichtigste BuildBot heißt 
Worker . Dieser Dienst kann auf einem anderen Host mit einem anderen Betriebssystem oder möglicherweise auf 
BuildMaster ausgeführt werden . Es kann auch in einer speziell vorbereiteten virtuellen Umgebung mit eigenen Paketen und Variablen vorhanden sein. Diese virtuellen Umgebungen können mit Python-Dienstprogrammen wie 
vertualenv, venv vorbereitet werden.
BuildMaster sendet Befehle an jeden 
Worker , der sie wiederum ausführt. Das heißt, es stellt sich heraus, dass der Prozess des Erstellens und Testens des Projekts unter Windows auf den Worker und unter Linux auf einen anderen Worker übertragen werden kann.
Das Auschecken des Projektquellcodes erfolgt bei jedem 
Worker .
3. Installation
Also lass uns gehen. Ich werde Ubuntu 18.04 als Host verwenden. Darauf werde ich einen 
BuildMaster -a und einen 
Worker -a platzieren. 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 von 
Twited und 
BuildBot sowie von Paketen, die zusätzliche 
BuildBot -a-Funktionen ermöglichen.
 /*   sudo        /usr/local/lib/python3.7/dist-packages*/  
4. Erste Schritte
Zeit, einen 
BuildMaster zu erstellen. Wir werden es im Ordner 
/ home / habr / master haben .
 mkdir master buildbot create-master master  
Der nächste Schritt. Erstellen Sie einen 
Worker . Wir werden es im Ordner 
/ home / habr / worker haben .
 mkdir worker buildbot-worker create-worker --umask=0o22 --keepalive=60 worker localhost:4000 yourWorkerName password 
Wenn Sie 
Worker starten, wird standardmäßig ein Ordner in 
/ home / habr / worker mit dem Namen des Projekts erstellt, der in 
master.cfg angegeben 
ist . In dem Ordner mit dem Namen des Projekts erstellt er das Erstellungsverzeichnis, und dann wird das 
Auschecken darin durchgeführt. Das Arbeitsverzeichnis für 
Worker ist das Verzeichnis 
/ home / habr / yourProject / build .
Goldener SchlüsselUnd nun zu dem, was ich im vorherigen Absatz geschrieben habe: Das Skript, das 
Worker vom Master remote in diesem Verzeichnis ausführen muss, wird nicht ausgeführt, da das Skript keine Berechtigung zum Ausführen hat. Um die Situation zu beheben, benötigen Sie einen Schlüssel 
--umask = 0o22 , wodurch das Schreiben in dieses Verzeichnis 
verboten wird , jedoch 
Startrechte verbleiben . Und das brauchen wir nur.
BuildMaster und 
Worker stellen eine Verbindung zwischen ihnen her. Es kommt vor, dass es abbricht und 
Worker einige Zeit auf eine Antwort von 
BuildMaster wartet. Wenn keine Antwort empfangen wird, wird die Verbindung neu gestartet. Der Schlüssel 
--keepalive = 60 ist genau das, was Sie benötigen, um die Zeit anzugeben, nach der die 
Verbindung neu gestartet wird.
5. Konfiguration. Schritt für Schritt Rezept
Die BuildMaster- Konfiguration erfolgt auf der Maschinenseite, wo wir den Befehl 
create-master ausgeführt haben. In unserem Fall ist dies das Verzeichnis 
/ home / habr / master . Die Konfigurationsdatei 
master.cfg ist noch nicht vorhanden, aber der Befehl selbst hat die Datei 
master.cmg.sample bereits erstellt. Sie müssen es in 
master.cfg.sample in 
master.cfg umbenennen mv master.cfg.sample master.cfg 
Öffnen 
wir diese 
master.cfg . Und wir werden analysieren, woraus es besteht. Danach versuchen wir, eine 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.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 - das Basiswörterbuch der Konfigurationsdatei. Es muss in der Konfigurationsdatei enthalten sein. Zur Vereinfachung der Verwendung wird der Alias 
"c" in den Konfigurationscode eingegeben. 
Schlüsselnamen in 
c ["keyFromDist"] sind feste Elemente für die Interaktion mit 
BuildMaster . Unter jedem Schlüssel wird das entsprechende Objekt als Wert ersetzt.
5.2 Arbeiter
 c['workers'] = [worker.Worker("example-worker", "pass")] 
Dieses Mal weisen wir auf die 
BuildMaster- Liste der 
Worker hin . Wir haben 
Worker oben erstellt, indem wir Ihren 
Worker -Namen und 
Ihr Passwort angegeben haben . Jetzt müssen sie anstelle von 
Beispielarbeiter angegeben und 
übergeben werden .
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)) 
Mit dem Schlüssel 
change_source des 
c- Wörterbuchs erhalten wir Zugriff auf die Liste, in der Sie das Objekt 
ablegen möchten, das das Repository mit 
dem Projektquellcode abfragt . In diesem Beispiel wird das Git-Repository verwendet, das in bestimmten Abständen abgefragt wird.
Das erste Argument ist der Pfad zu Ihrem Repository.
workdir ist der Pfad zu dem Ordner, in dem auf der 
Arbeiterseite relativ zum Pfad 
/ home / habr / worker / yourProject / build die lokale Version des Repositorys gespeichert wird.
Der Zweig enthält einen bestimmten Zweig im Repository, der überwacht werden soll.
pollInterval enthält die Anzahl der Sekunden, nach denen 
BuildMaster das Repository nach Änderungen 
abfragt .
Es gibt verschiedene Methoden, um Änderungen in einem Projekt-Repository zu verfolgen.
Die einfachste Methode ist 
Polling . 
Dies bedeutet, dass 
BuildMaster den Server regelmäßig mit dem Repository 
abfragt . Wenn das 
Festschreiben die Änderungen im Repository widerspiegelt, erstellt 
BuildMaster mit einiger Verzögerung ein internes 
Änderungsobjekt und sendet es an den 
Scheduler- Ereignishandler, der die Schritte zum Erstellen und Testen des Projekts in 
Worker startet. Unter diesen Schritten wird die 
Aktualisierung des Repositorys angezeigt. Auf 
Worker wird eine lokale Kopie des Repositorys erstellt. Details dieses Prozesses werden nachstehend in den nächsten beiden Abschnitten 
( 5.4 und 5.5 ) offenbart.
Eine noch elegantere Methode zum Verfolgen von Änderungen im Repository besteht darin, Nachrichten direkt von dem Server, auf dem es sich befindet, an 
BuildMaster zu 
senden, um die Quellcodes des Projekts zu 
ändern . In diesem Fall sendet der Server mit dem Projekt-Repository eine Nachricht an 
BuildMaster , sobald der Entwickler eine 
Festschreibung vornimmt . Und das wird wiederum durch das Erstellen eines 
PBChangeSource- Objekts abgefangen. Außerdem wird dieses Objekt an den 
Scheduler übertragen , der die Schritte für die Montage des Projekts und dessen Test aktiviert. Ein wichtiger Teil dieser Methode ist die Arbeit mit Server- 
Hook- Skripten im Repository. In dem 
Hook- Skript, das für die Verarbeitung von Aktionen während des 
Festschreibens verantwortlich ist, müssen Sie das Dienstprogramm 
sendchange aufrufen und die Netzwerkadresse von 
BuildMaster angeben . Sie müssen 
den Netzwerkport 
angeben, der PBChangeSource abhört . 
PBChangeSource ist übrigens Teil von 
BuildMaster . Diese Methode erfordert die Berechtigung 
admin -a auf dem Server, auf dem sich das Projektrepository befindet. Zuerst müssen Sie ein Backup-Repository erstellen.
5.4 Schuppen
 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"])) 
Scheduler ist ein Element, das als Auslöser fungiert und die gesamte Montage- und Testkette eines Projekts ausführt.

Die von 
change_source aufgezeichneten 
Änderungen wurden während des Vorgangs von 
BuildBot -a in das 
Change- Objekt konvertiert, und jetzt erstellt jeder 
darauf basierende 
Sheduler Anforderungen zum Starten des Projekterstellungsprozesses. Es wird jedoch auch festgelegt, wann diese Anforderungen an die Warteschlange gesendet werden sollen. Objekt 
Builder führt eine Anforderungswarteschlange und überwacht den Status der aktuellen Assembly auf einem separaten 
Worker -e. 
Builder ist 
sowohl für BuildMaster -e als auch für 
Worker -e vorhanden. Er sendet einen bestimmten 
Build von 
BuildMaster an 
Worker , eine Reihe von Schritten, die befolgt werden müssen.
Wir sehen, dass im aktuellen Beispiel solcher 
Scheduler 2 Teile erstellt werden. Darüber hinaus hat jeder seinen eigenen Typ.
SingleBranchScheduler ist eine der beliebtesten Zeitplanklassen. Es überwacht einen Zweig und wird durch eine aufgezeichnete Änderung in ihm ausgelöst. Wenn er die Änderungen sieht, kann er das Senden einer Konstruktionsanforderung verschieben (auf den im speziellen Parameter 
treeStableTimer angegebenen Zeitraum 
verschieben ). Der 
Name gibt den Namen des Zeitplans an, der in der 
BuildBot- Webschnittstelle angezeigt wird. In 
ChangeFilter wird ein 
Filter festgelegt, nachdem Änderungen in der Verzweigung den Zeitplan zum Senden einer Erstellungsanforderung 
auffordern . Der Name 
Builder -a wird in 
builderNames angegeben , die wir etwas später angeben werden. Der Name in unserem Fall entspricht dem Namen des Projekts: 
yourProject .
ForceScheduler ist eine sehr einfache Sache. Diese Art von Zeitplan wird durch einen Mausklick über die 
BuildBot- Web-Oberfläche ausgelöst. Parameter haben die gleiche Essenz wie in 
SingleBranchScheduler .
PS Nr. 3. Plötzlich nützlich seinPeriodisch ist ein Zeitplan, der mit einer bestimmten zeitlich festgelegten Frequenz ausgelöst wird. Es sieht aus wie ein Anruf wie dieser
 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 legt die Zeit dieser Periodizität in Sekunden fest.
BuildFactory erstellt einen konkreten 
Build , den der 
Builder dann an den 
Worker sendet. 
BuildFactory gibt die Schritte an, die ein 
Worker ausführen sollte. Schritte werden durch Aufrufen der 
addStep- Methode hinzugefügt 
. 
Der erste in diesem Beispiel hinzugefügte Schritt ist 
git clean -d -f -f –x und dann 
git checkout . Diese Aktionen sind in den 
Methodenparameter eingebettet, der nicht eindeutig angegeben ist, aber den Standardwert von 
fresh impliziert. Der Parameter 
mode = 'incremental' gibt an, dass die Dateien aus dem Verzeichnis, in dem das 
Cheechout durchgeführt wird, zwar im Repository fehlen, aber unberührt bleiben.
Der zweite hinzugefügte Schritt besteht darin, das 
Testskript mit dem Parameter " 
Hallo" auf der 
Arbeiterseite aus dem Verzeichnis 
/ home / habr / worker / yourProject / build mit der Umgebungsvariablen PATHONPATH = ... aufzurufen. Sie können also Ihre eigenen Skripte schreiben und sie auf der 
Arbeiterseite -a ausführen durch den Schritt 
util.ShellCommand . Diese Skripte können direkt in das Repository gestellt werden. Während des 
Cheechouts gehen sie dann zu 
/ home / habr / worker / yourProject / build . Dann gibt es jedoch zwei „Aber“:
- Worker muss mit dem Schalter --umask erstellt werden, damit die Ausführungsrechte nach dem Auschecken -a nicht blockiert werden.
- Wenn git diese Skripte pusht , muss die exacutable Eigenschaft angegeben werden, damit Git mit chechout -e nicht das Recht verliert, das Skript auszuführen.
5.6 Bauherren
 c['builders'] = [] c['builders'].append(util.BuilderConfig(name="runtests", workernames=["example-worker"], factory=factory)) 
Über was 
Builder hier beschrieben 
wurde . Jetzt werde ich ausführlicher darüber sprechen, wie es erstellt wird. 
BuilderConfig ist ein Konstruktor- 
Builder . Sie können in 
c ['Builder'] mehrere solcher Konstruktoren angeben, da dies eine Liste von Objekten vom Typ 
Builder ist . Jetzt werden wir das Beispiel aus 
BuildBot leicht umschreiben, um es unserer Aufgabe näher zu bringen.
 c['builders'] = [] c['builders'].append(util.BuilderConfig(name="yourProject", workernames=["yourWorkerName"], factory=factory)) 
Jetzt werde ich über die Parameter 
BuilderConfig erzählen.
name legt den Namensgenerator -a fest. Hier haben wir es 
yourProject genannt . Dies bedeutet, dass auf dem 
Worker genau dieser Pfad 
/ home / habr / worker / yourProject / build erstellt wird. 
Sheduler sucht nach einem 
Builder mit diesem Namen.
Arbeitsnamen enthält eine Liste der 
Arbeiter . Jedes davon muss zu 
c ['Arbeiter'] hinzugefügt werden.
Factory ist der spezifische 
Build, dem der 
Builder zugeordnet ist . Es wird ein 
Build- Objekt an 
Worker gesendet , um alle Schritte auszuführen, aus denen dieser 
Build -a besteht.
6. Beispiel einer eigenen Konfiguration
Hier ist die Architektur eines Beispielprojekts, das ich über 
BuildBot implementieren 
möchte 
.
Wir werden 
svn als Versionskontrollsystem verwenden. Das Repository selbst befindet sich in einer bestimmten Cloud. Hier ist die Adresse dieser Cloud 
svn.host/svn/yourProject/trunk . In der Cloud unter 
svn gibt es einen Benutzernamen: 
user , passwd: 
password account. Die Skripte, die die Schritte 
build -a darstellen, befinden sich auch im Zweig 
svn in einem separaten 
Ordner buildbot / worker_linux . Diese Skripte befinden sich im Repository, wobei die 
ausführbare Eigenschaft gespeichert ist.
BuildMaster und 
Worker arbeiten auf demselben 
project.host- Host. 
BuildMaster speichert seine Dateien im Ordner 
/ home / habr / master . 
Worker speichert den folgenden Pfad 
/ home / habr / worker . Die Kommunikation zwischen den 
BuildMaster- und 
Worker- Prozessen 
erfolgt über den 4000-Port unter Verwendung des 
BuildBot- a-Protokolls, 
dh des 
'pb'- Protokolls.
Das Zielprojekt ist vollständig in Python geschrieben. Die Aufgabe besteht darin, die Änderungen zu verfolgen, eine ausführbare Datei zu erstellen, Dokumentation zu erstellen und Tests durchzuführen. Im Fehlerfall müssen alle Entwickler eine Nachricht an die E-Mail senden, dass eine Aktion fehlgeschlagen ist.
Wir werden das 
BuildBot- Web-Mapping mit Port 80 für 
project.host verbinden . Apatch ist optional. Die 
verdrehte Bibliothek hat bereits einen Webserver, 
BuildBot verwendet ihn.
Wir werden 
SQLite verwenden, um interne Informationen für 
BuildBot zu speichern.
Zum Versenden benötigen Sie den Host 
smtp.your.domain - er ermöglicht das Senden von E-Mails von 
projectHost@your.domain ohne Authentifizierung. Auch auf dem Host ' 
smtp ' wird das Protokoll um 1025 abgehört.
An dem Prozess sind zwei Personen beteiligt: 
Administrator und 
Benutzer . admin verwaltet 
BuildBot . Benutzer ist die Person, die das 
Commit festlegt .
Eine austauschbare Datei wird über 
pyinstaller generiert. Die Dokumentation wird durch 
Sauerstoff erzeugt.
Für diese Architektur habe ich diese 
master.cfg geschrieben :
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" } 
 Zuerst müssen Sie 
BuildMaster und 
Worker -a 
erstellen . 
Fügen Sie dann diese Datei 
master.cfg in 
/ home / habr / master ein .
Der nächste Schritt ist das Starten des 
BuildMaster- Dienstes
 sudo buildbot start /home/habr/master 
Starten Sie dann den 
Worker -a-Dienst
 buildbot-worker start /home/habr/worker 
Fertig! Jetzt verfolgt 
Buildbot die Änderungen und 
führt sie beim 
Festschreiben in 
svn aus. Dabei werden die Schritte zum 
Erstellen und Testen des Projekts mit der oben genannten Architektur ausgeführt.
Im Folgenden werde ich einige Funktionen der obigen 
master.cfg beschreiben. 
6.1 Auf dem Weg zu Ihrem master.cfg
Beim Schreiben Ihrer 
master.cfg werden viele Fehler gemacht, sodass Sie die Protokolldatei lesen müssen. Es wird sowohl auf dem absoluten 
BuildMaster -ec-Pfad 
/home/habr/master/twistd.log als auch auf der 
Worker- Seite mit dem absoluten Pfad 
/home/habr/worker/twistd.log gespeichert . Wenn Sie den Fehler lesen und beheben, müssen Sie den 
BuildMaster -a-Dienst neu 
starten . So geht's:
 sudo buildbot stop /home/habr/master sudo buildbot upgrade-master /home/habr/master sudo buildbot start /home/habr/master 
6.2 Mit svn arbeiten
 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) 
Schauen Sie sich zunächst 
svn_poller an . Dies ist dieselbe Schnittstelle, die das Repository regelmäßig einmal pro Minute abfragt. In diesem Fall greift 
svn_poller nur auf den 
Trunk- Zweig zu. Der mysteriöse Parameter 
split_file = util.svn.split_file_alwaystrunk legt die Regeln fest: So teilen Sie die Struktur von 
SVN- Ordnern in Zweige auf. Er bietet ihnen relative Wege an. 
Split_file_alwaystrunk vereinfacht wiederum den Prozess, indem angegeben wird, dass sich nur 
Trunk im Repository befindet.
In 
Schedulern wird 
ChangeFilter angegeben , der 
None sieht und den 
Trunk- Zweig gemäß der angegebenen Zuordnung über 
split_file_alwaystrunk mit ihm 
verknüpft . Als Reaktion auf Änderungen im 
Trunk wird der 
Builder mit dem Namen 
yourProject gestartet .
Eigenschaften hier sind erforderlich, damit der Administrator den Newsletter von der Montage und den Testergebnissen als Eigentümer des Prozesses erhält.
Mit dem Schritt " 
Auschecken erstellen" können alle Dateien in der lokalen Version des 
Worker- Repositorys vollständig gelöscht werden. A 
Führen Sie dann das vollständige 
SVN-Update durch . Der Modus wird über den Parameter 
mode = full , 
method = fresh konfiguriert. Der Parameter 
haltOnTailure gibt an, dass bei nicht erfolgreichem 
svn-Update der gesamte Montage- und Testprozess angehalten werden sollte, da weitere Schritte keinen Sinn ergeben.
6.3 Ein Brief an Sie: Reporter sind berechtigt zu erklären
Reporter ist ein Mail-Benachrichtigungsdienst.
 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] 
Es kann Nachrichten auf 
viele Arten senden.
MailNotifier verwendet Mail, um Benachrichtigungen zu senden.
template_html legt die Textvorlage für den Newsletter fest. Verwenden Sie zum Erstellen von Markups HTML. Es wird von der 
jinja2- Engine modifiziert (kann mit 
django verglichen 
werden ). 
BuildBot verfügt über eine Reihe von Variablen, deren Werte beim 
Erstellen des Nachrichtentextes in die Vorlage eingesetzt werden. Diese Variablen sind in {{doppelte geschweifte Klammern}} eingeschrieben. So zeigt beispielsweise die 
Zusammenfassung den Status abgeschlossener Vorgänge an, d. H. Erfolg oder Misserfolg. Und 
Projekte geben 
yourProject aus . Mit Steuerbefehlen in 
jinja2 , 
BuildBot- Variablen und Python-String-Formatierern können Sie also eine sehr 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 das 
Commit durchgeführt hat .
Lookup - Suffix, das den Namen der Benutzer hinzugefügt wird, die den Newsletter erhalten. Der 
Administrator als Benutzer erhält den Newsletter unter admin@your.domain.
Relayhost gibt den Hostnamen an, auf dem der 
SMTP- Server geöffnet ist, und 
smptPort gibt die Portnummer an, die der 
SMTP- Server 
überwacht .
mode = "warning" besagt, dass das Mailing nur durchgeführt werden soll, wenn mindestens ein Build- Schritt mit einem Fehler- oder Warnstatus beendet wurde. Im Erfolgsfall ist kein Mailing erforderlich.extraRecipients enthält neben dem Eigentümer und der Person, die das Commit durchgeführt hat, eine Liste der Personen, an die das Mailing erfolgen soll .messageFormatter ist ein Objekt, das das Format der Nachricht, ihre Vorlage und die von jinja2 verfügbaren Variablen definiert . Parameter wie wantProperties = True und wantSteps = True geben diesen Satz verfügbarer Variablen an.with ['services'] = [sendMessageToAll] bietet eine Liste von Diensten, darunter unsereReporter .Wir haben es geschafft! Herzliche Glückwünsche
Wir haben unsere eigene Konfiguration erstellt und die Funktionalität von BuildBot erkannt . Ich denke, dies reicht aus, um zu verstehen, ob dieses Tool zum Erstellen Ihres Projekts benötigt wird. Ist er für dich interessant? Wird es für Sie nützlich sein? Ist es bequem, damit zu arbeiten? Dann schreibe ich diesen Artikel aus gutem Grund.Und noch etwas.
Ich möchte, dass die professionelle Community, die BuildBot verwendet , breiter wird, Handbücher übersetzt und weitere Beispiele.Vielen Dank für Ihre Aufmerksamkeit. Viel Glück.