Primer izvajanja neprekinjene integracije z uporabo BuildBot

Primer izvajanja neprekinjene integracije z uporabo BuildBot
(Slika avtorja Računalniška naprava iz Pixabay)

Lep pozdrav!

Moje ime Evgenij Čerkin, sem programer v razvojni skupini rudarskega podjetja Polimetal.

Ko začnete s katerim koli velikim projektom, začnete razmišljati: "Katero programsko opremo je najbolje uporabiti za njegovo vzdrževanje?" Projekt IT gre skozi več stopenj, preden izda naslednjo različico. Dobro je, če je veriga teh stopenj avtomatizirana. Imenuje se samodejni postopek izdaje nove različice IT projekta Stalna integracija. BuildBot se je izkazal za dobrega pomočnika pri izvajanju tega procesa.

V tem članku sem se odločil ponuditi pregled možnosti BuildBot. Česa je sposobna ta programska oprema? Kako se mu približati in kako z njim zgraditi normalen UČINKOVIT DELOVNI ODNOS? Naše izkušnje lahko uporabite sami, tako da ustvarite delujočo storitev za izdelavo in testiranje vašega projekta na vašem računalniku.

Vsebina

Vsebina

1. Zakaj BuildBot?
2. Koncept, ki ga vodi BuildMaster
3. Namestitev
4. Prvi koraki

5. Konfiguracija. Recept po korakih

5.1 BuildmasterConfig
5.2 delavci
5.3 spremeni_vir
5.4 razporejevalniki

5.5 BuildFactory
5.6 gradbenikov

6. Primer lastne konfiguracije

6.1 Na poti do vašega master.cfg
6.2 Delo s svn
6.3 Pismo vam: novinarji so pooblaščeni za izjavo

Uspelo nam je! čestitke

1. Zakaj BuildBot?

Prej sem na habr-e naletel na članke o implementaciji Stalna integracija z uporabo BuildBot. npr. ta Zdelo se mi je najbolj informativno. Obstaja še en primer - preprostejše. Te izdelke je mogoče začiniti primer iz priročnikaIn это po tem v angleščini. Kupe je dobro izhodišče. Ko boste prebrali te članke, boste verjetno takoj želeli nekaj na BuildBot narediti.

nehaj! Ga je kdo dejansko uporabil v svojih projektih? Izkazalo se je, da veliko uporabili pri svojih nalogah. Mogoče najti primeri uporabo BuildBot in v arhivih Googlove kode.

Kakšna je torej logika, da ljudje uporabljajo Buildbot? Navsezadnje obstajajo še druga orodja: Tempomat и Jenkins. Odgovoril bom takole. Za večino opravil Jenkins in resnice bo dovolj. po svoje, BuildBot - bolj prilagodljiv, medtem ko se težave rešujejo tako preprosto kot v Jenkins. Izbira je vaša. Ker pa iščemo orodje za razvojni ciljni projekt, zakaj ne bi izbrali takšnega, ki bo omogočilo, začenši s preprostimi koraki, pridobiti sistem gradnje, ki ima interaktivnost in edinstven vmesnik.

Za tiste, katerih ciljni projekt je napisan v pythonu, se postavlja vprašanje: "Zakaj ne bi izbrali integracijskega sistema, ki ima jasen vmesnik glede na jezik, uporabljen v projektu?" In zdaj je čas, da predstavimo prednosti BuildBot.

Torej, naš "instrumentalni kvartet". Zase sem identificiral štiri značilnosti BuildBot:

  1. Je odprtokodno ogrodje pod licenco GPL
  2. To je uporaba pythona kot konfiguracijskega orodja in opis potrebnih dejanj
  3. To je priložnost, da prejmete odgovor stroja, na katerem poteka montaža
  4. To so končno minimalne zahteve za gostitelja. Uvedba zahteva python in twisted ter ne zahteva virtualnega stroja in stroja java.

2. Koncept, ki ga vodi BuildMaster

Primer izvajanja neprekinjene integracije z uporabo BuildBot

Osrednje mesto v arhitekturi distribucije nalog je BuildMaster. Gre za storitev, ki:

  • spremlja spremembe v izvornem drevesu projekta
  • pošlje ukaze, ki jih mora izvesti storitev Worker za izgradnjo projekta in njegovo testiranje
  • obvesti uporabnikom o rezultatih izvedenih ukrepov

BuildMaster konfiguriran prek datoteke master.cfg. Ta datoteka je v korenu BuildMaster. Kasneje bom pokazal, kako je ta koren ustvarjen. Datoteka sama master.cfg vsebuje skript python, ki uporablja klice BuildBot.

Naslednji najpomembnejši objekt BuildBot Ima ime Delavec. To storitev je mogoče zagnati na drugem gostitelju z drugim OS ali morda na tistem, kjer BuildMaster. Obstaja lahko tudi v posebej pripravljenem virtualnem okolju s svojimi paketi in spremenljivkami. Ta virtualna okolja je mogoče pripraviti z uporabo pripomočkov python, kot je virtualenv, venv.

BuildMaster oddaja ukaze vsem Delavec-y, on pa jih izpolnjuje. To pomeni, da se izkaže, da se lahko proces gradnje in testiranja projekta nadaljuje Delavec-e z operacijskim sistemom Windows in na drugem Workerju z operacijskim sistemom Linux.

Preveri izvorne kode projekta se pojavljajo na vsakem Delavec-e.

3. Namestitev

Torej, gremo. Kot gostitelja bom uporabljal Ubuntu 18.04. Enega bom postavil nanj BuildMaster-a in ena Delavec-a. Toda najprej morate namestiti python3.7:

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

Za tiste, ki potrebujejo python3.7.2 namesto 3.7.1, lahko naredite naslednje:


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

Naslednji korak je namestitev tvitnil и BuildBot, pa tudi pakete, ki vam omogočajo uporabo dodatnih funkcionalnosti BuildBot-In.


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

Čas za ustvarjanje BuildMaster. V naši mapi bo /domov/habr/mojster.

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

Naslednji korak. Ustvarjajmo Delavec. V naši mapi bo /dom/habr/delavec.

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

Ko tečeš Delavec, potem bo privzeto ustvaril v /dom/habr/delavec mapo z imenom projekta, ki je določen v master.cfg. In v mapi z imenom projekta bo ustvaril imenik izgradnjo, in bo to počel še naprej Nakup. Delovni imenik za Delavec- in postal bo imenik /home/habr/yourProject/build.

"Zlati ključ
In zdaj, za kar sem napisal prejšnji odstavek: scenarij, ki Mojster bo zahteval od Delavec-in opravljeno na daljavo v tem imeniku ne bo izvedeno, ker skript nima dovoljenj za izvajanje. Če želite popraviti situacijo, boste potrebovali ključ --umask=0o22, ki prepoveduje pisanje v ta imenik, vendar bo ohranil pravice za zagon. In to je vse, kar potrebujemo.

BuildMaster и Delavec vzpostaviti medsebojno povezavo. Zgodi se, da se odlomi in Delavec čaka nekaj časa na odgovor od BuildMaster-A. Če ni odgovora, se povezava znova vzpostavi. Ključ --keepalive=60 samo navesti je treba čas, po katerem povezati ponovni zagoni.

5. Konfiguracija. Recept po korakih

Konfiguracija BuildMaster se izvede na strani stroja, kjer smo izvedli ukaz create-master. V našem primeru je to imenik /domov/habr/mojster. Konfiguracijska datoteka master.cfg še ne obstaja, vendar je ukaz sam že ustvaril datoteko master.cmg.sample. Preimenovati ga morate v master.cfg.sample в master.cfg

mv master.cfg.sample master.cfg

Odprimo tega master.cfg. In poglejmo, iz česa je sestavljen. In potem poskusimo narediti lastno konfiguracijsko datoteko.

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 — osnovni slovar konfiguracijske datoteke. Vključen mora biti v konfiguracijsko datoteko. Za lažjo uporabo je v konfiguracijsko kodo uveden vzdevek "c". Naslovi ključev в c["keyFromDist"] so fiksni elementi za interakcijo z BuildMaster. Za vsak ključ je ustrezen predmet zamenjan kot vrednost.

5.2 delavci

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

Tokrat navajamo BuildMaster-y seznam Delavec-s. sebe Delavec smo ustvarili zgoraj, ukazav ti-delavca-ime и geslo. Zdaj jih je treba namesto tega določiti zgled-delavec и mimo .

5.3 spremeni_vir

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

Po ključu spremeni_vir slovarja c dobimo dostop do seznama, kamor želimo postaviti objekt, ki anketira repozitorij z izvorno kodo projekta. Primer uporablja repozitorij Git, ki je vprašan v določenih intervalih.

Prvi argument je pot do vašega skladišča.

workdir predstavlja pot do mape, kjer je ob strani Delavec-a glede na pot /home/habr/worker/yourProject/build git bo shranil lokalno različico repozitorija.

podružnica vsebuje določeno vejo v repozitoriju, ki ji je treba slediti.

pollInterval vsebuje število sekund, po katerih BuildMaster bo pregledal skladišče za spremembe.

Obstaja več metod za sledenje spremembam v repozitoriju projekta.

Najenostavnejša metoda je Polling, kar pomeni, da BuildMaster občasno anketira strežnik z repozitorijem. če Zavezati odražal spremembe v skladišču, nato BuildMaster bo ustvaril notranji objekt z nekaj zamude Spreminjanje in ga pošljite upravljavcu dogodkov Scheduler, ki bo sprožil korake za izdelavo in testiranje projekta Delavec-e. Med temi koraki bodo navedeni posodobitev repozitorij. Točno na DelavecTo bo ustvarilo lokalno kopijo repozitorija. Podrobnosti tega postopka bodo obravnavane v naslednjih dveh razdelkih. (5.4 и 5.5).

Še bolj eleganten način sledenja spremembam v repozitoriju je pošiljanje sporočil neposredno s strežnika, ki ga gosti BuildMaster- o spreminjanju izvorne kode projekta. V tem primeru takoj, ko razvijalec naredi Zavezati, bo strežnik z repozitorijem projekta poslal sporočilo BuildMaster-y. On pa ga bo prestregel z ustvarjanjem predmeta PBChangeSource. Nato bo ta predmet prenesen v Scheduler, ki aktivira korake za izdelavo projekta in njegovo testiranje. Pomemben del te metode je delo z kljuka-strežniške skripte v repozitoriju. V scenariju kljuka-a, odgovoren za obdelavo dejanj, ko Zavezati-e, morate poklicati pripomoček sendchange in določite omrežni naslov BuildMaster-A. Določiti morate tudi omrežna vrata, ki bodo poslušala PBChangeSource. PBChangeSource, mimogrede, je del BuildMaster-A. Ta metoda bo zahtevala dovoljenje admin-a na strežniku, kjer se nahaja repozitorij projekta. Najprej boste morali narediti varnostno kopijo repozitorija.

5.4 razporejevalniki


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

urniki – to je element, ki deluje kot sprožilec, ki zažene celotno verigo sestavljanja in testiranja projekta.
Primer izvajanja neprekinjene integracije z uporabo BuildBot

Tiste spremembe, ki so bile zabeležene spremeni_vir, preoblikovan v procesu dela BuildBot-a ugovarjati Spreminjanje in zdaj vsak Sheduler na njihovi podlagi gradi zahteve za začetek procesa gradnje projekta. Vendar pa tudi določi, kdaj se te zahteve prenesejo naprej v čakalno vrsto. Predmet Builder shrani čakalno vrsto zahtev in spremlja stanje trenutnega sklopa na ločenem Delavec-in. Builder obstaja na BuildMaster-e in naprej Delavec-e. Pošlje s BuildMaster-a na Delavec-in že konkretno izgradnjo - niz korakov, ki jih je treba upoštevati.
Vidimo, da je v trenutnem primeru tak urniki Nastaneta 2 kosa. Poleg tega ima vsak svojo vrsto.

SingleBranchScheduler – eden najbolj priljubljenih razredov na urniku. Opazuje eno vejo in se sproži z zabeleženo spremembo v njej. Ko opazi spremembe, lahko odloži pošiljanje zahteve za gradnjo (odloži za obdobje, določeno v posebnem parametru treeStableTimer) V Ime nastavi ime urnika, ki bo prikazan v BuildBot- spletni vmesnik. IN ChangeFilter nastavljen je filter, po prehodu katerega spremembe v veji pozovejo urnik k pošiljanju zahteve za gradnjo. IN builderNames ime je navedeno builder-a, ki ga bomo postavili malo kasneje. Ime v našem primeru bo enako imenu projekta: vašProjekt.

ForceScheduler zelo preprosta stvar. Ta vrsta razporeda se sproži s klikom miške BuildBot- spletni vmesnik. Parametri imajo isto bistvo kot pri SingleBranchScheduler.

PS št. 3. Mogoče bo prišel prav
Občasno je urnik, ki teče ob določeni časovno določeni frekvenci. Klic izgleda nekako takole


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 določa čas te periodičnosti v sekundah.

BuildFactory ustvarja specifično izgradnjo, ki potem builder pošilja na Delavec. V BuildFactory označuje korake, ki jih je treba upoštevati Delavec-y. Koraki se dodajo s klicem metode addStep

Prvi dodan korak v tem primeru je git clean -d -f -f –x, potem git blagajna. Ta dejanja so vključena v parameter Metoda, kar ni jasno navedeno, vendar pomeni privzeto vrednost sveže... Parameter mode='inkrementalno' označuje, da so datoteke iz imenika, kjer je plačilo, čeprav manjkajo v skladišču, ostanejo nedotaknjeni.

Drugi dodan korak je klicanje skripta sojenje s parametrom zdravo na strani Delavec-a iz imenika /home/habr/worker/yourProject/build s spremenljivko okolja PATHONPATH=... Tako lahko pišete lastne skripte in jih izvajate ob strani Delavec- na vsakem koraku util.ShellCommand. Te skripte lahko postavite neposredno v repozitorij. Nato pri plačilo-e bodo padli v /home/habr/worker/yourProject/build. Vendar pa obstajata dva "ampak":

  1. Delavec je treba ustvariti s ključem --umask tako da ne blokira izvršitvenih pravic po Nakup-In.
  2. Ob git push-e teh skriptov morate določiti lastnost izvršljivtako da kasneje plačilo-e ni izgubil pravice do izvajanja skripta Git.

5.6 gradbenikov


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

O tem, kaj je Builder je bilo povedano tukaj. Zdaj vam bom podrobneje povedal, kako ga ustvariti. BuilderConfig je konstruktor builder. Takšni oblikovalci v c['gradbeniki'] določite jih lahko več, saj je to list predmetov builder vrsta. Zdaj pa ponovno napišimo primer iz BuildBot, s čimer ga približamo naši nalogi.


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

Zdaj vam bom povedal o parametrih BuilderConfig.

Ime določa ime builder-a. Tukaj smo ga poimenovali vašProjekt. To pomeni, da na Delavec- nastala bo prav ta pot /home/habr/worker/yourProject/build. Sheduler iskati builder samo s tem imenom.

delavska imena vsebuje list Delavec-s. Vsakemu od njih je treba dodati c['delavci'].

Tovarna - specifično izgradnjo, s katerim je povezana builder. Poslal bo predmet izgradnjo o Delavec da dokončate vse korake, vključene v to izgradnjo-In.

6. Primer lastne konfiguracije

Tukaj je primer arhitekture projekta, ki ga predlagam za izvedbo BuildBot
.

Uporabili ga bomo kot sistem za nadzor različic svn. Sam repozitorij bo lociran v nekakšnem oblaku. Tukaj je naslov tega oblaka svn.host/svn/yourProject/trunk. V oblaku spodaj svn obstaja uporabniško ime računa: uporabnik, geslo: geslo. Skripte, ki predstavljajo korake izgradnjo-a bo tudi v podružnici svn, v ločeni mapi buildbot/worker_linux. Ti skripti se nahajajo v repozitoriju s shranjeno lastnostjo izvedljiv.

BuildMaster и Delavec teči na istem gostitelju project.host .BuildMaster shrani svoje datoteke v mapo /domov/habr/mojster. Delavec shranjen je na naslednji poti /dom/habr/delavec. Procesna komunikacija BuildMaster-a in Delavec-a se izvaja prek vrat 4000 v skladu s protokolom BuildBot-a, to je 'pb' protokol.

Ciljni projekt je v celoti napisan v Pythonu. Naloga je slediti njegovim spremembam, ustvariti izvedljivo datoteko, ustvariti dokumentacijo in izvesti testiranje. V primeru neuspeha morajo vsi razvijalci po e-pošti poslati sporočilo, da je dejanje neuspešno.

Spletni prikaz BuildBot priključili se bomo na vrata 80 za project.host. Apatch ni treba namestiti. V sklopu knjižnice zvit že obstaja spletni strežnik, BuildBot ga uporablja.

Za shranjevanje notranjih informacij za BuildBot bomo uporabili sqlite.

Za pošiljanje pošte je potreben gostitelj smtp.vaša.domena - omogoča pošiljanje pisem iz pošte [e-pošta zaščitena] brez avtentikacije. Tudi na gostitelju 'smtp Zapisnik je na pošti 1025.

V procesu sodelujeta dve osebi: admin и uporabnik. admin upravlja BuildBot. uporabnik je oseba, ki se zaveže Zavezati-s.

Izvršljiva datoteka se ustvari prek pyinstaller. Dokumentacija se ustvarja prek doxygen.

Za to arhitekturo sem napisal tole: 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"
}

Najprej morate ustvariti BuildMaster-a in Delavec-a. Nato prilepite to datoteko master.cfg в /domov/habr/mojster.

Naslednji korak je zagon storitve BuildMasteraa


sudo buildbot start /home/habr/master

Nato zaženite storitev Delavec-a


buildbot-worker start /home/habr/worker

pripravljena! zdaj Buildbot bo sledil spremembam in sprožil Zavezati-y noter svn, ki izvaja korake gradnje in testiranja projekta z zgornjo arhitekturo.

Spodaj bom opisal nekatere značilnosti zgoraj naštetega master.cfg.

6.1 Na poti do vašega master.cfg


Med pisanjem mojega master.cfg Pojavilo se bo veliko napak, zato bo treba prebrati dnevniško datoteko. Shranjen je kot BuildMaster-ec absolutna pot /home/habr/master/twistd.log, in na strani Delavec-a z absolutno potjo /home/habr/worker/twistd.log. Ko boste prebrali napako in jo odpravili, boste morali znova zagnati storitev BuildMaster-a. Evo, kako se to naredi:


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

6.2 Delo s 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)

Najprej si poglejmo svn_poller. To je še vedno isti vmesnik, ki redno preverja repozitorij enkrat na minuto. V tem primeru svn_poller dostopa samo do podružnice prtljažnik. Skrivnostni parameter split_file=util.svn.split_file_alwaystrunk postavlja pravila: kako razbiti strukturo map svn na vejah. Ponuja jim tudi relativne poti. Po svoje split_file_alwaystrunk poenostavlja postopek z besedami, da repozitorij vsebuje samo prtljažnik.

В Načrtovalci označeno ChangeFilterki vidi Noben in z njim poveže podružnico prtljažnik glede na dano asociacijo skozi split_file_alwaystrunk. Odziv na spremembe v prtljažnik, Zažene builder z imenom vašProjekt.

Lastnosti tukaj je potrebno, da skrbnik prejme poštne sezname rezultatov gradnje in testiranja kot lastnik procesa.

Korak izgradnjo-a Nakup lahko v celoti izbriše vse datoteke, ki se nahajajo v lokalni različici repozitorija Delavec-A. In potem naredite polno posodobitev svn. Način je konfiguriran prek parametra način=poln, metoda=sveže... Parameter haltOnTailure pravi, da če posodobitev svn se bo izvedel z napako, potem je treba celoten proces gradnje in testiranja začasno ustaviti, ker nadaljnja dejanja niso smiselna.

6.3 Pismo vam: novinarji so pooblaščeni za izjavo


novinarji je storitev za pošiljanje obvestil po elektronski pošti.


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]

Lahko pošilja sporočila različne poti.

MailNotifier uporablja e-pošto za pošiljanje obvestil.

template_html nastavi besedilno predlogo za glasilo. HTML se uporablja za ustvarjanje oznak. Spremenjen je z motorjem jinja2 (lahko primerjamo z django). BuildBot ima nabor spremenljivk, katerih vrednosti so zamenjane v predlogi med postopkom generiranja besedila sporočila. Te spremenljivke so obdane z {{ dvojnimi zavitimi oklepaji }}. na primer Povzetek prikazuje status zaključenih operacij, to je uspeh ali neuspeh. A projekti bo izšel vašProjekt. Torej, z uporabo nadzornih ukazov v jinja2, spremenljivke BuildBot-a in orodja za oblikovanje nizov python, lahko ustvarite precej informativno sporočilo.

MailNotifier vsebuje naslednje argumente.

od naslova – naslov, s katerega bodo vsi prejeli glasilo.

sendToInterestedUsers=True pošlje sporočilo lastniku in uporabniku, ki sta ga ustvarila Zavezati.

iskanje — pripono, ki jo je treba dodati k imenom uporabnikov, ki prejemajo glasilo. torej admin kako bo uporabnik prejemal glasilo na naslov [e-pošta zaščitena].

relayhost določa ime gostitelja, na katerem je odprt strežnik smtpA smptPort določa številko vrat, ki posluša smtp strežnik.

mode="opozorilo" pravi, da je treba pošiljanje opraviti le, če obstaja vsaj en korak izgradnjo-a, ki se je končalo z napako statusa ali opozorilom. V primeru uspeha ni treba pošiljati glasila.

extraRecipients vsebuje seznam oseb, ki jim je treba pošiljanje poslati poleg lastnika in osebe, ki je opravila Zavezati.

messageFormatter je objekt, ki določa obliko sporočila, njegovo predlogo in nabor spremenljivk, ki so na voljo v jinja2. Možnosti, kot je npr wantProperties=True и wantSteps=Res definirajte ta niz razpoložljivih spremenljivk.

with['services']=[sendMessageToAll] ponuja seznam storitev, med katerimi bo tudi naša reporter.

Uspelo nam je! čestitke

Ustvarili smo lastno konfiguracijo in videli funkcionalnosti, ki jih zmore. BuildBot. Mislim, da je to dovolj, da razumemo, ali je to orodje potrebno za ustvarjanje vašega projekta. Vas zanima? Vam bo koristilo? Je z njim udobno delati? Potem tega članka ne pišem zaman.

In dalje. Želel bi, da strokovna skupnost uporablja BuildBot, se je razširil, priročniki so bili prevedeni, primerov je bilo še več.

Hvala vsem za vašo pozornost. Vso srečo.

Vir: www.habr.com

Dodaj komentar