'n Voorbeeldimplementering van deurlopende integrasie met BuildBot

'n Voorbeeldimplementering van deurlopende integrasie met BuildBot
(Beeld deur rekenaariseerder van (Pixabay)

Привет!

My naam is Evgeny Cherkin, Ek is 'n programmeerder vir 'n ontwikkelingspan in 'n mynmaatskappy Polimetaal.

As jy enige groot projek begin, begin jy dink: "Watter sagteware is beter om te gebruik om dit in stand te hou?". 'n IT-projek gaan deur 'n reeks stadiums voordat die volgende weergawe vrygestel word. Dit is goed wanneer die ketting van hierdie stadiums geoutomatiseer is. Op sigself word die outomatiese proses om 'n nuwe weergawe van 'n IT-projek vry te stel genoem Deurlopende integrasie. boubot blyk 'n goeie helper vir ons te wees deur hierdie proses te besef.

In hierdie artikel het ek besluit om 'n oorsig van die moontlikhede aan te bied boubot. Waartoe is hierdie sagteware in staat? Hoe om hom te benader en hoe om 'n normale, DOELTREFFENDE WERKSVERHOUDING met hom te bou? U kan ons ervaring op u eie toepas deur 'n werkende samestelling en toetsdiens vir u projek op u masjien te skep.

inhoud

inhoud

1. Hoekom BuildBot?
2. Konsep gelei deur BuildMaster
3. Installasie
4. Eerste stappe

5. Konfigurasie. Stap vir stap resep

5.1 BuildmasterConfig
5.2 werkers
5.3 verander_bron
5.4 skeduleerders

5.5 BuildFactory
5.6 bouers

6. Voorbeeld van eie konfigurasie

6.1 Op pad na jou meester.cfg
6.2 Werk met svn
6.3 Brief aan jou: verslaggewers is gemagtig om aan te meld

Ons het dit gedoen! Baie geluk

1. Hoekom BuildBot?

Vroeër op habr-e het ek artikels oor die implementering ontmoet Deurlopende integrasie met boubot. Byvoorbeeld, Hierdie een het vir my die insiggewendste gelyk. Daar is nog 'n voorbeeld - eenvoudiger. Hierdie artikels kan geredigeer word voorbeeld uit die handleidingEn hierdie daarna, in Engels. Die koepee maak 'n goeie beginpunt. Nadat u hierdie artikels gelees het, sal u sekerlik iets wil hê boubot te doen.

Stop! Het iemand dit werklik in hul projekte gebruik? Dit blyk ja baie dit in hul take toegepas het. Kan gevind word voorbeelde gebruik van boubot en in die Google-kodes-argiewe.

So wat is die logika van mense wat gebruik boubot? Daar is immers ander gereedskap: spoedbeheer и Jenkins. Ek sal so antwoord. Vir die meeste take Jenkins en die waarheid sal voldoende wees. Op sy beurt, boubot - meer aanpasbaar, terwyl take daar so eenvoudig opgelos word soos in Jenkins. Jy kies. Maar aangesien ons op soek is na 'n hulpmiddel vir 'n ontwikkelende teikenprojek, waarom nie een kies wat dit moontlik maak om, met eenvoudige stappe, 'n boustelsel te kry wat interaktiwiteit en 'n unieke koppelvlak het nie.

Vir diegene wie se teikenprojek in luislang geskryf is, ontstaan ​​die vraag: "Hoekom nie 'n integrasiestelsel kies wat 'n duidelike koppelvlak het in terme van die taal wat in die projek gebruik word nie?". En nou is dit tyd om die voordele aan te bied boubot.

Dus, ons "instrumentale kwartet". Vir myself het ek vier kenmerke geïdentifiseer boubot:

  1. Dit is 'n oopbronraamwerk onder die GPL-lisensie.
  2. Dit is die gebruik van python as 'n instrument om die vereiste aksies op te stel en te beskryf.
  3. Dit is die vermoë om 'n reaksie te ontvang van die masjien waarop die samestelling plaasvind
  4. Ten slotte, dit is die minimum vereistes vir 'n gasheer. Ontplooiing vereis luislang en gedraai en vereis nie 'n VM en java-masjien nie.

2. Konsep gelei deur BuildMaster

'n Voorbeeldimplementering van deurlopende integrasie met BuildBot

Sentraal tot die taakverspreidingsargitektuur is BuildMaster. Dit is 'n diens wat:

  • hou dop veranderinge in die projekbronboom
  • stuur opdragte wat deur die Werkerdiens uitgevoer moet word om die projek te bou en dit te toets
  • in kennis stel gebruikers oor die resultate van hul optrede

BuildMaster gekonfigureer via lêer meester.cfg. Hierdie lêer is in die wortel BuildMaster. Ek sal later wys hoe hierdie wortel geskep word. Die lêer self meester.cfg bevat python - 'n skrif wat oproepe gebruik boubot.

Die volgende belangrikste voorwerp boubot Dit het die naam Werker. Hierdie diens kan op 'n ander gasheer met 'n ander bedryfstelsel uitgevoer word, of miskien waar BuildMaster. Dit kan ook bestaan ​​in 'n spesiaal voorbereide virtuele omgewing met sy eie pakkette en veranderlikes. Hierdie virtuele omgewings kan voorberei word met behulp van python-nutsprogramme soos vertikalenv, venv.

BuildMaster opdragte aan almal uitsaai Werker-y, en hy, op sy beurt, voer hulle uit. Dit wil sê, dit blyk dat die proses om 'n projek te bou en te toets kan voortgaan Werker-e onder Windows en op 'n ander Worker onder Linux.

Uitteken projekbronkode kom op elkeen voor Werker-e.

3. Installasie

So kom ons gaan. Ek sal Ubuntu 18.04 as die gasheer gebruik. Daarop sal ek een plaas BuildMaster-a en een Werker-a. Maar eers moet jy python3.7 installeer:

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

Vir diegene wat python3.7.2 in plaas van 3.7.1 benodig, kan jy die volgende doen:


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

Die volgende stap is om te stel getwiet и boubot, sowel as pakkette wat jou toelaat om bykomende funksionaliteit te gebruik boubot-Die.


/*Все что под 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. Eerste stappe

Tyd om te skep BuildMaster. Dit sal in ons gids wees. /huis/habr/meester.

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

Volgende stap. Kom ons skep Werker. Dit sal in ons gids wees. /huis/habr/werker.

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

Wanneer jy hardloop Werker, dan sal dit by verstek skep in /huis/habr/werker gids met die naam van die projek, wat gespesifiseer is in meester.cfg. En in die gids met die naam van die projek, sal hy 'n gids skep bou, en dan sal dit doen checkout. werksgids vir Werker-a sal 'n gids word /huis/habr/jouProjek/bou.

"Golden Key
En nou waarvoor ek die vorige paragraaf geskryf het: 'n draaiboek wat Meester sal vereis Werker-a do remote in hierdie gids sal nie uitgevoer word nie omdat die script nie toestemming het om te loop nie. Om die situasie reg te stel, het jy 'n sleutel nodig --umask=0o22, wat skryf na hierdie gids verbied, maar die bekendstellingsregte verlaat. En dit is al wat ons nodig het.

BuildMaster и Werker verbinding met mekaar te vestig. Dit gebeur dat dit breek en Werker wag vir 'n antwoord van BuildMaster-A. As daar geen reaksie is nie, word die verbinding herbegin. Sleutel --keepalive=60 net nodig om die tyd daarna aan te dui verbind herlaai.

5. Konfigurasie. Stap vir stap resep

opset BuildMaster word uitgevoer aan die kant van die masjien waar ons die opdrag uitgevoer het skep-meester. In ons geval is dit die gids /huis/habr/meester. Konfigurasie lêer meester.cfg bestaan ​​nog nie, maar die opdrag self het reeds die lêer geskep meester.cmg.monster. Jy moet dit hernoem na meester.cfg.monster в meester.cfg

mv master.cfg.sample master.cfg

Kom ons maak dit oop meester.cfg. En kom ons kyk waaruit dit bestaan. En daarna sal ons probeer om ons konfigurasielêer te maak.

meester.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 - basiswoordeboek van die konfigurasielêer. Dit moet by die konfigurasielêer ingesluit word. Vir gemak van gebruik word die alias daarvan in die konfigurasiekode bekendgestel "c"... Name sleutels в c["keyFromDist"] is vaste elemente om mee te interaksie BuildMaster. Onder elke sleutel word die ooreenstemmende voorwerp as 'n waarde vervang.

5.2 werkers

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

Hierdie keer wys ons BuildMaster-y lys van Werker-ov. Ekself Werker ons geskep het bo, wat aandui jou-werker-naam и Wagwoord. Nou moet hulle eerder gespesifiseer word voorbeeld werker и slaag .

5.3 verander_bron

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

Per sleutel verander_bron woordeboek c kry ons toegang tot die lys waar jy die objek wil plaas wat die repository navraag doen met die bronkode van die projek. Die voorbeeld gebruik 'n Git-bewaarplek wat met gereelde tussenposes gepeil word.

Die eerste argument is die pad na jou bewaarplek.

werkdir verteenwoordig die pad na die gids waar aan die kant Werker-'n relatief tot die pad /huis/habr/werker/jouProjek/bou sal die plaaslike weergawe van die repository git stoor.

tak bevat 'n spesifieke tak in die bewaarplek om te volg.

pollInterval bevat die aantal sekondes waarna BuildMaster sal die bewaarplek vir veranderinge ondersoek.

Daar is verskeie metodes om veranderinge in die projekbewaarplek op te spoor.

Die eenvoudigste metode is stemdag, wat dit impliseer BuildMaster vra gereeld die bediener met die bewaarplek. As pleeg het dan die veranderinge in die bewaarplek weerspieël BuildMaster met 'n bietjie vertraging sal die innerlike voorwerp skep verandering en stuur dit na die gebeurtenis hanteerder Skeduleerder, wat die stappe sal begin vir die bou en toets van die projek op Werker-e. Hierdie stappe sal insluit Opdateer bewaarplek. Presies aan Werker-e sal 'n plaaslike kopie van die bewaarplek skep. Die besonderhede van hierdie proses sal hieronder in die volgende twee afdelings gedek word. (5.4 и 5.5).

'n Selfs meer elegante metode om veranderinge aan 'n bewaarplek op te spoor, is om direk boodskappe te stuur vanaf die bediener wat dit huisves na BuildMaster-y oor die verandering van die bronkodes van die projek. In hierdie geval, sodra die ontwikkelaar maak pleeg, sal die bediener met die projekbewaarplek 'n boodskap stuur BuildMaster-y. En dit sal dit op sy beurt onderskep deur 'n voorwerp te skep PBCchangeSource. Hierdie voorwerp sal dan aangegee word Skeduleerder, wat die stappe vir die bou van die projek en toets dit aktiveer. 'n Belangrike deel van hierdie metode is hierdie werk met haak-bediener skrifte in die bewaarplek. In skrif haak-a, verantwoordelik vir die verwerking van aksies wanneer pleeg-e, jy moet die hulpprogram bel stuur verandering en spesifiseer die netwerkadres BuildMaster-A. Jy moet die netwerkpoort spesifiseer wat sal luister PBCchangeSource. PBCchangeSource, terloops, is deel van BuildMaster-A. Hierdie metode sal die reg vereis admin-a op die bediener waar die projekbewaarplek geleë is. Eerstens moet u 'n rugsteun van die bewaarplek maak.

5.4 skeduleerders


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

skeduleers - dit is 'n element wat dien as 'n sneller wat die hele ketting van samestelling en toetsing van die projek begin.
'n Voorbeeldimplementering van deurlopende integrasie met BuildBot

Die veranderinge wat toegepas is verander_bron, getransformeer in die loop van werk boubot-a om beswaar te maak verandering en nou elke Sheduler op grond daarvan bou dit versoeke om die projekbouproses te begin. Dit bepaal egter ook wanneer hierdie versoeke na die tou deurgegee word. 'n Voorwerp Builder hou 'n tou van versoeke en volg die toestand van die huidige vergadering op 'n aparte Werker-Dit is. Builder bestaan ​​ook op BuildMaster-e en aan Werker-e. Hy stuur van BuildMaster-ensovoorts Werker-a reeds spesifiek bou - 'n reeks stappe wat gevolg moet word.
Ons sien dit in die huidige voorbeeld van so skeduleers 2 geskep word. Boonop het elkeen sy eie tipe.

SingleBranch Scheduler is een van die gewildste skeduleringsklasse. Dit hou een tak dop en veroorsaak 'n toegewyde verandering daarin. Wanneer hy die veranderinge sien, kan hy die stuur van die bouversoek uitstel (stel uit vir die tydperk gespesifiseer in die spesiale parameter treeStableTimer). IN naam spesifiseer die naam van die skedule waarin vertoon sal word boubot-webkoppelvlak. IN VeranderFilter 'n filter word gestel, wat deurloop waardeur veranderinge in die tak die skedule veroorsaak om 'n bouversoek te stuur. IN bouerName die naam word aangedui bouer-a, wat ons 'n bietjie later sal stel. Die naam in ons geval sal dieselfde wees as die projeknaam: jou projek.

ForceScheduler 'n baie eenvoudige ding. Hierdie tipe skedule word geaktiveer deur die muisklik deur boubot-webkoppelvlak. Die parameters is dieselfde as in SingleBranch Scheduler.

PS #3. Kom skielik handig te pas
periodieke - dit is 'n skedule wat werk met 'n sekere vaste tyd periodisiteit. Die oproep lyk so


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 spesifiseer die tyd van hierdie periodisiteit in sekondes.

BuildFactory skep 'n spesifieke bou, wat dan bouer verwys na Werker. In BuildFactory dui die stappe aan wat geneem moet word Werker-y. Stappe word bygevoeg deur 'n metode te roep addStep

Die eerste bygevoegde stap in hierdie voorbeeld is git skoon -d -f -f -xdan git afrekening. Hierdie aksies is ingesluit in die parameter metode, wat nie uitdruklik gespesifiseer word nie, maar 'n verstekwaarde impliseer vars... Parameter mode='inkrementeel' sê dat die lêers van die gids is waar die chechout, terwyl diegene wat in die bewaarplek ontbreek, onaangeraak bly.

Die tweede bygevoegde stap is 'n skrifoproep verhoor met parameter hallo aan die kant Werker-a uit die gids /huis/habr/werker/jouProjek/bou met omgewingsveranderlike PATHONPATH=... Jy kan dus jou eie skrifte skryf en dit aan die kant uitvoer Werker- 'n deurstap util.ShellCommand. Hierdie skrifte kan direk in die bewaarplek geplaas word. Toe by chechout-e hulle sal val in /huis/habr/werker/jouProjek/bou. Dan is daar egter twee "maars":

  1. Werker moet met 'n sleutel geskep word --umask sodat dit nie uitvoeringsregte blokkeer na checkout-Die.
  2. op git push-e van hierdie skrifte moet 'n eienskap spesifiseer uitvoerbaarsodat later chechout-e het nie toestemming verloor om die Git-skrip uit te voer nie.

5.6 bouers


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

Oor wat is Builder vertel is hier. Nou sal ek jou in meer besonderhede vertel oor hoe om dit te skep. BuilderConfig is 'n konstruktor bouer. Sulke konstrukteurs in c['bouers'] meer as een kan gespesifiseer word aangesien dit 'n lys van voorwerpe is bouer tipe. Kom ons herskryf nou die voorbeeld van boubotbring dit nader aan ons probleem.


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

Kom ons praat nou oor die instellings. BuilderConfig.

naam stel die naam bouer-a. Hier het ons dit genoem jou projek... Dit beteken dat op Werker-e hierdie pad sal geskep word /huis/habr/werker/jouProjek/bou. Sheduler soek vir bouer net op daardie naam.

werkersname bevat 'n blad Werker-ov. Elkeen moet bygevoeg word c['werkers'].

fabriek - spesifiek bouwaarmee geassosieer word bouer. Dit sal 'n voorwerp stuur bou op Werker om al die stappe wat hierby ingesluit is, te voltooi bou-Die.

6. Voorbeeld van eie konfigurasie

Hier is die voorbeeld projek argitektuur wat ek voorstel om te implementeer via boubot
.

As 'n weergawebeheerstelsel sal ons gebruik svn. Die bewaarplek self sal in een of ander wolk geleë wees. Hier is die adres van hierdie wolk svn.host/svn/yourProject/trunk. In die wolk onder svn daar is 'n rekeninggebruikersnaam: gebruiker, wagwoord: Wagwoord. Skripte wat stappe is bou-a sal ook in die tak wees svn, in 'n aparte gids buildbot/worker_linux. Hierdie skrifte is in die bewaarplek met die gestoorde eiendom uitvoerbare.

BuildMaster и Werker loop op dieselfde gasheer projek.gasheer .BuildMaster stoor sy lêers in 'n gids /huis/habr/meester. Werker dieselfde winkels in die volgende pad /huis/habr/werker. Proses kommunikasie BuildMaster-a en Werker-a word gelei deur poort 4000 volgens die protokol boubot-a, dit wil sê 'pb' protokol.

Die teikenprojek is geheel en al in luislang geskryf. Die taak is om die veranderinge daarvan op te spoor, 'n uitvoerbare lêer te skep, dokumentasie te genereer en toetse uit te voer. In die geval van mislukking, moet alle ontwikkelaars 'n boodskap aan die pos stuur dat daar 'n onsuksesvolle aksie is.

web vertoon boubot ons sal koppel aan poort 80 vir projek.gasheer. Apatch word nie vereis nie. As deel van die biblioteek gedraai daar is reeds 'n webbediener, boubot gebruik dit.

Om interne inligting te stoor vir boubot ons sal gebruik sqlite.

Poslys benodig 'n gasheer smtp.jou.domein - dit word toegelaat om briewe vanaf die pos te stuur [e-pos beskerm] sonder verifikasie. Ook op die gasheer'smtp ' Protokol word aangehoor by pos 1025.

Daar is twee mense betrokke by die proses: admin и gebruiker. admin administreer boubot. gebruiker is die persoon wat maak pleeg-s.

Uitvoerbare lêer word gegenereer via pyinstaller. Dokumentasie word gegenereer via doxygen.

Vir hierdie argitektuur het ek dit geskryf meester.cfg:

meester.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"
}

Eerstens moet u te skep BuildMaster-a en Werker-a. Plak dan hierdie lêer meester.cfg в /huis/habr/meester.

Die volgende stap is om die diens te begin BuildMasters


sudo buildbot start /home/habr/master

Begin dan die diens Werker-a


buildbot-worker start /home/habr/worker

Klaar! Nou boubot sal veranderinge dop en optree pleeg-y in svndeur die bou- en toetsstappe van 'n projek met bogenoemde argitektuur te volg.

Hieronder sal ek sommige van die kenmerke van bogenoemde beskryf meester.cfg.

6.1 Op pad na jou meester.cfg


Terwyl ek skryf my meester.cfg baie foute sal gemaak word, dus die lees van die loglêer sal vereis word. Dit word gestoor as BuildMaster-ec absolute pad /home/habr/master/twistd.log, en aan die kant Werker-a met absolute pad /home/habr/worker/twistd.log. Soos jy die fout lees en dit regstel, sal jy die diens moet herbegin BuildMaster-a. Hier is hoe dit gedoen word:


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

6.2 Werk met 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)

Om te begin, kom ons kyk na svn_poller. Dit is steeds dieselfde koppelvlak, wat gereeld die repository een keer per minuut navraag doen. In hierdie geval svn_poller verwys slegs na die tak stam. Geheimsinnige parameter split_file=util.svn.split_file_alwaystrunk stel die reëls: hoe om die gidsstruktuur te verdeel svn op takke. Hy bied hulle ook relatiewe paaie aan. Op sy beurt split_file_alwaystrunk vereenvoudig die proses deur te sê dat die bewaarplek slegs stam.

В Skedulers aangedui VeranderFilterwie sien Geen en assosieer 'n tak daarmee stam deur 'n gegewe vereniging deur split_file_alwaystrunk. Reageer op veranderinge in stam, Bekendstellings bouer met naam jou projek.

eiendomme hier nodig sodat die admin e-posse van die bou- en toetsresultate ontvang as die eienaar van die proses.

Stap bou-a checkout in staat is om 'n volledige verwydering van enige lêers wat in die plaaslike weergawe van die bewaarplek lê, te doen Werker-A. A voltooi dan svn opdatering. Modus gestel via parameter modus=vol, metode=vars... Parameter haltOnTailure sê dat as svn opdatering met 'n fout uitgevoer sal word, moet die hele bou- en toetsproses opgeskort word, aangesien verdere aksies nie sin maak nie.

6.3 Brief aan jou: verslaggewers is gemagtig om aan te meld


verslaggewers is 'n e-pos kennisgewing diens.


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]

Hy kan boodskappe stuur verskillende maniere.

MailNotifier gebruik e-pos om kennisgewings te stuur.

sjabloon_html stel die tekssjabloon vir die pos. HTML word gebruik om die opmaak te skep. Dit is enjin verander jinja2 (kan vergelyk word met Django). boubot het 'n stel veranderlikes, waarvan die waardes in die sjabloon vervang word tydens die vorming van die boodskapteks. Hierdie veranderlikes is ingesluit in {{ dubbel krulhakies }}. Byvoorbeeld, opsomming vertoon die status van voltooide bedrywighede, dit wil sê sukses of mislukking. A projekte sal uitbring jou projek. Dus, met die hulp van beheeropdragte in jinja2, veranderlikes boubot-a en python string formatters, kan jy 'n redelik insiggewende boodskap skep.

MailNotifier bevat die volgende argumente.

fromaddr - die adres vanwaar die pos aan almal gestuur sal word.

stuurNaInterestedUsers=True stuur 'n boodskap aan die eienaar en gebruiker wat die pleeg.

soek — 'n agtervoegsel wat bygevoeg moet word by die gebruikersname wat die poslys ontvang. Dus admin hoe die gebruiker die pos by die adres sal ontvang [e-pos beskerm].

aflosgasheer spesifiseer die naam van die gasheer waar die bediener oop is smtp, 'n smptPort stel die poortnommer wat luister smtp bediener.

mode="waarskuwing" sê dat die pos slegs gedoen moet word as daar ten minste een stap is bou-a wat geëindig het met 'n mislukking of waarskuwingstatus. In die geval van sukses is pos nie nodig nie.

ekstra Ontvangers bevat 'n lys van persone aan wie die pos gestuur moet word, benewens die eienaar en die persoon wat die pleeg.

messageFormatter is 'n objek wat die boodskapformaat spesifiseer, sy sjabloon en 'n stel veranderlikes beskikbaar vanaf jinja2. Opsies soos wantProperties=Waar и wantSteps=Waar definieer hierdie stel beskikbare veranderlikes.

with['services']=[sendMessageToAll] bied 'n lys van dienste, waaronder ons sal wees verslaggewer.

Ons het dit gedoen! Baie geluk

Ons het ons eie konfigurasie geskep en die funksionaliteit gesien wat boubot. Dit, dink ek, is genoeg om te verstaan ​​of hierdie hulpmiddel nodig is om jou projek te skep. Stel hy belang in jou? Sal dit vir jou nuttig wees? Is hy gemaklik om mee te werk? Dan skryf ek hierdie artikel nie verniet nie.

En verder. Ek wil graag hê dat die professionele gemeenskap gebruik boubot, het wyer geword, die handleidings is vertaal, en daar was selfs meer voorbeelde.

Dankie almal vir julle aandag. Sterkte.

Bron: will.com

Voeg 'n opmerking