In foarbyld ymplemintaasje fan trochgeande yntegraasje mei BuildBot

In foarbyld ymplemintaasje fan trochgeande yntegraasje mei BuildBot
(Ofbylding troch Computerizer fan Pixabay)

Hallo!

Myn namme is Evgeniy Cherkin, Ik bin in programmeur op in ûntwikkelingsteam by in mynboubedriuw Polymetaal.

As jo ​​​​in grut projekt begjinne, begjinne jo te tinken: "Hokker software is it bêste te brûken om it te ûnderhâlden?" In IT-projekt giet troch in oantal stadia foardat de folgjende ferzje frijlitten wurdt. It is goed as de ketting fan dizze stadia wurdt automatisearre. It automatisearre proses fan it frijjaan fan in nije ferzje fan in IT-projekt sels wurdt neamd Continuous integration. BuildBot bliek in goede assistint foar ús by it útfieren fan dit proses.

Yn dit artikel haw ik besletten om in oersjoch te jaan fan de mooglikheden BuildBot. Wat is dizze software by steat? Hoe kinne jo him benaderje en hoe't jo in normale EFFECTIVE WORKING RELATIONSHIP bouwe mei him? Jo kinne ús ûnderfining sels tapasse troch in wurkjende tsjinst te meitsjen foar it bouwen en testen fan jo projekt op jo masine.

Ynhâld

Ynhâld

1. Wêrom BuildBot?
2. Konsept ûnder lieding fan BuildMaster
3. Ynstallaasje
4. Earste stappen

5. Konfiguraasje. Stap foar stap resept

5.1 BuildmasterConfig
5.2-wurkers
5.3 feroaring_boarne
5.4 planners

5.5 BuildFactory
5.6 bouwers

6. Foarbyld fan jo eigen konfiguraasje

6.1 Underweis nei jo master.cfg
6.2 Wurkje mei svn
6.3 Brief oan jo: ferslachjouwers binne autorisearre om te ferklearjen

Wy hawwe it dien! Lokwinske

1. Wêrom BuildBot?

Earder op habr-e kaam ik artikels tsjin oer ymplemintaasje Continuous integration mei help fan BuildBot... Bygelyks, Dizze Ik fûn it it meast ynformatyf. Der is in oar foarbyld - ienfâldiger. Dizze artikels kinne wurde seasoned foarbyld út de hânliedingen it dêrnei, yn it Ingelsk. De coupe makket in goed begjinpunt. Nei it lêzen fan dizze artikels sille jo wierskynlik fuortendaliks wat op wolle BuildBot dwaan.

Ophâlde! Hat immen it eins brûkt yn har projekten? It docht bliken ja folle tapast it yn harren taken. Kin fûn wurde foarbylden использования BuildBot en yn Google koade argiven.

Dus wat is de logika fan minsken dy't brûke Buildbot? Nei allegear binne d'r oare ark: CruiseControl и Jenkins. Ik sil op dizze manier antwurdzje. Foar de measte taken Jenkins en de wierheid sil genôch wêze. Op syn beurt, BuildBot - mear oanpasber, wylst problemen dêr sa ienfâldich wurde oplost as yn Jenkins. De kar is fan dy. Mar om't wy op syk binne nei in helpmiddel foar in ûntwikkeljend doel projekt, wêrom net kieze ien dy't sil tastean, begjinnend út ienfâldige stappen, in fa in build systeem dat hat ynteraktiviteit en in unike ynterface.

Foar dyjingen waans doelprojekt yn python skreaun is, ûntstiet de fraach: "Wêrom net in yntegraasjesysteem kieze dat in dúdlike ynterface hat yn termen fan 'e taal brûkt yn it projekt?" En no is it tiid om de foardielen te presintearjen BuildBot.

Dus, ús "ynstrumintale kwartet". Foar mysels haw ik fjouwer funksjes identifisearre BuildBot:

  1. It is in iepen boarne ramt ûnder GPL-lisinsje
  2. Dit is it gebrûk fan python as konfiguraasjeark en beskriuwing fan 'e fereaske aksjes
  3. Dit is in kâns om in antwurd te krijen fan 'e masine wêrop de gearstalling plakfynt
  4. Dit binne, úteinlik, de minimale easken foar in Host. Ynset fereasket python en twisted, en net nedich in firtuele masine en java masine.

2. Konsept ûnder lieding fan BuildMaster

In foarbyld ymplemintaasje fan trochgeande yntegraasje mei BuildBot

Sintraal yn 'e taakferdielingsarsjitektuer is BuildMaster. It is in tsjinst dy't:

  • byhâldt feroarings yn de projekt boarne beam
  • stjoert kommando's dy't moatte wurde útfierd troch de Worker-tsjinst om it projekt te bouwen en te testen
  • meldt brûkers oer de resultaten fan nommen aksjes

BuildMaster konfigurearre fia triem master.cfg. Dizze triem is yn 'e root BuildMaster. Letter sil ik sjen litte hoe't dizze root makke wurdt. De triem sels master.cfg befettet in python-skript dat oproppen brûkt BuildBot.

Folgjende meast wichtige foarwerp BuildBot hat in namme Wurkster. Dizze tsjinst kin wurde lansearre op in oare host mei in oar OS, of miskien op de iene wêr BuildMaster. It kin ek bestean yn in spesjaal taret firtuele omjouwing mei syn eigen pakketten en fariabelen. Dizze firtuele omjouwings kinne wurde taret mei help fan python-hulpprogramma's lykas virtualenv, venv.

BuildMaster stjoert kommando's oan elkenien út Wurkster-y, en hy, op syn beurt, ferfollet se. Dat is, it docht bliken dat it proses fan it bouwen en testen fan in projekt trochgean kin Wurkster-e mei Windows en op in oare Worker mei Linux.

Betelje projekt boarne koades komt op elk Wurkster-e.

3. Ynstallaasje

Dus, litte wy gean. Ik sil Ubuntu 18.04 brûke as de host. Ik sil der ien op pleatse BuildMaster-a en ien Wurkster-in. Mar earst moatte jo python3.7 ynstallearje:

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

Foar dyjingen dy't python3.7.2 nedich hawwe ynstee fan 3.7.1, kinne jo it folgjende dwaan:


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 folgjende stap is om te ynstallearjen Tweeted и BuildBot, lykas pakketten wêrmei jo ekstra funksjonaliteit kinne brûke BuildBot-De.


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

Tiid om te meitsjen BuildMaster. It sil yn ús map stean /home/habr/master.

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

Folgjende stap. Lit ús meitsje Wurkster. It sil yn ús map stean /home/habr/arbeider.

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

As jo ​​rinne Wurkster, dan sil it standert oanmeitsje yn /home/habr/arbeider map mei de namme fan it projekt, dat is spesifisearre yn master.cfg. En yn 'e map mei de namme fan it projekt sil it in map meitsje bouwe, en sil trochgean te dwaan it betelje. Wurkmap foar Wurkster-en it sil in map wurde /home/habr/yourProject/build.

"Gouden kaai
En no wêr't ik de foarige paragraaf foar skreau: in skript dat Master sil easkje fan Wurkster-en op ôfstân dien yn dizze map sil net wurde útfierd omdat it skript gjin tagongsrjochten hat om te rinnen. Om de situaasje te korrigearjen, sille jo in kaai nedich hawwe --umask=0o22, dy't skriuwen nei dizze map ferbiedt, mar lansearringsrjochten behâlde sil. En dat is alles wat wy nedich binne.

BuildMaster и Wurkster in ferbining mei elkoar meitsje. It bart dat it brekt ôf en Wurkster wachtsje in skoft op in antwurd fan BuildMaster-IN. As der gjin antwurd is, wurdt de ferbining opnij starte. Kaai --keepalive=60 krekt nedich om oan te jaan de tiid wêrnei't ferbine reboots.

5. Konfiguraasje. Stap foar stap resept

Konfiguraasje BuildMaster wurdt útfierd oan 'e kant fan' e masine wêr't wy it kommando útfierden meitsje-master. Yn ús gefal is dit in map /home/habr/master. Konfiguraasjetriem master.cfg bestiet noch net, mar it kommando sels hat it bestân al makke master.cmg.sample. Jo moatte it omneame nei master.cfg.sample в master.cfg

mv master.cfg.sample master.cfg

Litte wy dizze iepenje master.cfg. En lit ús sjen wêr't it út bestiet. En dêrnei, litte wy besykje ús eigen konfiguraasjetriem te meitsjen.

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 - basiswurdboek fan it konfiguraasjetriem. It moat opnommen wurde yn it konfiguraasjetriem. Foar gemak fan gebrûk wurdt in alias ynfierd yn 'e konfiguraasjekoade "c"... Nammen kaaien в c["keyFromDist"] binne fêste eleminten foar ynteraksje mei BuildMaster. Foar elke kaai wurdt it korrespondearjende objekt ferfongen as in wearde.

5.2-wurkers

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

Dizze kear jouwe wy oan BuildMaster-y list fan Wurkster-s. Myself Wurkster wy makke hegere, oanjout jo-wurker-namme и wachtwurd. No moatte se ynstee spesifisearre wurde foarbyld-arbeider и pas .

5.3 feroaring_boarne

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

By kaai feroarje_boarne wurdboek c krije wy tagong ta de list wêr't wy in objekt wolle pleatse dat it repository ûndersiket mei de boarnekoade fan it projekt. It foarbyld brûkt in Git-repository dy't op bepaalde yntervallen wurdt ûndersocht.

It earste argumint is it paad nei jo repository.

workdir stiet foar it paad nei de map wêr oan 'e kant Wurkster-in relatyf oan it paad /home/habr/worker/yourProject/build git sil de lokale ferzje fan it repository opslaan.

tûke befettet in spesifike tûke yn 'e repository dy't folge wurde moat.

pollInterval befettet it oantal sekonden wêrnei't BuildMaster sil it repository ûndersochte foar feroarings.

D'r binne ferskate metoaden om wizigingen te folgjen yn it repository fan in projekt.

De ienfâldichste metoade is polling, wat dat betsjut BuildMaster periodyk ûndersocht de tsjinner mei de repository. As bedriuwe wjerspegele de feroarings yn it repository, dan BuildMaster sil meitsje in ynterne foarwerp mei wat fertraging Feroaring en stjoer it nei it evenemint handler Planner, dy't de stappen starte om it projekt op te bouwen en te testen Wurkster-e. Under dizze stappen sille wurde oanjûn update repository. Krekt op WurksterDit sil in lokale kopy meitsje fan it repository. De details fan dit proses sille hjirûnder wurde behannele yn 'e folgjende twa seksjes. (5.4 и 5.5).

In noch eleganter metoade foar it folgjen fan wizigingen yn in repository is om berjochten direkt te ferstjoeren fan 'e server dy't it host BuildMaster- oer it feroarjen fan de boarnekoades fan it projekt. Yn dit gefal, sa gau as de ûntwikkelder makket bedriuwe, sil de tsjinner mei de projektopslach in berjocht ferstjoere BuildMaster-y. En hy, op syn beurt, sil it ûnderskeppe troch in objekt te meitsjen PBChangeSource. Folgjende, dit objekt wurdt oerdroegen oan Planner, dy't de stappen aktivearret om it projekt te bouwen en te testen. In wichtich part fan dizze metoade wurdt wurkjen mei hook-serverskripts yn it repository. Yn it skript hook-a, ferantwurdlik foar it ferwurkjen fan aksjes wannear bedriuwe-e, jo moatte skilje it nut sendchange en spesifisearje it netwurkadres BuildMaster-IN. Jo moatte ek de netwurkpoarte opjaan dy't harkje sil PBChangeSource. PBChangeSource, troch de wei, is diel BuildMaster-IN. Dizze metoade sil tastimming fereaskje admin-a op de tsjinner dêr't it projekt repository leit. Jo moatte earst in reservekopy meitsje fan it repository.

5.4 planners


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

planners - dit is in elemint dat fungearret as in trigger dy't de heule ketting fan gearstalling en testen fan it projekt begjint.
In foarbyld ymplemintaasje fan trochgeande yntegraasje mei BuildBot

Dy feroarings dy't waarden opnommen feroarje_boarne, feroare yn it proses fan wurk BuildBot-a om beswier te meitsjen Feroaring en no elke Sheduler basearre op harren, it bout fersiken om te begjinnen it projekt bou proses. It bepaalt lykwols ek wannear't dizze oanfragen fierder nei de wachtrige wurde oerbrocht. In objekt Bouwer bewarret in wachtrige fan fersiken en tracks de steat fan de hjoeddeiske gearkomste op in apart Wurkster-e. Bouwer bestiet op BuildMaster-e en oan Wurkster-e. Hy stjoert mei BuildMaster-a oan Wurkster-en al spesifyk bouwe - in rige stappen dy't moatte wurde folge.
Wy sjogge dat yn it hjoeddeiske foarbyld soks planners 2 stikken wurde makke. Boppedat hat elk syn eigen type.

SingleBranchScheduler - ien fan 'e populêrste klassen op it skema. It sjocht ien tûke en wurdt trigger troch in opnommen feroaring dêryn. As hy feroarings sjocht, kin hy it ferstjoeren fan it boufersyk fertrage (útstelle foar de perioade oantsjutte yn 'e spesjale parameter treeStableTimer). YN namme stelt de namme yn fan it skema dat sil wurde werjûn yn BuildBot-web ynterface. YN FeroarjeFilter in filter wurdt ynsteld, nei it trochjaan hokker feroarings yn 'e tûke prompt it skema te stjoeren in fersyk foar bou. YN bouwerName namme wurdt oanjûn bouwer-a, dat wy sille sette in bytsje letter. De namme yn ús gefal sil itselde wêze as de projektnamme: dyn projekt.

ForceScheduler in hiel simpel ding. Dit soarte fan skema wurdt aktivearre troch in mûsklik troch BuildBot-web ynterface. De parameters hawwe deselde essinsje as yn SingleBranchScheduler.

PS No. 3. Miskien komt it wol goed
Periodyk is in skema dat rint op in bepaalde tiid-fêste frekwinsje. De oprop sjocht der sa út


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 spesifisearret de tiid fan dizze periodiciteit yn sekonden.

BuildFactory skept in spesifike bouwe, wat dan bouwer stjoert oan Wurkster. de BuildFactory jout de te folgjen stappen oan Wurkster-y. Stappen wurde tafoege troch de metoade te roppen addStep

De earste tafoege stap yn dit foarbyld is git skjin -d -f -f -x, dan git kassa. Dizze aksjes binne opnommen yn 'e parameter metoade, dat is net dúdlik oanjûn, mar ymplisearret in standert wearde frisse... Parameter mode='incremental' jout oan dat de triemmen binne út de map dêr't de chechout, wylst it ûntbrekt yn 'e repository, bliuwt ûnoantaaste.

De twadde tafoege stap ropt it skript proef mei parameter Hoi oan 'e kant Wurkster-a út triemtafel /home/habr/worker/yourProject/build mei de omjouwingsfariabele PATHONPATH=... Sa kinne jo jo eigen skripts skriuwe en oan 'e kant útfiere Wurkster- in elke stap util.ShellCommand. Dizze skripts kinne direkt yn it repository pleatst wurde. Dan by chechout-e se sille falle yn /home/habr/worker/yourProject/build. D'r binne lykwols twa "mars":

  1. Wurkster moat makke wurde mei in kaai --omske sadat it net blokkearje útfieringsrjochten na betelje-De.
  2. at git druk-e fan dizze skripts jo moatte opjaan it eigendom executabledus dat letter chechout-e hat it rjocht net ferlern om it Git-skript út te fieren.

5.6 bouwers


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

Oer wat is Bouwer waard ferteld hjir. No sil ik jo yn mear detail fertelle oer hoe't jo it meitsje. BuilderConfig is in konstruktor bouwer. Sokke ûntwerpers yn c['bouwers'] jo kinne ferskate oantsjutte, om't dit in blêd fan objekten is bouwer type. Litte wy no it foarbyld fan herskriuwe BuildBot, bringt it tichter by ús taak.


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

No sil ik jo fertelle oer de parameters BuilderConfig.

namme spesifisearret de namme bouwer-in. Hjir hawwe wy it neamd dyn projekt... Dit betsjut dat op Wurkster- dit paad sil makke wurde /home/habr/worker/yourProject/build. Sheduler sykje om bouwer krekt troch dizze namme.

wurknimmersnammen befettet blêd Wurkster-s. Elk fan dat moat wurde tafoege oan c['wurkers'].

fabryk - spesifyk bouwe, dêr't it mei ferbûn is bouwer. Hy sil it objekt stjoere bouwe op Wurkster te foltôgjen alle stappen opnommen yn dizze bouwe-De.

6. Foarbyld fan jo eigen konfiguraasje

Hjir is it foarbyldprojektarsjitektuer dat ik foarstel om fia te ymplementearjen BuildBot
.

Wy sille brûke as in ferzje kontrôle systeem svn. De repository sels sil lizze yn in soarte fan wolk. Hjir is it adres fan dizze wolk svn.host/svn/yourProject/trunk. Yn 'e wolk ûnder svn der is in akkount brûkersnamme: brûker, passwd: wachtwurd. Skripten dy't stappen fertsjintwurdigje bouwe-a sil ek wêze yn 'e branch svn, yn in aparte map buildbot/worker_linux. Dizze skripts lizze yn it repository mei it bewarre eigendom útfierber.

BuildMaster и Wurkster rinne op deselde host project.host .BuildMaster bewarret syn bestannen yn in map /home/habr/master. Wurkster it wurdt opslein yn it folgjende paad /home/habr/arbeider. Proses kommunikaasje BuildMaster-a en Wurkster-a wurdt útfierd fia haven 4000 neffens it protokol BuildBot-a, dat wol 'pb' protokol.

It doelprojekt is folslein yn Python skreaun. De taak is om syn wizigingen te folgjen, in útfierber bestân oan te meitsjen, dokumintaasje te generearjen en testen út te fieren. Yn gefal fan mislearring moatte alle ûntwikkelders in berjocht per e-post stjoere wêryn stiet dat der in mislearre aksje is.

Web werjefte BuildBot wy sille ferbine mei haven 80 foar project.host. It is net nedich om Apatch te ynstallearjen. As ûnderdiel fan de biblioteek Twisted d'r is al in webserver, BuildBot brûkt it.

Om ynterne ynformaasje te bewarjen foar BuildBot wy sille brûke sqlite.

In host is nedich foar mailing smtp.your.domain - it makket it mooglik om brieven fan post te ferstjoeren [e-post beskerme] sûnder autentikaasje. Ek op de host 'SMTP ' De notulen wurde heard by post 1025.

D'r binne twa minsken belutsen by it proses: admin и brûker. admin beheart BuildBot. brûker is de persoan dy't commit bedriuwe-s.

Executable triem wurdt oanmakke fia pyinstaller. Dokumintaasje wurdt oanmakke fia doxygen.

Foar dizze arsjitektuer skreau ik dit: 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"
}

Earst moatte jo создать BuildMaster-a en Wurkster-in. Plak dan dizze triem master.cfg в /home/habr/master.

De folgjende stap is om de tsjinst te begjinnen BuildMastera


sudo buildbot start /home/habr/master

Start dan de tsjinst Wurkster-a


buildbot-worker start /home/habr/worker

Klear! No Buildbot sil track feroarings en trigger bedriuwe-y yn svn, it útfieren fan de stappen fan it bouwen en testen fan in projekt mei de boppesteande arsjitektuer.

Hjirûnder sil ik guon funksjes fan it boppesteande beskriuwe master.cfg.

6.1 Underweis nei jo master.cfg


Wylst it skriuwen fan myn master.cfg In protte flaters sille makke wurde, dus it lêzen fan it logbestân sil nedich wêze. It wurdt bewarre as BuildMaster-ec absolute paad /home/habr/master/twistd.log, en oan 'e kant Wurkster-a mei absolute paad /home/habr/worker/twistd.log. As jo ​​​​de flater lêze en it reparearje, moatte jo de tsjinst opnij starte BuildMaster-in. Hjir is hoe't it dien wurdt:


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

6.2 Wurkje mei 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)

Lit ús earst ris efkes sjen svn_poller. Dit is noch altyd deselde ynterface, regelmjittich polling it repository ien kear yn 'e minút. Yn dit gefal svn_poller allinnich tagong ta de branch romp. Mysterieuze parameter split_file=util.svn.split_file_alwaystrunk stelt de regels: hoe te brekken de map struktuer svn op de takken. Hy biedt harren ek relative paden oan. Op syn beurt split_file_alwaystrunk simplifies it proses troch te sizzen dat de repository allinnich befettet romp.

В Planners oanjûn FeroarjeFilterwa sjocht Gjin en assosjearret dêr in tak mei romp neffens in opjûne feriening troch split_file_alwaystrunk. Reagearje op feroarings yn romp, lansearret bouwer mei namme dyn projekt.

eigenskippen hjir is it nedich, sadat de behearder mailinglisten ûntfangt mei bou- en testresultaten as de eigner fan it proses.

Stap bouwe-a betelje yn steat om alle bestannen yn 'e lokale ferzje fan it repository folslein te wiskjen Wurkster-IN. En dan it fol dwaan svn fernijing. De modus wurdt ynsteld troch de parameter mode=fol, metoade=farsk... Parameter haltOnTailure seit dat as svn fernijing sil wurde útfierd mei in flater, dan moat it hiele proses fan bouwen en testen wurde ophâlden, om't fierdere aksjes gjin sin hawwe.

6.3 Brief oan jo: ferslachjouwers binne autorisearre om te ferklearjen


ferslachjouwers is in tsjinst foar it ferstjoeren fan notifikaasjes fia e-post.


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 kin berjochten ferstjoere ferskillende manieren.

MailNotifier brûkt e-post om notifikaasjes te ferstjoeren.

template_html stelt it tekstsjabloan foar de nijsbrief yn. HTML wurdt brûkt om markearring te meitsjen. It wurdt feroare troch de motor jinja2 (kin fergelike wurde mei django). BuildBot hat in set fan fariabelen wêrfan de wearden wurde ferfongen yn it sjabloan tidens it proses fan it generearjen fan de berjochttekst. Dizze fariabelen binne ynsletten yn {{ dûbele krullende beugels }}. Bygelyks, gearfetting toant de status fan foltôge operaasjes, dat is sukses of mislearring. IN projekten sil útfier dyn projekt. Dus, gebrûk fan kontrôlekommando's yn jinja2, fariabelen BuildBot-a en python string opmaak ark, kinne jo meitsje in frij ynformatyf berjocht.

MailNotifier befettet de folgjende arguminten.

fromaddr – it adres wêrfan elkenien de nijsbrief krijt.

sendToInterestedUsers=True stjoert in berjocht nei de eigner en brûker dy't makke bedriuwe.

opsykje - in efterheaksel dat moat wurde tafoege oan de nammen fan brûkers dy't de nijsbrief ûntfange. Sa admin hoe't de brûker de nijsbrief op it adres sil ûntfange [e-post beskerme].

relayhost spesifisearret de hostnamme wêrop de tsjinner wurdt iepene SMTP, a smptPort spesifisearret it poartenûmer dat harket SMTP tsjinner.

mode="warskôging" seit dat de mailing allinnich dien wurde moat as der op syn minst ien stap is bouwe-a, dy't einige mei de status falen of warskôging. Yn it gefal fan sukses is it net nedich om in nijsbrief te stjoeren.

extraRecipients befettet in list fan persoanen nei wa't de mailing stjoerd wurde moat neist de eigner en de persoan dy't de bedriuwe.

messageFormatter is in foarwerp dat spesifisearret it berjocht opmaak, syn sjabloan, en in set fan fariabelen beskikber út jinja2. Opsjes lykas wantProperties=Wier и wantSteps=Wier definiearje dizze set fan beskikbere fariabelen.

with['services']=[sendMessageToAll] jout in list fan tsjinsten, ûnder dêr't ús sil wêze ferslachjouwer.

Wy hawwe it dien! Lokwinske

Wy makken ús eigen konfiguraasje en seagen de funksjonaliteit dêr't it yn steat is. BuildBot. Dit, tink ik, is genôch om te begripen oft dit ark nedich is om jo projekt te meitsjen. Binne jo ynteressearre yn him? Sil it nuttich wêze foar jo? Is hy noflik om mei te wurkjen? Dan skriuw ik dit artikel net om 'e nocht.

En fierder. Ik soe graach de profesjonele mienskip mei help BuildBot, waard breder, hânboeken waarden oerset, en der wiene noch mear foarbylden.

Tank allegear foar jo oandacht. Súkses.

Boarne: www.habr.com

Add a comment