Primjer implementacije kontinuirane integracije sa BuildBotom

Primjer implementacije kontinuirane integracije sa BuildBotom
(Slika od Computerizer od Pixabay)

Zdravo!

Moje ime je Evgeniy Cherkin, Ja sam programer u razvojnom timu u rudarskoj kompaniji Polimetal.

Prilikom pokretanja bilo kojeg velikog projekta, počinjete razmišljati: "Koji softver je najbolje koristiti za održavanje?" IT projekat prolazi kroz nekoliko faza prije objavljivanja sljedeće verzije. Dobro je kada je lanac ovih faza automatizovan. Automatski proces izdavanja nove verzije samog IT projekta se zove Kontinuirana integracija. BuildBot pokazao nam se kao dobar asistent u implementaciji ovog procesa.

U ovom članku odlučio sam dati pregled mogućnosti BuildBot. Za šta je sposoban ovaj softver? Kako mu prići i kako sa njim izgraditi normalan EFIKASAN RADNI ODNOS? Možete sami primijeniti naše iskustvo kreiranjem funkcionalne usluge za izgradnju i testiranje vašeg projekta na vašoj mašini.

Sadržaj

Sadržaj

1. Zašto BuildBot?
2. Koncept koji vodi BuildMaster
3. Instalacija
4. Prvi koraci

5. Konfiguracija. Korak po korak recept

5.1 BuildmasterConfig
5.2 radnici
5.3 change_source
5.4 planeri

5.5 BuildFactory
5.6 graditelja

6. Primjer vaše vlastite konfiguracije

6.1 Na putu do vašeg master.cfg
6.2 Rad sa svn
6.3 Pismo vama: novinari su ovlašteni da se izjasne

Uspjeli smo! Čestitam

1. Zašto BuildBot?

Prethodno sam na habr-e naišao na članke o implementaciji Kontinuirana integracija koristeći BuildBot... Na primjer, Ovaj Smatrao sam ga najinformativnijim. Postoji još jedan primjer - jednostavnije. Ovi artikli se mogu začiniti primjer iz priručnikai to nakon toga, na engleskom. Kupe je dobra polazna tačka. Nakon što pročitate ove članke, vjerovatno ćete odmah nešto poželjeti BuildBot uraditi.

Stani! Da li ga je neko zaista koristio u svojim projektima? Ispostavilo se da da mnogi primjenjivali u svojim zadacima. Može se naći primjere upotreba BuildBot iu arhivi Google kodova.

Dakle, koja je logika ljudi koji koriste Buildbot? Uostalom, postoje i drugi alati: CruiseControl и Jenkins. Odgovoriću ovako. Za većinu zadataka Jenkins i istina će biti dovoljna. sa svoje strane, BuildBot - prilagodljiviji, a problemi se tu rješavaju jednostavno kao u Jenkins. Izbor je na vama. Ali pošto smo u potrazi za alatom za razvojni ciljni projekat, zašto ne odabrati onaj koji će omogućiti, počevši od jednostavnih koraka, da dobijemo sistem izgradnje koji ima interaktivnost i jedinstven interfejs.

Za one čiji je ciljni projekat napisan na Python-u, postavlja se pitanje: „Zašto ne izabrati sistem integracije koji ima jasan interfejs u smislu jezika koji se koristi u projektu?“ A sada je vrijeme da predstavimo prednosti BuildBot.

Dakle, naš „instrumentalni kvartet“. Za sebe sam identifikovao četiri karakteristike BuildBot:

  1. To je okvir otvorenog koda pod GPL licencom
  2. Ovo je upotreba python-a kao alata za konfiguraciju i opis potrebnih radnji
  3. Ovo je prilika da dobijete odgovor od mašine na kojoj se vrši montaža
  4. Ovo su, konačno, minimalni zahtjevi za domaćina. Za implementaciju je potreban python i twisted, a ne zahtijeva virtuelnu mašinu i java mašinu.

2. Koncept koji vodi BuildMaster

Primjer implementacije kontinuirane integracije sa BuildBotom

Centralno za arhitekturu distribucije zadataka je BuildMaster. To je usluga koja:

  • prati promjene u izvornom stablu projekta
  • šalje komande koje treba da izvrši servis Worker da bi izgradio projekat i testirao ga
  • obavještava korisnicima o rezultatima poduzetih radnji

BuildMaster konfigurisan preko fajla master.cfg. Ovaj fajl je u korenu BuildMaster. Kasnije ću pokazati kako se kreira ovaj root. Sam fajl master.cfg sadrži python skriptu koja koristi pozive BuildBot.

Sljedeći najvažniji objekt BuildBot ima ime radnik. Ova usluga se može pokrenuti na drugom hostu sa drugim OS, ili možda na onom gdje BuildMaster. Takođe može postojati u posebno pripremljenom virtuelnom okruženju sa sopstvenim paketima i varijablama. Ova virtuelna okruženja mogu se pripremiti pomoću python uslužnih programa kao što su virtualenv, venv.

BuildMaster emituje komande svima radnik-y, a on ih, zauzvrat, ispunjava. Odnosno, ispostavilo se da se proces izgradnje i testiranja projekta može nastaviti radnik-e pod operativnim sistemom Windows i na drugom Worker-u koji koristi Linux.

Provjeri izvorni kodovi projekta se pojavljuju na svakom radnik-e.

3. Instalacija

Pa, idemo. Koristiću Ubuntu 18.04 kao host. Staviću jedan na njega BuildMaster-a i jedan radnik-a. Ali prvo morate instalirati python3.7:

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

Za one kojima je potreban python3.7.2 umjesto 3.7.1, možete učiniti sljedeće:


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

Sljedeći korak je instalacija Tweeted и BuildBot, kao i paketi koji vam omogućavaju korištenje dodatnih funkcionalnosti BuildBot- a.


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

Vrijeme je za stvaranje BuildMaster. Biće u našoj fascikli /home/habr/master.

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

Sljedeći korak. Kreirajmo radnik. Biće u našoj fascikli /kuća/habr/radnik.

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

Kad trčiš radnik, tada će se po defaultu kreirati u /kuća/habr/radnik folder sa nazivom projekta koji je naveden u master.cfg. A u folderu s imenom projekta kreirat će direktorij graditi, i nastavit će to činiti odjavljivanje. Radni imenik za radnik-i to će postati direktorij /home/habr/yourProject/build.

„Zlatni ključ
A sada ono za šta sam napisao prethodni pasus: scenario koji Majstor će zahtijevati od radnik-i urađeno na daljinu u ovom direktoriju neće biti izvršeno jer skripta nema dozvole za pokretanje. Da biste ispravili situaciju, trebat će vam ključ --umask=0o22, koji zabranjuje pisanje u ovaj direktorij, ali će zadržati prava pokretanja. I to je sve što nam treba.

BuildMaster и radnik uspostaviti vezu jedni s drugima. Dešava se da se odlomi i radnik čekam neko vrijeme na odgovor od BuildMaster-A. Ako nema odgovora, veza se ponovo pokreće. Ključ --keepalive=60 samo treba naznačiti vrijeme nakon kojeg spojiti restartuje.

5. Konfiguracija. Korak po korak recept

Konfiguracija BuildMaster vrši se na strani mašine na kojoj smo izvršili naredbu create-master. U našem slučaju, ovo je imenik /home/habr/master. Konfiguracioni fajl master.cfg još ne postoji, ali je sama komanda već kreirala datoteku master.cmg.sample. Morate ga preimenovati u master.cfg.sample в master.cfg

mv master.cfg.sample master.cfg

Hajde da otvorimo ovaj master.cfg. I pogledajmo od čega se sastoji. I nakon toga, hajde da pokušamo da napravimo sopstveni konfiguracioni fajl.

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 rečnik konfiguracione datoteke. Mora biti uključen u konfiguracijski fajl. Radi lakšeg korištenja, u konfiguracijski kod je uveden pseudonim "c". Naslovi tipke в c["keyFromDist"] su fiksni elementi za interakciju sa BuildMaster. Za svaki ključ, odgovarajući objekt se zamjenjuje kao vrijednost.

5.2 radnici

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

Ovaj put ukazujemo BuildMaster-y listu radnik-s. Sebe radnik kreirali smo viši, ukazujući vi-radnik-ime и lozinka. Sada ih treba navesti umjesto toga primjer-radnik и proći .

5.3 change_source

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

Po ključu change_source rječnik c dobijamo pristup listi na koju želimo staviti objekat koji ispituje spremište sa izvornim kodom projekta. Primjer koristi Git spremište koje se anketira u određenim intervalima.

Prvi argument je put do vašeg spremišta.

workdir predstavlja putanju do fascikle sa strane radnik- u odnosu na stazu /home/habr/worker/yourProject/build git će pohraniti lokalnu verziju spremišta.

grana sadrži određenu granu u spremištu koju treba pratiti.

pollInterval sadrži broj sekundi nakon kojih BuildMaster će ispitati spremište za promjene.

Postoji nekoliko metoda za praćenje promjena u spremištu projekta.

Najjednostavniji metod je biračka, što to implicira BuildMaster periodično anketira server sa spremištem. Ako počiniti odrazio promjene u spremištu, tada BuildMaster će kreirati interni objekat sa izvesnim zakašnjenjem promjena i pošaljite ga rukovaocu događaja Planer, koji će pokrenuti korake za izgradnju i testiranje projekta radnik-e. Među ovim koracima će biti naznačeno ažuriranje spremište. Tačno na radnikOvo će kreirati lokalnu kopiju spremišta. Detalji ovog procesa bit će pokriveni u nastavku u sljedeća dva odjeljka. (5.4 и 5.5).

Još elegantnija metoda praćenja promjena u spremištu je slanje poruka direktno sa servera koji ga hostuje na BuildMaster- o promjeni izvornih kodova projekta. U ovom slučaju, čim programer napravi počiniti, server sa repozitorijumom projekta će poslati poruku BuildMaster-y. A on će ga, zauzvrat, presresti stvaranjem objekta PBChangeSource. Zatim će se ovaj objekt prenijeti na Planer, koji aktivira korake za izgradnju projekta i testiranje. Važan dio ove metode je rad sa hook-serverske skripte u spremištu. U scenariju hook-a, odgovoran za radnje obrade kada počiniti-e, potrebno je da pozovete servis sendchange i navedite mrežnu adresu BuildMaster-A. Također morate navesti mrežni port koji će slušati PBChangeSource. PBChangeSource, usput, dio je BuildMaster-A. Ova metoda će zahtijevati dozvolu admin-a na serveru gdje se nalazi spremište projekta. Prvo ćete morati da napravite rezervnu kopiju spremišta.

5.4 planeri


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

planeri – ovo je element koji djeluje kao okidač koji pokreće cijeli lanac sklapanja i testiranja projekta.
Primjer implementacije kontinuirane integracije sa BuildBotom

Te promjene koje su zabilježene change_source, transformisan u procesu rada BuildBot-a prigovoriti promjena a sada svaki Sheduler na osnovu njih gradi zahtjeve za pokretanje procesa izgradnje projekta. Međutim, on također određuje kada se ovi zahtjevi dalje prenose u red čekanja. Objekt graditelj pohranjuje red zahtjeva i prati stanje trenutnog sklopa na zasebnom radnik-e. graditelj postoji na BuildMaster-e i dalje radnik-e. On šalje sa BuildMaster-a on radnik-i već konkretno graditi - niz koraka koji se moraju pratiti.
Vidimo da je u trenutnom primjeru takav planeri Kreirana su 2 komada. Štaviše, svaka ima svoj tip.

SingleBranchScheduler – jedan od najpopularnijih časova na rasporedu. Gleda jednu granu i pokreće se zabilježenom promjenom na njoj. Kada vidi promjene, može odgoditi slanje zahtjeva za izgradnju (odgoditi za period naveden u posebnom parametru treeStableTimer). IN ime postavlja naziv rasporeda koji će biti prikazan BuildBot-web interfejs. IN ChangeFilter postavljen je filter, nakon čijeg prolaska promjene u grani podstiču raspored za slanje zahtjeva za izgradnju. IN builderNames ime je naznačeno graditelj-a, koje ćemo postaviti malo kasnije. Ime u našem slučaju će biti isto kao i naziv projekta: yourProject.

ForceScheduler vrlo jednostavna stvar. Ovaj tip rasporeda se pokreće klikom miša BuildBot-web interfejs. Parametri imaju istu suštinu kao u SingleBranchScheduler.

PS br. 3. Možda će dobro doći
Periodično je raspored koji radi na određenoj vremenski fiksnoj frekvenciji. Poziv izgleda otprilike ovako


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 specificira vrijeme ove periodičnosti u sekundama.

BuildFactory stvara specifično graditi, što onda graditelj šalje na radnik. The BuildFactory označava korake koje treba pratiti radnik-y. Koraci se dodaju pozivanjem metode addStep

Prvi dodatni korak u ovom primjeru je git čist -d -f -f –x, onda git checkout. Ove radnje su uključene u parametar način, što nije jasno navedeno, ali implicira zadanu vrijednost svjež. Parametar mode='inkrementalno' označava da su datoteke iz direktorija u kojem je chechout, dok nedostaju iz spremišta, ostaju netaknuti.

Drugi dodatni korak je pozivanje skripte suđenje sa parametrom zdravo na strani radnik-a iz imenika /home/habr/worker/yourProject/build sa varijablom okruženja PATHONPATH=... Dakle, možete napisati svoje vlastite skripte i izvršiti ih sa strane radnik-a svaki korak util.ShellCommand. Ove skripte se mogu postaviti direktno u spremište. Zatim u chechout-e će upasti /home/habr/worker/yourProject/build. Međutim, tada postoje dva "ali":

  1. radnik mora biti kreiran sa ključem --umask tako da ne blokira prava izvršenja nakon odjavljivanje- a.
  2. u git push-e od ovih skripti trebate navesti svojstvo exacutablepa to kasnije chechout-e nije izgubio pravo na izvršavanje Git skripte.

5.6 graditelja


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

O tome šta jeste graditelj je rečeno ovdje. Sada ću vam detaljnije reći kako ga kreirati. BuilderConfig je konstruktor graditelj. Takvi dizajneri u c['graditelji'] možete navesti nekoliko, pošto je ovo list objekata graditelj tip. Sada prepišimo primjer iz BuildBot, približavajući ga našem zadatku.


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

Sada ću vam reći o parametrima BuilderConfig.

ime specificira ime graditelj-a. Ovdje smo ga nazvali yourProject... To znači da je uključeno radnik- ovaj put će biti stvoren /home/habr/worker/yourProject/build. Sheduler tražim graditelj samo pod ovim imenom.

imena radnika sadrži list radnik-s. Svaki od njih se mora dodati c['radnici'].

tvornica - specifično graditi, sa kojim se povezuje graditelj. On će poslati predmet graditi na radnik da dovršite sve korake uključene u ovo graditi- a.

6. Primjer vaše vlastite konfiguracije

Evo primjera arhitekture projekta koji predlažem za implementaciju putem BuildBot
.

Koristićemo kao sistem kontrole verzija svn. Samo spremište će se nalaziti u nekoj vrsti oblaka. Evo adrese ovog oblaka svn.host/svn/yourProject/trunk. U oblaku ispod svn postoji korisničko ime računa: korisnik, passwd: lozinka. Skripte koje predstavljaju korake graditi-a će također biti u branši svn, u posebnom folderu buildbot/worker_linux. Ove skripte se nalaze u spremištu sa sačuvanim svojstvom izvršna.

BuildMaster и radnik pokrenuti na istom hostu project.host .BuildMaster pohranjuje svoje datoteke u folder /home/habr/master. radnik pohranjuje se na sljedećoj putanji /kuća/habr/radnik. Procesna komunikacija BuildMaster-a i radnik-a se izvodi preko porta 4000 prema protokolu BuildBot-a, tj 'pb' protokol.

Ciljni projekat je u potpunosti napisan na Pythonu. Zadatak je pratiti njegove promjene, kreirati izvršnu datoteku, generirati dokumentaciju i provesti testiranje. U slučaju neuspjeha, svi programeri trebaju poslati poruku e-poštom u kojoj navode da postoji neuspješna radnja.

Web ekran BuildBot spojit ćemo se na port 80 za project.host. Nije potrebno instalirati Apatch. U sklopu biblioteke uvrnut već postoji web server, BuildBot koristi ga.

Za pohranjivanje internih informacija za BuildBot budemo iskoristiti sqlite.

Za slanje pošte je potreban host smtp.your.domain - omogućava slanje pisama sa pošte [email zaštićen] bez autentifikacije. Također na domaćinu 'smtp ' Zapisnik se sluša na pošti 1025.

U proces su uključene dvije osobe: admin и korisnik. admin administrira BuildBot. korisnik je osoba koja vrši obavezu počiniti-s.

Izvršni fajl se generiše putem pyinstaller. Dokumentacija se generiše putem doxygen.

Za ovu arhitekturu napisao sam ovo: 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"
}

Prvo što trebate stvarati BuildMaster-a i radnik-a. Zatim zalijepite ovaj fajl master.cfg в /home/habr/master.

Sljedeći korak je pokretanje usluge BuildMastera


sudo buildbot start /home/habr/master

Zatim pokrenite servis radnik-a


buildbot-worker start /home/habr/worker

Spremni! Sad Buildbot će pratiti promjene i pokrenuti počiniti-y in svn, izvođenje koraka izgradnje i testiranja projekta s gore navedenom arhitekturom.

U nastavku ću opisati neke karakteristike gore navedenog master.cfg.

6.1 Na putu do vašeg master.cfg


Dok pišem moje master.cfg Napravit će se mnoge greške, pa će biti potrebno čitanje datoteke dnevnika. Pohranjuje se kao BuildMaster-ec apsolutni put /home/habr/master/twistd.log, i sa strane radnik-a sa apsolutnom putanjom /home/habr/worker/twistd.log. Dok pročitate grešku i popravite je, morat ćete ponovo pokrenuti uslugu BuildMaster-a. Evo kako se to radi:


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

6.2 Rad sa 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)

Za početak, pogledajmo svn_poller. Ovo je i dalje isti interfejs, redovno proziva spremište jednom u minuti. U ovom slučaju svn_poller pristupa samo grani trunk. Misteriozni parametar split_file=util.svn.split_file_alwaystrunk postavlja pravila: kako razbiti strukturu foldera svn na granama. On im također nudi relativne puteve. Zauzvrat split_file_alwaystrunk pojednostavljuje proces govoreći da spremište sadrži samo trunk.

В Planeri naznačeno ChangeFilterko vidi nijedan i povezuje granu s njom trunk prema datoj asocijaciji kroz split_file_alwaystrunk. Reagiranje na promjene u trunk, Lansira graditelj sa imenom yourProject.

svojstva ovdje je potrebno da administrator dobije mailing liste sa rezultatima izgradnje i testiranja kao vlasnik procesa.

Korak graditi-a odjavljivanje sposoban za potpuno brisanje svih datoteka koje se nalaze u lokalnoj verziji spremišta radnik-A. I onda uradite u potpunosti svn ažuriranje. Režim se konfiguriše kroz parametar mode=full, metoda=svježe. Parametar haltOnTailure kaže da ako svn ažuriranje će se izvršiti s greškom, onda bi cijeli proces izgradnje i testiranja trebao biti obustavljen, jer dalje radnje nemaju smisla.

6.3 Pismo vama: novinari su ovlašteni da se izjasne


Novinari je servis za slanje obavještenja putem e-pošte.


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]

On može slati poruke Različiti putevi.

MailNotifier koristi e-poštu za slanje obavještenja.

template_html postavlja predložak teksta za bilten. HTML se koristi za kreiranje markupa. Modificira ga motor jinja2 (može se porediti sa django). BuildBot ima skup varijabli čije se vrijednosti zamjenjuju u šablonu tokom procesa generiranja teksta poruke. Ove varijable su zatvorene u {{ duple vitičaste zagrade }}. Na primjer, rezime prikazuje status završenih operacija, odnosno uspjeh ili neuspjeh. A projekti će izlaziti yourProject. Dakle, korištenjem kontrolnih komandi u jinja2, varijable BuildBot-a i python alata za formatiranje nizova, možete kreirati prilično informativnu poruku.

MailNotifier sadrži sljedeće argumente.

fromaddr – adresa sa koje će svi primati bilten.

sendToInterestedUsers=True šalje poruku vlasniku i korisniku koji je napravio počiniti.

pogledaj gore — sufiks koji se mora dodati imenima korisnika koji primaju bilten. Dakle admin kako će korisnik primati bilten na adresi [email zaštićen].

relayhost specificira ime hosta na kojem je server otvoren smtp, a smptPort specificira broj porta koji sluša smtp server.

mode="upozorenje" kaže da slanje pošte treba obaviti samo ako postoji barem jedan korak graditi-a, što je završilo neuspjehom statusa ili upozorenjem. U slučaju uspjeha, nema potrebe za slanjem biltena.

extraRecipients sadrži spisak osoba kojima treba poslati poštu pored vlasnika i osobe koja je izvršila počiniti.

messageFormatter je objekt koji specificira format poruke, njen predložak i skup dostupnih varijabli jinja2. Opcije kao što su wantProperties=Tačno и wantSteps=Tačno definirati ovaj skup dostupnih varijabli.

with['services']=[sendMessageToAll] pruža listu usluga, među kojima će biti i naša reporter.

Uspjeli smo! Čestitam

Napravili smo vlastitu konfiguraciju i vidjeli funkcionalnost za koju je sposobna. BuildBot. Ovo je, mislim, dovoljno da shvatite da li je ovaj alat potreban za kreiranje vašeg projekta. Da li ste zainteresovani za njega? Hoće li vam biti od koristi? Da li je udoban za rad? Onda ne pišem ovaj članak uzalud.

I dalje. Želio bih da stručna zajednica koristi BuildBot, postao širi, priručnici su prevedeni, a primjera je bilo još više.

Hvala svima na pažnji. Sretno.

izvor: www.habr.com

Dodajte komentar