E Beispill fir d'Ëmsetzung vun der kontinuéierlecher Integratioun mat BuildBot

E Beispill fir d'Ëmsetzung vun der kontinuéierlecher Integratioun mat BuildBot
(Bild vum Computerizer aus Pixabay)

Hallo!

Mäi Numm ass Evgeniy Cherkin, Ech sinn e Programméierer op engem Entwécklungsteam bei enger Miningfirma Polymetall.

Wann Dir e grousse Projet ufänkt, fänkt Dir un ze denken: "Wéi eng Software ass am Beschten ze benotzen fir se ze servéieren?" En IT-Projet geet duerch eng Rei Etappen ier déi nächst Versioun verëffentlecht gëtt. Et ass gutt wann d'Kette vun dësen Etappen automatiséiert ass. Den automatiséierte Prozess fir eng nei Versioun vun engem IT-Projet selwer ze verëffentlechen gëtt genannt Kontinuitéit Integratioun. BuildBot huet sech als e gudden Assistent fir eis bei der Ëmsetzung vun dësem Prozess erausgestallt.

An dësem Artikel hunn ech decidéiert en Iwwerbléck iwwer d'Méiglechkeeten ze ginn BuildBot. Wat ass dës Software kapabel? Wéi kënnt hien un a wéi eng normal EFFEKTIV SCHAFFTSRELATIOUN mat him opzebauen? Dir kënnt eis Erfahrung selwer uwenden andeems Dir en Aarbechtsservice erstellt fir Äre Projet op Ärer Maschinn ze bauen an ze testen.

Inhalt

Inhalt

1. Firwat BuildBot?
2. Konzept gefouert vun BuildMaster
3. Installatioun
4. Éischt Schrëtt

5. Configuratioun. Schrëtt fir Schrëtt Rezept

5.1 BuildmasterConfig
5.2 Aarbechter
5.3 change_source
5.4 Scheduler

5.5 BuildFactory
5.6 Bauhären

6. Beispill vun Ärer eegener Configuratioun

6.1 Um Wee op Är Meeschtesch.cfg
6.2 Schafft mat svn
6.3 Bréif un Iech: Reporter sinn autoriséiert ze erklären

Mir hunn et gemaach! Gratulatioun

1. Firwat BuildBot?

Virdrun op habr-e koum ech op Artikelen iwwer Ëmsetzung Kontinuitéit Integratioun benotzen BuildBotAn. Zum Beispill dësen Ech hunn et am meeschte informativ fonnt. Et gëtt en anert Beispill - méi einfach. Dës Artikele kënnen erwiermt ginn Beispill aus dem Handbuchan et duerno, op Englesch. De Coupe mécht e gudde Startpunkt. Nodeems Dir dës Artikelen gelies hutt, wëllt Dir wahrscheinlech direkt eppes op BuildBot ze maachen.

Stop! Huet iergendeen et tatsächlech an hire Projete benotzt? Et stellt sech eraus jo vill et an hiren Aufgaben applizéiert hunn. Kann fonnt ginn Beispiller Notzung vun BuildBot an am Google Code Archiver.

Also wat ass d'Logik vu Leit déi benotzen Buildbot? No allem ginn et aner Tools: CruiseControl и Jenkins. Ech wäert dës Manéier äntweren. Fir déi meescht Aufgaben Jenkins an d'Wourecht wäert genuch sinn. Am Tour, BuildBot - méi adaptiv, wärend d'Problemer do sou einfach geléist ginn wéi an Jenkins. De Choix ass ären. Mä well mir sichen no engem Instrument fir eng Entwécklung Zil- Projet, firwat net een wielen, datt aus einfach Schrëtt wäert erlaben, e bauen System ze kréien, datt Interaktivitéit an eng eenzegaarteg Interface huet.

Fir déi, deenen hiren Zilprojet am Python geschriwwe gëtt, stellt sech d'Fro: "Firwat net en Integratiounssystem wielen deen eng kloer Interface huet wat d'Sprooch am Projet benotzt?" An elo ass et Zäit d'Virdeeler ze presentéieren BuildBot.

Also eisen "Instrumentalquartett". Fir mech hunn ech véier Features identifizéiert BuildBot:

  1. Et ass en Open Source Kader ënner GPL Lizenz
  2. Dëst ass d'Benotzung vu Python als Konfiguratiounsinstrument a Beschreiwung vun den erfuerderlechen Aktiounen
  3. Dëst ass eng Geleeënheet eng Äntwert vun der Maschinn ze kréien, op där d'Versammlung stattfënnt
  4. Dëst sinn endlech d'Mindestfuerderunge fir en Host. Deployment erfuerdert Python a verdreift, a brauch keng virtuell Maschinn an Java Maschinn.

2. Konzept gefouert vun BuildMaster

E Beispill fir d'Ëmsetzung vun der kontinuéierlecher Integratioun mat BuildBot

Zentral zu der Aufgab Verdeelung Architektur ass BuildMaster. Et ass e Service deen:

  • hält Streck Ännerungen am Projet Quell Bam
  • schéckt Kommandoen déi vum Worker Service ausgefouert solle ginn fir de Projet ze bauen an ze testen
  • mellt Benotzer iwwer d'Resultater vun Aktiounen

BuildMaster via Fichier konfiguréiert master.cfg. Dëse Fichier ass an der Root BuildMaster. Méi spéit wäert ech weisen wéi dës Wuerzel erstallt gëtt. De Fichier selwer master.cfg enthält e Python Skript deen Uriff benotzt BuildBot.

Nächst wichtegst Objet BuildBot huet en Numm Aarbechter. Dëse Service kann op engem aneren Host mat engem aneren OS gestart ginn, oder vläicht op deem wou BuildMaster. Et kann och an engem speziell preparéierten virtuellen Ëmfeld mat sengen eegene Packagen a Variablen existéieren. Dës virtuell Ëmfeld kënne virbereet ginn mat Python Utilities wéi virtualenv, venv.

BuildMaster Sendt Kommandoe fir jiddereen Aarbechter-y, an hien, am Tour, erfëllt hinnen. Dat ass, et stellt sech eraus datt de Prozess fir e Projet ze bauen an ze testen ka weidergoen Aarbechter-e mat Windows an op engem aneren Aarbechter mat Linux.

Ofmellen Projet Quell Coden geschitt op all Aarbechterth.

3. Installatioun

Also, loosst eis goen. Ech wäert Ubuntu 18.04 als Host benotzen. Ech setzen een drop BuildMaster-a an een Aarbechter-a. Awer als éischt musst Dir Python3.7 installéieren:

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

Fir déi, déi Python3.7.2 brauchen anstatt 3.7.1, kënnt Dir déi folgend maachen:


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

De nächste Schrëtt ass d'Installatioun Tweeted и BuildBot, souwéi Packagen déi Iech erlaben zousätzlech Funktionalitéit ze benotzen BuildBot-Den.


/*Все что под 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. Éischt Schrëtt

Zäit ze schafen BuildMaster. Et wäert an eisem Dossier sinn /doheem/habr/meeschter.

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

Nächste Schrëtt. Loosst eis kreéieren Aarbechter. Et wäert an eisem Dossier sinn /home/habr/worker.

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

Wann Dir lafen Aarbechter, da gëtt et par défaut erstellt an /home/habr/worker Dossier mam Numm vum Projet, deen an master.cfg. An am Dossier mam Numm vum Projet erstellt en Verzeichnis bauen, a wäert et weider maachen ofmellen. Aarbechtsverzeechnes fir Aarbechter-an et wäert e Verzeechnes ginn /home/habr/yourProject/build.

"Golden Schlëssel
An elo wat ech geschriwwen de viregte Paragraf fir: e Skript deen Master wäert verlaangen vun Aarbechter-an op afstand an dësem Verzeechnes gemaach gëtt net ausgefouert ginn well de Skript keng Permissiounen huet fir ze lafen. Fir d'Situatioun ze korrigéieren, braucht Dir e Schlëssel --umask=0o22, déi verbitt an dësem Verzeichnis ze schreiwen, awer d'Startrechter behalen. An dat ass alles wat mir brauchen.

BuildMaster и Aarbechter eng Verbindung mateneen opbauen. Et geschitt, datt et ofbriechen an Aarbechter gewaart fir eng Zäit fir eng Äntwert vun BuildMaster-A. Wann et keng Äntwert gëtt, gëtt d'Verbindung nei gestart. Schlëssel --keepalive=60 just gebraucht fir d'Zäit duerno unzeginn konnektéieren reboots.

5. Configuratioun. Schrëtt fir Schrëtt Rezept

Configuratioun BuildMaster gëtt op der Säit vun der Maschinn duerchgefouert wou mir de Kommando ausgefouert hunn schafen-Master. An eisem Fall ass dëst e Verzeechnes /doheem/habr/meeschter. Configuratiounsdatei master.cfg existéiert nach net, awer de Kommando selwer huet d'Datei schonn erstallt master.cmg.sample. Dir musst et ëmbenennen op master.cfg.sample в master.cfg

mv master.cfg.sample master.cfg

Loosst eis dësen opmaachen master.cfg. A kucke mer aus wat et besteet. An duerno, loosst eis probéieren eis eege Konfiguratiounsdatei ze maachen.

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 - Basis Wierderbuch vun der Konfiguratiounsdatei. Et muss an der Konfiguratiounsdatei abegraff sinn. Fir d'Benotzungsfäegkeet gëtt en Alias ​​​​am Konfiguratiounscode agefouert "c". Titelen Schlësselen в c["keyFromDist"] sinn fix Elementer fir Interaktioun mat BuildMaster. Fir all Schlëssel gëtt de entspriechende Objet als Wäert ersat.

5.2 Aarbechter

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

Dës Kéier weisen mir BuildMaster-y Lëscht vun Aarbechter-s. Ech selwer Aarbechter mir geschaf méi héich, uginn Dir-Aarbechter-Numm и Passwuert. Elo musse se amplaz präziséiert ginn Beispill-Aarbechter и virum .

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

Duerch Schlëssel change_source Wierderbuch c kréien mir Zougang zu der Lëscht wou mir en Objet wëllen setzen deen de Repository mam Quellcode vum Projet pollt. D'Beispill benotzt e Git-Repository deen a bestëmmten Intervalle gepollt gëtt.

Dat éischt Argument ass de Wee zu Ärem Repository.

workdir duerstellt de Wee op den Dossier wou op der Säit Aarbechter-e relativ zu de Wee /home/habr/worker/yourProject/build git späichert déi lokal Versioun vum Repository.

Sparten enthält eng spezifesch Branche am Repository, déi gefollegt soll ginn.

pollInterval enthält d'Zuel vu Sekonnen duerno BuildMaster wäert de Repository fir Ännerungen pollen.

Et gi verschidde Methoden fir Ännerungen am Repository vun engem Projet ze verfolgen.

Déi einfachst Method ass Polling, wat dat implizéiert BuildMaster periodesch de Server mam Repository umellen. Wann engagéieren reflektéiert d'Ännerungen am Repository, dann BuildMaster wäert eng intern Objet mat e puer Retard schafen änneren a schéckt et un den Event Handler Scheduler, déi d'Schrëtt starten fir de Projet ze bauen an ze testen Aarbechter-e. Ënnert dëse Schrëtt gëtt uginn Aktualiséierung repository. Genau op AarbechterDëst wäert eng lokal Kopie vum Repository erstellen. D'Detailer vun dësem Prozess ginn ënnendrënner an den nächsten zwee Sektiounen ofgedeckt. (5.4 и 5.5).

Eng nach méi elegant Method fir Ännerungen an engem Repository ze verfolgen ass Messagen direkt vum Server ze schécken deen et host BuildMaster- iwwer d'Ännerung vum Projet Quellcodes. An dësem Fall, soubal den Entwéckler mécht engagéieren, de Server mam Projet Repository schéckt e Message BuildMaster-y. An hien, am Tour, wäert et ofgefaangen andeems en Objet erstellt PBchangeSource. Als nächst gëtt dësen Objet op transferéiert Scheduler, déi d'Schrëtt aktivéiert fir de Projet ze bauen an ze testen. E wichtege Bestanddeel vun dëser Method ass schaffen mat Héil-Server Scripten am Repository. Am Skript Héil-a, responsabel fir Veraarbechtung Aktiounen wann engagéieren-e, Dir musst den Utility ruffen sendchange a gitt d'Netzadress un BuildMaster-A. Dir musst och den Netzhafen spezifizéieren deen nolauschtert PBchangeSource. PBchangeSource, ass iwwregens Deel BuildMaster-A. Dës Method wäert Erlaabnis verlaangen Administrator-a um Server wou de Projet Repository läit. Dir musst als éischt e Backup vum Repository maachen.

5.4 Scheduler


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 - dëst ass en Element dat als Ausléiser wierkt, deen d'ganz Kette vun der Assemblée an dem Test vum Projet ufänkt.
E Beispill fir d'Ëmsetzung vun der kontinuéierlecher Integratioun mat BuildBot

Déi Ännerungen déi opgeholl goufen change_source, am Prozess vun der Aarbecht transforméiert BuildBot-a ze Objet änneren an elo all Scheier baséiert op hinnen, et baut Ufroe fir de Projet Bauprozess unzefänken. Et bestëmmt awer och wéini dës Ufroe weider an d'Schlaang transferéiert ginn. En Objet Builder Geschäfter eng Schlaang vun Demanden a Bunnen den Zoustand vun der aktueller Assemblée op eng separat Aarbechter-e. Builder existéiert op BuildMaster-e an op Aarbechter-e. Hie schéckt mat BuildMaster-a op Aarbechter-a scho spezifesch bauen - eng Rei vu Schrëtt déi gefollegt musse ginn.
Mir gesinn dat am aktuelle Beispill esou Scheduler 2 Stécker ginn erstallt. Ausserdeem huet jidderee seng eegen Aart.

SingleBranchScheduler - ee vun de beléifste Klassen um Zäitplang. Et beobachtet eng Branche a gëtt duerch eng opgeholl Ännerung an der ausgeléist. Wann hien Ännerunge gesäit, kann hien d'Versendung vun der Build-Ufro verzögeren (defer fir d'Period, déi am spezielle Parameter spezifizéiert ass treeStableTimer). IN Numm setzt den Numm vum Zäitplang an deen ugewise gëtt BuildBot- Web Interface. IN ÄnnerenFilter e Filter gëtt agestallt, nodeems se passéiert sinn, déi Ännerungen an der Branche froen den Zäitplang fir eng Ufro fir de Bau ze schécken. IN BuilderName Numm gëtt uginn Builder-a, déi mir e bësse méi spéit setzen. Den Numm an eisem Fall wäert d'selwecht sinn wéi de Projet Numm: Äre Projet.

ForceScheduler eng ganz einfach Saach. Dës Zort Zäitplang gëtt vun engem Mausklick duerch ausgeléist BuildBot- Web Interface. D'Parameteren hunn déi selwecht Essenz wéi an SingleBranchScheduler.

PS Nummer 3. Vläicht wäert et nëtzlech kommen
Periodesch ass e Zäitplang deen op enger bestëmmter Zäit-fixer Frequenz leeft. Den Opruff gesäit sou eppes 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 spezifizéiert d'Zäit vun dëser Periodizitéit a Sekonnen.

BuildFactory schaaft eng spezifesch bauen, déi dann Builder schéckt an Aarbechter. d' BuildFactory weist d'Schrëtt un, déi gefollegt ginn Aarbechter-y. Schrëtt ginn bäigefüügt andeems Dir d'Method rufft addStep

Déi éischt dobäi Schrëtt an dësem Beispill ass git clean -d -f -f -x, dann Gitt Kees. Dës Aktiounen sinn am Parameter abegraff Method, wat net kloer uginn ass, awer e Standardwäert implizéiert frësch. Parameter mode = 'inkrementell' weist datt d'Fichier'en aus dem Verzeechnes sinn, wou d' chechout, wärend am Repository fehlt, bleift onberéiert.

Den zweeten zousätzleche Schrëtt rifft de Skript Prozess mat Parameter Hallo op der Säit Aarbechter-a aus dem Verzeechnes /home/habr/worker/yourProject/build mat der Ëmfeldvariabel PATHONPATH=... Also kënnt Dir Är eege Skripte schreiwen an se op der Säit ausféieren Aarbechter-a all Schrëtt util.ShellCommand. Dës Skripte kënnen direkt an de Repository gesat ginn. Dann um chechout-e wäerten se falen an /home/habr/worker/yourProject/build. Wéi och ëmmer, da ginn et zwee "awer":

  1. Aarbechter muss mat engem Schlëssel geschaf ginn --umask sou datt et net Ausféierung Rechter spären na ofmellen-Den.
  2. um Gitt Drécken-e vun dëse Scripten Dir braucht der Propriétéit ze uginn exaktablesou datt spéider chechout-e huet d'Recht net verluer fir de Git Skript auszeféieren.

5.6 Bauhären


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

Iwwer wat ass Builder gesot gouf hei. Elo wäert ech Iech méi am Detail soen wéi Dir et erstellt. BuilderConfig ass e Konstruktor Builder. Esou Designer an c['Builder'] Dir kënnt e puer uginn, well dëst e Blat vun Objeten ass Builder Typ. Loosst eis elo d'Beispill vun ëmschreiwen BuildBot, eis Aufgab méi no ze bréngen.


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

Elo soen ech Iech iwwer d'Parameteren BuilderConfig.

Numm spezifizéiert den Numm Builder-a. Hei hu mir et genannt Äre Projet... Dat heescht, datt op Aarbechter- Dëse Wee wäert geschaf ginn /home/habr/worker/yourProject/build. Scheier sichen no Builder just mat dësem Numm.

Aarbechternimm enthält Blat Aarbechter-s. Jiddereng vun deenen muss dobäi ginn c['Aarbechter'].

Fabréck - spezifesch bauen, mat deem et assoziéiert Builder. Hie wäert den Objet schécken bauen op Aarbechter fir all Schrëtt an dësem abegraff ze kompletéieren bauen-Den.

6. Beispill vun Ärer eegener Configuratioun

Hei ass d'Beispill Projetsarchitektur déi ech proposéieren ze implementéieren BuildBot
.

Mir wäerten als Versiounskontrollsystem benotzen svn. De Repository selwer wäert an enger Aart vu Wollek sinn. Hei ass d'Adress vun dëser Wollek svn.host/svn/yourProject/trunk. An der Wollek ënner svn et gëtt e Benotzernumm vum Kont: Benotzersäit, passwd: Passwuert. Scripten déi Schrëtt representéieren bauen-a wäert och an der Branche sinn svn, an engem separaten Dossier buildbot/worker_linux. Dës Skripte sinn am Repository mat der gespäichert Immobilie lokaliséiert ausführbar.

BuildMaster и Aarbechter lafen um selwechten Host project.host .BuildMaster späichert seng Dateien an engem Dossier /doheem/habr/meeschter. Aarbechter et gëtt am folgende Wee gespäichert /home/habr/worker. Prozess Kommunikatioun BuildMaster-a an Aarbechter-a gëtt duerch Port 4000 no dem Protokoll duerchgefouert BuildBot-a, dat ass 'pb' Protokoll.

Den Zilprojet ass ganz am Python geschriwwen. D'Aufgab ass seng Ännerungen ze verfolgen, eng ausführbar Datei ze kreéieren, Dokumentatioun ze generéieren an Tester ze maachen. Am Fall vun Echec, all Entwéckler mussen e Message per E-Mail schécken, datt et eng Mëssgléckt Aktioun ass.

Web Display BuildBot mir wäerten ze port konnektéieren 80 fir project.host. Et ass net néideg Apatch ze installéieren. Als Deel vun der Bibliothéik verdréint et gëtt schonn e Webserver, BuildBot benotzt et.

Fir intern Informatioun ze späicheren fir BuildBot mir wäerten benotzen sqlite.

E Host ass erfuerderlech fir ze mailen smtp.your.Domain - et erlaabt Bréiwer aus Mail ze schécken [Email geschützt] ouni Authentifikatioun. Och am Host 'Simple ' D'Protokoll ginn um Post 1025 héieren.

Et sinn zwee Leit am Prozess involvéiert: Administrator и Benotzersäit. admin verwalten BuildBot. Benotzer ass déi Persoun déi engagéiert engagéieren-s.

Exaktéierbar Datei gëtt generéiert iwwer pyinstaller. Dokumentatioun gëtt generéiert via doxygen.

Fir dës Architektur hunn ech dëst geschriwwen: 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"
}

Éischt braucht Dir erschafen BuildMaster-a an Aarbechter-a. Paste dann dës Datei master.cfg в /doheem/habr/meeschter.

De nächste Schrëtt ass de Service unzefänken BuildMasteraa


sudo buildbot start /home/habr/master

Da fänkt de Service un Aarbechter-a


buildbot-worker start /home/habr/worker

Fäerdeg! Elo Buildbot wäert Ännerungen verfollegen an ausléisen engagéieren-y an svn, d'Schrëtt auszeféieren fir e Projet mat der uewe genannter Architektur ze bauen an ze testen.

Drënner wäert ech e puer Features vun der uewen beschreiwen master.cfg.

6.1 Um Wee op Är Meeschtesch.cfg


Iwwerdeems schreiwen meng master.cfg Vill Feeler wäerte gemaach ginn, sou datt d'Logbuchsdatei erfuerderlech ass. Et gëtt gespäichert wéi BuildMaster-ec absolute Wee /home/habr/master/twistd.log, an op der Säit Aarbechter-a mat absolute Wee /home/habr/worker/twistd.log. Wéi Dir de Feeler liest a fixéiert, musst Dir de Service nei starten BuildMaster-a. Hei ass wéi et gemaach gëtt:


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

6.2 Schafft mat 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)

Fir unzefänken, kucke mer svn_poller. Dëst ass nach ëmmer déiselwecht Interface, reegelméisseg de Repository eemol d'Minutt polling. An dësem Fall svn_poller nëmmen Zougang zu der Branche Trunk. Mysteriéis Parameter split_file=util.svn.split_file_alwaystrunk setzt d'Regelen: wéi d'Dossierstruktur opbriechen svn op de Branchen. Hien bitt hinnen och relativ Weeër. A sengem Tour split_file_alwaystrunk vereinfacht de Prozess andeems se seet datt de Repository nëmmen enthält Trunk.

В Scheduler uginn ÄnnerenFilterdee gesäit näischt an assoziéiert eng Branche domat Trunk no engem bestëmmte Associatioun duerch split_file_alwaystrunk. Äntwert op Ännerungen an Trunk, lancéiert Builder mam Numm Äre Projet.

Eegeschafte hei ass et néideg fir datt den Admin Mailinglëschte vu Bau- an Testresultater als Besëtzer vum Prozess kritt.

Schrëtt bauen-a ofmellen fähig all Dateien an der lokaler Versioun vum Repository komplett ze läschen Aarbechter-A. An dann déi voll maachen svn update. De Modus gëtt duerch de Parameter konfiguréiert mode = voll, Method = frësch. Parameter haltOnTailure seet, datt wann svn update gëtt mat engem Feeler ausgefouert, da soll de ganze Prozess vum Bau an Test suspendéiert ginn, well weider Aktiounen net Sënn maachen.

6.3 Bréif un Iech: Reporter sinn autoriséiert ze erklären


gemellt ass e Service fir Notifikatiounen per E-Mail ze schécken.


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]

Hie kann Messagen schécken verschidde Weeër.

MailNotifier benotzt E-Mail fir Notifikatiounen ze schécken.

template_html setzt d'Textschabloun fir den Newsletter. HTML gëtt benotzt fir Markup ze kreéieren. Et gëtt vum Motor geännert jéng 2 (kann vergläicht mat django). BuildBot huet eng Rei vu Variablen, deenen hir Wäerter an d'Schabloun ersat ginn wärend dem Prozess vum Message Text ze generéieren. Dës Variablen sinn an {{ duebel gekrauselt Klammern }} zougemaach. Zum Beispill, Summary weist de Status vun ofgeschlossen Operatiounen, dat ass Erfolleg oder Echec. A Projeten wäert erausginn Äre Projet. Also, benotzt Kontrollbefehl an jéng 2, Verännerlechen BuildBot-a a Python String Formatéierungsinstrumenter, kënnt Dir e ganz informativen Message erstellen.

MailNotifier enthält déi folgend Argumenter.

vunaddr - d'Adress vun där jidderee den Newsletter kritt.

sendToInterestedUsers=True schéckt e Message un de Besëtzer an de Benotzer deen gemaach huet engagéieren.

eropkucken - e Suffix deen un d'Nimm vun de Benotzer bäigefüügt muss ginn, déi den Newsletter kréien. Also Administrator wéi de Benotzer den Newsletter op d'Adress kritt [Email geschützt].

relaishost spezifizéiert den Hostnumm op deem de Server opgemaach gëtt Simple, eng smptPort spezifizéiert d'Portnummer déi lauschtert Simple Server.

mode = "warnung" seet, datt d'Mailing nëmme soll gemaach ginn, wann et op d'mannst ee Schrëtt ass bauen-a, déi mat der Status Echec oder Warnung opgehalen. Am Fall vun Erfolleg ass et net néideg en Newsletter ze schécken.

extraRecipients enthält eng Lëscht vu Persounen un deenen d'Mailing nieft dem Proprietaire an der Persoun geschéckt soll ginn engagéieren.

messageFormatter ass en Objet deen d'Noriichteformat spezifizéiert, seng Schabloun an eng Rei vu Variablen verfügbar vun jéng 2. Optiounen wéi wantProperties=True и wantSteps=True definéiert dës Set vu verfügbare Variabelen.

with['services']=[sendMessageToAll] stellt eng Lëscht vu Servicer, dorënner eis wäert Reporter.

Mir hunn et gemaach! Gratulatioun

Mir hunn eis eege Konfiguratioun erstallt an hunn d'Funktionalitéit gesinn, déi et fäeg ass. BuildBot. Dëst, mengen ech, ass genuch fir ze verstoen ob dëst Tool gebraucht gëtt fir Äre Projet ze kreéieren. Sidd Dir un him interesséiert? Wäert et Iech nëtzlech sinn? Ass hien bequem mat ze schaffen? Da schreiwen ech dësen Artikel net ëmsoss.

A weider. Ech wéilt déi berufflech Communautéit benotzt BuildBot, méi breet ginn, Handbuch goufen iwwersat, an et goufen nach méi Beispiller.

Merci all fir Är Opmierksamkeet. Vill Gléck.

Source: will.com

Setzt e Commentaire