Primjer implementacije kontinuirane integracije s BuildBotom

Primjer implementacije kontinuirane integracije s BuildBotom
(Slika od Kompjuterizator iz Pixabay)

Pozdrav!

Moje ime Evgenij Čerkin, programer sam u razvojnom timu rudarske tvrtke Polimetal.

Kada započnete bilo koji veliki projekt, počnete razmišljati: "Koji je softver najbolje koristiti za njegovo servisiranje?" IT projekt prolazi kroz nekoliko faza prije nego što se objavi sljedeća verzija. Dobro je kada je lanac ovih faza automatiziran. Automatizirani proces izdavanja nove verzije samog IT projekta naziva se Kontinuirana integracija. BuildBot pokazalo se kao dobar pomoćnik za nas u provedbi ovog procesa.

U ovom sam članku odlučio dati pregled mogućnosti BuildBot. Za što je ovaj softver sposoban? Kako mu pristupiti i kako s njim izgraditi normalan EFIKASAN RADNI ODNOS? Možete sami primijeniti naše iskustvo stvaranjem operativne usluge za izgradnju i testiranje vašeg projekta na vašem stroju.

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 radnika
5.3 change_source
5.4 planeri

5.5 BuildFactory
5.6 graditelja

6. Primjer vlastite konfiguracije

6.1 Na putu do svog gospodara.cfg
6.2 Rad sa svn
6.3 Pismo Vama: novinari su ovlašteni izjaviti

Uspjeli smo! Čestitamo

1. Zašto BuildBot?

Prethodno sam na habr-e naišao na članke o implementaciji Kontinuirana integracija s BuildBot. npr. Ovaj Smatram da je to najinformativnije. Postoji još jedan primjer - lakše. Ovi se artikli mogu začiniti primjer iz priručnikaI ovo nakon toga, na engleskom. Coupe je dobra polazna točka. Nakon što pročitate ove članke, vjerojatno ćete odmah poželjeti nešto na sebi BuildBot napraviti.

Stop! Je li ga netko doista koristio u svojim projektima? Ispostavilo se da da puno primijenili u svojim zadacima. Može se naći primjeri koristiti BuildBot i u arhivi Google koda.

Pa koja je logika da ljudi koriste Buildbot? Uostalom, postoje i drugi alati: Tempomat и Jenkins. Odgovorit ću ovako. Za većinu zadataka Jenkins i istina će biti dovoljna. Sa svoje strane, BuildBot - prilagodljiviji, dok se problemi tamo rješavaju jednostavno kao u Jenkins. Tvoj izbor. Ali budući da tražimo alat za razvijanje ciljnog projekta, zašto ne odabrati onaj koji će omogućiti, počevši od jednostavnih koraka, dobivanje sustava za izgradnju koji ima interaktivnost i jedinstveno sučelje.

Za one čiji je ciljni projekt napisan u pythonu, postavlja se pitanje: “Zašto ne odabrati integracijski sustav koji ima jasno sučelje u smislu jezika koji se koristi u projektu?” A sada je vrijeme da predstavimo prednosti BuildBot.

Dakle, naš “instrumentalni kvartet”. Za sebe sam identificirao četiri značajke BuildBot:

  1. To je okvir otvorenog koda pod GPL licencom
  2. Ovo je korištenje pythona kao konfiguracijskog alata i opis potrebnih radnji
  3. Ovo je prilika da dobijete odgovor od stroja na kojem se odvija montaža
  4. Ovo su, konačno, minimalni zahtjevi za domaćina. Implementacija zahtijeva python i twisted, a ne zahtijeva virtualni stroj i java stroj.

2. Koncept koji vodi BuildMaster

Primjer implementacije kontinuirane integracije s BuildBotom

Središnje mjesto u arhitekturi distribucije zadataka je BuildMaster. To je usluga koja:

  • prati trag promjene u izvornom stablu projekta
  • šalje naredbe koje treba izvršiti Worker servis za izgradnju projekta i njegovo testiranje
  • obavještava korisnicima o rezultatima poduzetih radnji

BuildMaster konfiguriran putem datoteke master.cfg. Ova datoteka je u korijenu BuildMaster. Kasnije ću pokazati kako se ovaj korijen stvara. Sama datoteka master.cfg sadrži python skriptu koja koristi pozive BuildBot.

Sljedeći najvažniji objekt BuildBot Ona ima ime Radnik. Ova se usluga može pokrenuti na drugom hostu s drugačijim OS-om ili možda na onom gdje BuildMaster. Također može postojati u posebno pripremljenom virtualnom okruženju s vlastitim paketima i varijablama. Ova virtualna okruženja mogu se pripremiti pomoću python uslužnih programa poput virtualenv, venv.

BuildMaster emitira naredbe svima Radnik-y, a on ih, pak, ispunjava. Odnosno, ispada da se proces izgradnje i testiranja projekta može nastaviti Radnik-e na Windowsima i na drugom Workeru na Linuxu.

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

3. Instalacija

Pa, idemo. Koristit ću Ubuntu 18.04 kao host. Stavit ć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 koji trebaju 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 tvitao и BuildBot, kao i pakete koji vam omogućuju 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 za stvaranje BuildMaster. Bit će u našoj mapi /dom/habr/master.

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

Sljedeći korak. Kreirajmo Radnik. Bit će u našoj mapi /dom/habr/radnik.

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

Kad trčite Radnik, tada će prema zadanim postavkama stvoriti in /dom/habr/radnik mapu s nazivom projekta koji je naveden u master.cfg. A u mapi s nazivom projekta stvorit će se direktorij graditi, i nastavit će to činiti provjera. Radni imenik za Radnik-i to će postati imenik /home/habr/yourProject/build.

"Zlatni ključ
A sada ono za što sam napisao prethodni odlomak: scenarij koji Majstorski zahtijevat će od Radnik-i učinjeno na daljinu u ovom direktoriju neće se izvršiti jer skripta nema prava 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 međusobnu vezu. Dogodi se da se odlomi i Radnik čekajući neko vrijeme na odgovor od BuildMaster-A. Ako nema odgovora, veza se ponovno pokreće. Ključ --keepalive=60 samo je potrebno naznačiti vrijeme nakon kojeg povezati ponovno podizanje sustava.

5. Konfiguracija. Korak po korak recept

Konfiguracija BuildMaster se provodi na strani stroja gdje smo izvršili naredbu stvori-majstor. U našem slučaju ovo je imenik /dom/habr/master. Konfiguracijska datoteka master.cfg još ne postoji, ali je sama naredba već stvorila datoteku master.cmg.uzorak. Morate ga preimenovati u master.cfg.uzorak в master.cfg

mv master.cfg.sample master.cfg

Otvorimo ovu master.cfg. I pogledajmo od čega se sastoji. A nakon toga, pokušajmo napraviti vlastitu konfiguracijsku datoteku.

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 rječnik konfiguracijske datoteke. Mora biti uključen u konfiguracijsku datoteku. Radi lakšeg korištenja, alias je uveden u konfiguracijski kod "c". Nazvanie tipke в c["keyFromDist"] su fiksni elementi za interakciju s BuildMaster. Za svaki ključ, odgovarajući objekt je zamijenjen kao vrijednost.

5.2 radnika

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

Ovaj put ukazujemo BuildMaster-y popis Radnik-s. Sebe Radnik stvorili smo iznad, ukazav ti-radnik-ime и lozinka. Sada ih je potrebno navesti umjesto toga primjer-radnik и pass .

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 promijeniti_izvor rječnik c dobivamo pristup popisu na koji želimo staviti objekt koji provjerava repozitorij s izvornim kodom projekta. Primjer koristi Git repozitorij koji se ispituje u određenim intervalima.

Prvi argument je put do vašeg repozitorija.

radni direktorij predstavlja put do mape gdje se sa strane Radnik-a u odnosu na put /home/habr/worker/yourProject/build git će pohraniti lokalnu verziju repozitorija.

grana sadrži određenu granu u repozitoriju koju treba slijediti.

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

Postoji nekoliko metoda za praćenje promjena u repozitoriju projekta.

Najjednostavnija metoda je prozivanje, što implicira da BuildMaster povremeno ispituje poslužitelj sa spremištem. Ako počiniti odražava promjene u spremištu, zatim BuildMaster će stvoriti interni objekt s određenim kašnjenjem Promijeniti i poslati ga rukovatelju događaja Raspored, koji će pokrenuti korake za izgradnju i testiranje projekta Radnik-e. Među tim koracima bit će naznačeno ažuriranje spremište. Točno na RadnikOvo će stvoriti lokalnu kopiju repozitorija. Detalji ovog procesa bit će obrađeni u nastavku u sljedeća dva odjeljka. (5.4 и 5.5).

Još elegantnija metoda praćenja promjena u repozitoriju je slanje poruka izravno s poslužitelja na kojem se nalazi BuildMaster- o promjeni izvornih kodova projekta. U ovom slučaju, čim programer napravi počiniti, poslužitelj s repozitorijem projekta će poslati poruku BuildMaster-y. A on će ga zauzvrat presresti stvaranjem objekta PBCangeSource. Zatim će ovaj objekt biti prebačen u Raspored, koji aktivira korake za izgradnju projekta i njegovo testiranje. Važan dio ove metode je rad sa kuka-skripte poslužitelja u repozitoriju. U scenariju kuka-a, odgovoran za radnje obrade kad počiniti-e, morate nazvati komunalnu službu sendchange i odredite mrežnu adresu BuildMaster-A. Također morate navesti mrežni priključak koji će slušati PBCangeSource. PBCangeSource, usput, dio je BuildMaster-A. Ova metoda zahtijeva dopuštenje admin-a na poslužitelju na kojem se nalazi repozitorij projekta. Prvo ćete morati napraviti sigurnosnu kopiju repozitorija.

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 – to je element koji djeluje kao okidač koji pokreće cijeli lanac montaže i testiranja projekta.
Primjer implementacije kontinuirane integracije s BuildBotom

Te promjene koje su zabilježene promijeniti_izvor, transformiran u procesu rada BuildBot-a prigovoriti Promijeniti a sada svaki Sheduler na temelju njih gradi zahtjeve za pokretanje procesa izgradnje projekta. Međutim, također određuje kada se ti zahtjevi prenose dalje u red čekanja. Objekt Graditelj pohranjuje red zahtjeva i prati stanje trenutnog sklopa na zasebnom Radnik-je. Graditelj postoji na BuildMaster-e i dalje Radnik-e. On šalje sa BuildMaster-a na Radnik-i već specifičan graditi - niz koraka koji se moraju slijediti.
Vidimo da je u trenutnom primjeru takav planeri Nastaju 2 komada. Štoviše, svaki ima svoju vrstu.

SingleBranchScheduler – jedan od najpopularnijih razreda na rasporedu. Promatra jednu granu i pokreće je snimljena promjena u njoj. Kada vidi promjene, može odgoditi slanje zahtjeva za izgradnju (odgoditi za razdoblje navedeno u posebnom parametru treeStableTimer). U ime postavlja naziv rasporeda koji će biti prikazan u BuildBot-web sučelje. U Promjena filtra postavlja se filtar, nakon čijeg prolaska promjene u grani pozivaju raspored da pošalje zahtjev za izgradnju. U graditeljImena naznačeno je ime graditelj-a, koji ćemo postaviti nešto kasnije. Naziv će u našem slučaju biti isti kao naziv projekta: vašProjekt.

ForceScheduler vrlo jednostavna stvar. Ova vrsta rasporeda pokreće se klikom miša BuildBot-web sučelje. Parametri imaju istu suštinu kao u SingleBranchScheduler.

PS br. 3. Možda će vam dobro doći
periodni je raspored koji radi određenom vremenski fiksnom frekvencijom. 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čan graditi, koji tada graditelj šalje na Radnik. U BuildFactory označava korake koje treba slijediti Radnik-y. Koraci se dodaju pozivom metode addStep

Prvi dodani korak u ovom primjeru je git clean -d -f -f –x, onda git naplata. Ove radnje su uključene u parametar način, što nije jasno navedeno, ali podrazumijeva zadanu vrijednost svjež. Parametar način='inkrementalni' označava da su datoteke iz direktorija u kojem je čekiranje, iako nedostaju u spremištu, ostaju netaknuti.

Drugi dodani korak je pozivanje skripte suđenje s parametrom halo na strani Radnik-a iz imenika /home/habr/worker/yourProject/build s varijablom okruženja PATHONPATH=... Dakle, možete pisati vlastite skripte i izvršavati ih sa strane Radnik- na svakom koraku util.ShellCommand. Ove se skripte mogu postaviti izravno u spremište. Zatim na čekiranje-e oni će upasti u /home/habr/worker/yourProject/build. Međutim, tada postoje dva "ali":

  1. Radnik mora se kreirati pomoću ključa --umask tako da ne blokira prava izvršenja nakon provjera- a.
  2. u git guranje-e ovih skripti trebate navesti svojstvo izvršivtako da kasnije čekiranje-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 onome što jest Graditelj je rečeno здесь. Sada ću vam detaljnije reći kako ga stvoriti. BuilderConfig je konstruktor graditelj. Takvi dizajneri u c['graditelji'] možete navesti nekoliko, budući da 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 navodi naziv graditelj-a. Ovdje smo ga nazvali vašProjekt... To znači da na Radnik- stvorit će se upravo ovaj put /home/habr/worker/yourProject/build. Sheduler tražim graditelj samo ovim imenom.

radnička imena sadrži list Radnik-s. Svaki od njih se mora dodati c['radnici'].

tvornica - specifično graditi, s kojim je povezan graditelj. On će poslati predmet graditi na Radnik da dovršite sve korake uključene u ovo graditi- a.

6. Primjer vlastite konfiguracije

Ovdje je primjer arhitekture projekta putem kojeg predlažem implementaciju BuildBot
.

Koristit ćemo ga kao sustav kontrole verzija svn. Sam repozitorij bit će smješten u nekoj vrsti oblaka. Evo adrese ovog oblaka svn.host/svn/yourProject/trunk. U oblaku ispod svn postoji korisničko ime računa: korisnik, lozinka: lozinka. Skripte koje predstavljaju korake graditi-a također će biti u grani svn, u zasebnoj mapi buildbot/worker_linux. Ove se skripte nalaze u repozitoriju sa spremljenim svojstvom izvršna.

BuildMaster и Radnik pokrenuti na istom hostu projekt.domaćin .BuildMaster pohranjuje svoje datoteke u mapu /dom/habr/master. Radnik pohranjuje se na sljedećoj stazi /dom/habr/radnik. Procesna komunikacija BuildMaster-a ja Radnik-a se provodi preko porta 4000 prema protokolu BuildBot-a, tj 'pb' protokol.

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

Web prikaz BuildBot spojit ćemo se na port 80 for projekt.domaćin. Nije potrebno instalirati Apatch. U sklopu knjižnice upletena već postoji web poslužitelj, BuildBot koristi ga.

Za pohranu internih informacija za BuildBot budemo iskoristiti sqlite.

Za slanje pošte potreban je host smtp.vaša.domena - omogućuje slanje pisama iz pošte [e-pošta zaštićena] bez provjere autentičnosti. Također na hostu 'smtp ' Zapisnik se čuje na postu 1025.

Dvije su osobe uključene u proces: admin и korisnik. admin upravlja BuildBot. korisnik je osoba koja se obvezuje počiniti-s.

Izvršna datoteka generira se putem pyinstaller. Dokumentacija se generira putem doxygen.

Za ovu arhitekturu sam napisao 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 stvoriti BuildMaster-a ja Radnik-a. Zatim zalijepite ovu datoteku master.cfg в /dom/habr/master.

Sljedeći korak je pokretanje usluge BuildMastera


sudo buildbot start /home/habr/master

Zatim pokrenite uslugu Radnik-a


buildbot-worker start /home/habr/worker

Spreman! Sada Buildbot pratit će promjene i pokretati počiniti-y unutra svn, izvođenje koraka izgradnje i testiranja projekta s gore navedenom arhitekturom.

U nastavku ću opisati neke značajke gore navedenog master.cfg.

6.1 Na putu do svog gospodara.cfg


Dok pišem svoj master.cfg Napravit će se mnogo pogrešaka, pa će biti potrebno čitanje log datoteke. Pohranjuje se kao BuildMaster-ec apsolutni put /home/habr/master/twistd.log, i sa strane Radnik-a s apsolutnim putem /home/habr/worker/twistd.log. Dok čitate pogrešku i ispravljate je, morat ćete ponovno 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 još uvijek isto sučelje, redovito ispituje repozitorij jednom u minuti. U ovom slučaju svn_poller pristupa samo grani deblo. Tajanstveni parametar split_file=util.svn.split_file_alwaystrunk postavlja pravila: kako razbiti strukturu mape svn na granama. Nudi im i relativne putove. Sa svoje strane split_file_alwaystrunk pojednostavljuje proces govoreći da spremište sadrži samo deblo.

В Planeri naznačeno Promjena filtrakoji vidi nijedan i pridružuje granu s njim deblo prema danoj asocijaciji kroz split_file_alwaystrunk. Odgovarajući na promjene u deblo, Pokreće graditelj s imenom vašProjekt.

Svojstva ovdje je potrebno kako bi administrator primao mailing liste rezultata izgradnje i testiranja kao vlasnik procesa.

Korak graditi-a provjera sposoban u potpunosti izbrisati sve datoteke koje se nalaze u lokalnoj verziji repozitorija Radnik-A. A onda odradite puni ažuriranje svn. Način se konfigurira kroz parametar mod=pun, metoda=svježe. Parametar haltOnTailure kaže da ako ažuriranje svn će se izvršiti s pogreškom, tada bi cijeli proces izgradnje i testiranja trebao biti obustavljen, budući da daljnje radnje nemaju smisla.

6.3 Pismo Vama: novinari su ovlašteni izjaviti


novinari je servis za slanje obavijesti e-poštom.


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]

Može slati poruke različiti putevi.

MailNotifier koristi e-poštu za slanje obavijesti.

predložak_html postavlja tekstualni predložak za bilten. HTML se koristi za stvaranje oznaka. Modificiran je motorom jinja2 (može se usporediti s django). BuildBot ima skup varijabli čije se vrijednosti zamjenjuju u predložak tijekom procesa generiranja teksta poruke. Ove varijable su zatvorene u {{ dvostruke vitičaste zagrade }}. Na primjer, rezime prikazuje status dovršenih operacija, odnosno uspjeh ili neuspjeh. A projekti će izlaz vašProjekt. Dakle, korištenje kontrolnih naredbi u jinja2, varijable BuildBot-a i python alate za oblikovanje niza, možete stvoriti prilično informativnu poruku.

MailNotifier sadrži sljedeće argumente.

fromaddr – adresu s koje će svi primati newsletter.

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

Pogledaj — sufiks koji se mora dodati imenima korisnika koji primaju bilten. Tako admin kako će korisnik dobiti newsletter na adresu [e-pošta zaštićena].

relayhost navodi naziv hosta na kojem je otvoren poslužitelj smtpA smptPort specificira broj porta koji sluša smtp poslužitelju.

način = "upozorenje" kaže da se slanje treba obaviti samo ako postoji barem jedan korak graditi-a, koji je završio statusnom greškom ili upozorenjem. U slučaju uspjeha, nema potrebe slati newsletter.

extraRecipients sadrži popis osoba kojima treba poslati pošiljku osim vlasnika i osobe koja je izvršila počiniti.

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

with['services']=[sendMessageToAll] nudi popis usluga među kojima će biti i naša novinar.

Uspjeli smo! Čestitamo

Napravili smo vlastitu konfiguraciju i vidjeli funkcionalnost za koju je sposobna. BuildBot. Ovo je, mislim, dovoljno da shvatite je li ovaj alat potreban za izradu vašeg projekta. Jeste li zainteresirani za njega? Hoće li vam biti od koristi? Je li s njim ugodno raditi? Onda ne pišem ovaj članak uzalud.

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

Hvala svima na pažnji. Sretno.

Izvor: www.habr.com

Dodajte komentar