Nepārtrauktas integrācijas ieviešanas piemērs, izmantojot BuildBot

Nepārtrauktas integrācijas ieviešanas piemērs, izmantojot BuildBot
(Attēla autors Datorizētājs no Pixabay)

Hi!

Mani sauc Jevgeņijs Čerkins, Esmu programmētājs kalnrūpniecības uzņēmuma izstrādes komandā Polimetāls.

Uzsākot jebkuru lielu projektu, jūs sākat domāt: "Kādu programmatūru vislabāk izmantot, lai to apkalpotu?" IT projekts iziet vairākus posmus pirms nākamās versijas izlaišanas. Ir labi, ja šo posmu ķēde ir automatizēta. Tiek saukts automatizētais process, kurā tiek izlaista jauna IT projekta versija Nepārtraukta integrācija. BuildBot izrādījās mums labs palīgs šī procesa īstenošanā.

Šajā rakstā es nolēmu sniegt pārskatu par iespējām BuildBot. Uz ko šī programmatūra spēj? Kā viņam tuvoties un kā ar viņu veidot normālas EFEKTĪVAS DARBA ATTIECĪBAS? Jūs varat izmantot mūsu pieredzi pats, izveidojot pakalpojumu, lai izveidotu un pārbaudītu savu projektu savā mašīnā.

saturs

saturs

1. Kāpēc BuildBot?
2. BuildMaster vadītā koncepcija
3. Uzstādīšana
4. Pirmie soļi

5. Konfigurācija. Soli pa solim recepte

5.1 BuildmasterConfig
5.2 darbinieki
5.3 change_source
5.4 plānotāji

5.5 BuildFactory
5.6 celtnieki

6. Savas konfigurācijas piemērs

6.1. Ceļā uz savu meistaru.cfg
6.2 Darbs ar svn
6.3. Vēstule jums: ziņotāji ir tiesīgi deklarēt

Mēs to izdarījām! Apsveicu

1. Kāpēc BuildBot?

Iepriekš vietnē habr-e es sastapos ar rakstiem par ieviešanu Nepārtraukta integrācija izmantojot BuildBot. Piemēram, Šis Man tas šķita visinformatīvākais. Ir vēl viens piemērs - vienkāršāka. Šos rakstus var garšot piemērs no rokasgrāmatasUn šis pēc tam angļu valodā. Kupeja ir labs sākumpunkts. Pēc šo rakstu izlasīšanas jūs, iespējams, uzreiz kaut ko vēlēsities BuildBot darīt.

Stop! Vai kāds to tiešām ir izmantojis savos projektos? Izrādās, ka jā daudzi izmantoja to savos uzdevumos. Var būt atrasts piemēri izmantot BuildBot un Google kodu arhīvos.

Tātad, kāda ir cilvēku lietošanas loģika Buildbot? Galu galā ir arī citi rīki: Kruīza kontrole и Jenkins. Es atbildēšu šādi. Lielākajai daļai uzdevumu Jenkins un patiesības pietiks. Savukārt, BuildBot - adaptīvāks, savukārt problēmas tur tiek risinātas tikpat vienkārši kā iekšā Jenkins. Izvēle ir tava. Bet, tā kā mēs meklējam rīku mērķprojekta izstrādei, kāpēc gan neizvēlēties tādu, kas, sākot ar vienkāršiem soļiem, ļaus iegūt uzbūves sistēmu ar interaktivitāti un unikālu saskarni.

Tiem, kuru mērķa projekts ir rakstīts python valodā, rodas jautājums: "Kāpēc gan neizvēlēties integrācijas sistēmu, kurai ir skaidrs interfeiss projektā lietotās valodas ziņā?" Un tagad ir pienācis laiks iepazīstināt ar priekšrocībām BuildBot.

Tātad, mūsu “instrumentālais kvartets”. Sev esmu noteicis četras pazīmes BuildBot:

  1. Tas ir atvērtā koda ietvars saskaņā ar GPL licenci
  2. Tas ir python kā konfigurācijas rīka izmantošana un nepieciešamo darbību apraksts
  3. Šī ir iespēja saņemt atbildi no mašīnas, uz kuras notiek montāža
  4. Visbeidzot, šīs ir minimālās prasības resursdatoram. Izvietošanai ir nepieciešams python un twisted, un nav nepieciešama virtuālā mašīna un Java mašīna.

2. BuildMaster vadītā koncepcija

Nepārtrauktas integrācijas ieviešanas piemērs, izmantojot BuildBot

Uzdevumu sadales arhitektūra ir galvenā BuildMaster. Tas ir pakalpojums, kas:

  • seko līdzi izmaiņas projekta avota kokā
  • sūta komandas, kas jāizpilda pakalpojumam Worker, lai izveidotu projektu un to pārbaudītu
  • paziņo lietotājiem par veikto darbību rezultātiem

BuildMaster konfigurēts, izmantojot failu master.cfg. Šis fails atrodas saknē BuildMaster. Vēlāk es parādīšu, kā šī sakne tiek veidota. Pats fails master.cfg satur python skriptu, kas izmanto zvanus BuildBot.

Nākamais svarīgākais objekts BuildBot Tas ir nosaukums Strādnieks. Šo pakalpojumu var palaist citā resursdatorā ar citu OS vai varbūt tajā, kurā BuildMaster. Tā var pastāvēt arī speciāli sagatavotā virtuālajā vidē ar savām pakotnēm un mainīgajiem. Šīs virtuālās vides var sagatavot, izmantojot tādas python utilītas kā virtualenv, venv.

BuildMaster pārraida komandas visiem Strādnieks-y, un viņš, savukārt, tos izpilda. Tas ir, izrādās, ka projekta veidošanas un testēšanas process var turpināties Strādnieks-e, kurā darbojas sistēma Windows, un citā Worker, kurā darbojas Linux.

Izrakstīties projekta pirmkodi notiek katrā Strādnieks-e.

3. Uzstādīšana

Tātad, ejam. Es izmantošu Ubuntu 18.04 kā resursdatoru. Es uzlikšu vienu uz tā BuildMaster-a un viens Strādnieks-a. Bet vispirms jums jāinstalē python3.7:

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

Tiem, kam ir nepieciešams python3.7.2, nevis 3.7.1, varat rīkoties šādi:


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

Nākamais solis ir instalēšana Tvītoja и BuildBot, kā arī pakotnes, kas ļauj izmantot papildu funkcionalitāti BuildBot-.


/*Все что под 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. Pirmie soļi

Laiks radīt BuildMaster. Tas būs mūsu mapē /home/habr/master.

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

Nākamais solis. Izveidosim Strādnieks. Tas būs mūsu mapē /home/habr/worker.

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

Kad tu skrien Strādnieks, pēc noklusējuma tas tiks izveidots /home/habr/worker mapi ar projekta nosaukumu, kas norādīts master.cfg. Un mapē ar projekta nosaukumu tas izveidos direktoriju būvēt, un turpinās to darīt izrakstīšanās. Darba direktorijs Strādnieks-un tas kļūs par direktoriju /home/habr/yourProject/build.

"Zelta atslēga
Un tagad tas, par ko es uzrakstīju iepriekšējo rindkopu: skripts, kas Meistars prasīs no Strādnieks-un veikts attālināti šajā direktorijā netiks izpildīts, jo skriptam nav atļauju palaist. Lai labotu situāciju, jums būs nepieciešama atslēga --umask=0o22, kas aizliedz rakstīt šajā direktorijā, taču saglabās palaišanas tiesības. Un tas ir viss, kas mums vajadzīgs.

BuildMaster и Strādnieks izveidot saikni savā starpā. Gadās, ka nolūst un Strādnieks kādu laiku gaidu atbildi no BuildMaster-A. Ja atbildes nav, savienojums tiek restartēts. Atslēga --keepalive=60 tikai vajadzēja norādīt laiku, pēc kura savienot atsāknēšana.

5. Konfigurācija. Soli pa solim recepte

Konfigurācija BuildMaster tiek veikta tajā mašīnas pusē, kurā mēs izpildījām komandu izveidot-meistars. Mūsu gadījumā tas ir direktorijs /home/habr/master. Konfigurācijas fails master.cfg vēl neeksistē, bet pati komanda jau ir izveidojusi failu master.cmg.sample. Jums tas ir jāpārdēvē uz master.cfg.sample в master.cfg

mv master.cfg.sample master.cfg

Atvērsim šo master.cfg. Un paskatīsimies, no kā tas sastāv. Un pēc tam mēģināsim izveidot savu konfigurācijas failu.

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 — konfigurācijas faila pamata vārdnīca. Tam jābūt iekļautam konfigurācijas failā. Lietošanas ērtībai konfigurācijas kodā ir ieviests aizstājvārds "c". Nosaukumi atslēgu в c["keyFromDist"] ir fiksēti elementi mijiedarbībai ar BuildMaster. Katrai atslēgai atbilstošais objekts tiek aizstāts kā vērtība.

5.2 darbinieki

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

Šoreiz mēs norādām BuildMaster-y saraksts Strādnieks-s. Es pats Strādnieks mēs izveidojām iepriekš, norādot tu-darba vārds и parole. Tagad tie ir jāprecizē piemērs-darbinieks и iet .

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

Pēc atslēgas mainīt_avotu vārdnīca c mēs iegūstam piekļuvi sarakstam, kurā vēlamies ievietot objektu, kas aptaujā repozitoriju ar projekta avota kodu. Piemērā tiek izmantots Git repozitorijs, kas tiek aptaujāts noteiktos intervālos.

Pirmais arguments ir ceļš uz jūsu repozitoriju.

darba dir apzīmē ceļu uz mapi, kas atrodas sānos Strādnieks- ceļa radinieks /home/habr/worker/yourProject/build git saglabās repozitorija vietējo versiju.

filiāle satur noteiktu atzaru repozitorijā, kas būtu jāievēro.

aptaujaIntervāls satur sekunžu skaitu, pēc kura BuildMaster aptauj repozitoriju par izmaiņām.

Ir vairākas metodes, kā izsekot projekta repozitorijā veiktajām izmaiņām.

Vienkāršākā metode ir Aptauja, kas nozīmē, ka BuildMaster periodiski aptaujā serveri ar repozitoriju. Ja izdarīt atspoguļoja izmaiņas repozitorijā, tad BuildMaster ar zināmu kavēšanos izveidos iekšējo objektu Mainīt un nosūtiet to notikuma apstrādātājam Plānotājs, kas sāks darbības, lai izveidotu un pārbaudītu projektu Strādnieks-e. Starp šiem soļiem tiks norādīts atjaunināšana krātuve. Tieši uz StrādnieksTādējādi tiks izveidota lokāla repozitorija kopija. Sīkāka informācija par šo procesu tiks aplūkota turpmākajās divās sadaļās. (5.4 и 5.5).

Vēl elegantāka repozitorijas izmaiņu izsekošanas metode ir ziņojumu sūtīšana tieši no servera, uz kuru tas tiek mitināts BuildMaster- par projekta pirmkodu maiņu. Šajā gadījumā, tiklīdz izstrādātājs to dara izdarīt, serveris ar projekta repozitoriju nosūtīs ziņojumu BuildMaster-y. Un viņš, savukārt, to pārtvers, izveidojot objektu PBCchangeSource. Tālāk šis objekts tiks pārsūtīts uz Plānotājs, kas aktivizē darbības, lai izveidotu projektu un to pārbaudītu. Svarīga šīs metodes sastāvdaļa ir darbs ar āķis-servera skripti repozitorijā. Skriptā āķis-a, kas atbild par apstrādes darbībām, kad izdarīt-e, jums jāzvana utilītai sūtīt maiņa un norādiet tīkla adresi BuildMaster-A. Jums arī jānorāda tīkla ports, kas klausīsies PBCchangeSource. PBCchangeSource, starp citu, ir daļa BuildMaster-A. Šai metodei būs nepieciešama atļauja admin-a serverī, kurā atrodas projekta repozitorijs. Vispirms jums būs jāizveido repozitorija dublējums.

5.4 plānotāji


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

plānotāji – šis ir elements, kas darbojas kā sprūda, kas aizsāk visu projekta montāžas un testēšanas ķēdi.
Nepārtrauktas integrācijas ieviešanas piemērs, izmantojot BuildBot

Tās izmaiņas, kas tika reģistrētas mainīt_avotu, pārveidots darba procesā BuildBot-a iebilst Mainīt un tagad katrs Šedulers pamatojoties uz tiem, tas veido pieprasījumus, lai sāktu projekta veidošanas procesu. Tomēr tas arī nosaka, kad šie pieprasījumi tiek pārsūtīti tālāk uz rindu. Objekts Celtnieks saglabā pieprasījumu rindu un izseko pašreizējās montāžas stāvokli atsevišķā ierīcē Strādnieks-un. Celtnieks pastāv BuildMaster-e un tālāk Strādnieks-e. Viņš sūta ar BuildMaster-a ieslēgts Strādnieks-un jau konkrēti būvēt - virkne darbību, kas jāievēro.
Mēs redzam, ka pašreizējā piemērā tādi plānotāji Tiek izveidoti 2 gabali. Turklāt katram ir savs veids.

SingleBranchScheduler – viena no populārākajām nodarbībām grafikā. Tas vēro vienu atzaru un to iedarbina reģistrētas izmaiņas tajā. Kad viņš redz izmaiņas, viņš var atlikt būvēšanas pieprasījuma nosūtīšanu (atlikt uz īpašajā parametrā norādīto periodu treeStableTimer) Iekšā nosaukums iestata grafika nosaukumu, kas tiks parādīts BuildBot- tīmekļa saskarne. IN Mainīt filtru tiek iestatīts filtrs, pēc kura iziešanas izmaiņas filiālē liek grafikam nosūtīt būvniecības pieprasījumu. IN celtnieku nosaukumi ir norādīts vārds celtnieks-a, ko iestatīsim nedaudz vēlāk. Mūsu gadījumā nosaukums būs tāds pats kā projekta nosaukums: jūsu Projekts.

ForceScheduler ļoti vienkārša lieta. Šāda veida grafiks tiek aktivizēts, noklikšķinot ar peli BuildBot- tīmekļa saskarne. Parametriem ir tāda pati būtība kā SingleBranchScheduler.

PS Nr.3. Varbūt noderēs
Periodiski ir grafiks, kas darbojas noteiktā laikā fiksētā frekvencē. Zvans izskatās apmēram šādi


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 norāda šīs periodiskuma laiku sekundēs.

BuildFactory rada konkrētu būvēt, kas tad celtnieks sūta uz Strādnieks. Uz BuildFactory norāda darbības, kas jāveic Strādnieks-y. Soļi tiek pievienoti, izsaucot metodi pievienotSolis

Pirmais pievienotais solis šajā piemērā ir git clean -d -f -f -xtad git kase. Šīs darbības ir iekļautas parametrā metode, kas nav skaidri norādīts, bet norāda uz noklusējuma vērtību svaigs. Parametrs mode='incremental' norāda, ka faili ir no direktorija, kurā čechout, lai gan trūkst krātuvē, paliek neskarts.

Otrais pievienotais solis ir skripta izsaukšana izmēģinājums ar parametru sveiki uz sāniem Strādnieks-a no direktorija /home/habr/worker/yourProject/build ar vides mainīgo PATHONPATH=... Tādējādi jūs varat rakstīt savus skriptus un izpildīt tos malā Strādnieks- ik uz soļa util.ShellCommand. Šos skriptus var ievietot tieši repozitorijā. Tad plkst čechout-e viņi iekritīs /home/habr/worker/yourProject/build. Tomēr ir divi “bet”:

  1. Strādnieks jāizveido ar atslēgu --umask lai tas nebloķētu izpildes tiesības pēc izrakstīšanās-.
  2. Pie git push-Viens no šiem skriptiem jums ir jānorāda rekvizīts izbeidzamstā ka vēlāk čechout-e nezaudēja tiesības izpildīt Git skriptu.

5.6 celtnieki


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

Par to, kas ir Celtnieks tika stāstīts šeit. Tagad es jums pastāstīšu sīkāk par to, kā to izveidot. BuilderConfig ir konstruktors celtnieks. Tādi dizaineri iekšā c['celtnieki'] varat norādīt vairākus, jo šī ir objektu lapa celtnieks veids. Tagad pārrakstīsim piemēru no BuildBot, tuvinot to mūsu uzdevumam.


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

Tagad es jums pastāstīšu par parametriem BuilderConfig.

nosaukums norāda nosaukumu celtnieks-a. Šeit mēs to nosaucām jūsu Projekts... Tas nozīmē, ka uz Strādnieks- tiks izveidots tieši šis ceļš /home/habr/worker/yourProject/build. Šedulers Meklēju celtnieks tikai ar šo vārdu.

strādnieku vārdi satur lapu Strādnieks-s. Katrs no tiem ir jāpievieno c['darbinieki'].

rūpnīca - konkrēts būvēt, ar ko tas ir saistīts celtnieks. Viņš nosūtīs objektu būvēt par Strādnieks lai pabeigtu visas šajā ietvertās darbības būvēt-.

6. Savas konfigurācijas piemērs

Šeit ir projekta arhitektūras piemērs, kuru es ierosinu ieviest, izmantojot BuildBot
.

Mēs izmantosim kā versiju kontroles sistēmu svn. Pati krātuve atradīsies kaut kādā mākonī. Šeit ir šī mākoņa adrese svn.host/svn/yourProject/stumbrs. Mākonī zem svn ir konta lietotājvārds: lietotājs, passwd: parole. Skripti, kas attēlo darbības būvēt-a arī būs filiālē svn, atsevišķā mapē buildbot/worker_linux. Šie skripti atrodas repozitorijā ar saglabāto rekvizītu izpildāmā.

BuildMaster и Strādnieks palaist tajā pašā resursdatorā projekts.uzņēmēja .BuildMaster saglabā savus failus mapē /home/habr/master. Strādnieks tas tiek saglabāts tālāk norādītajā ceļā /home/habr/worker. Procesu komunikācija BuildMaster- un Strādnieks-a tiek veikta caur portu 4000 saskaņā ar protokolu BuildBot- a, tas ir 'pb' protokols.

Mērķa projekts ir pilnībā uzrakstīts Python. Uzdevums ir izsekot tā izmaiņām, izveidot izpildāmu failu, ģenerēt dokumentāciju un veikt testēšanu. Neveiksmes gadījumā visiem izstrādātājiem ir jānosūta ziņojums pa e-pastu, norādot, ka ir notikusi neveiksmīga darbība.

Web displejs BuildBot mēs izveidosim savienojumu ar 80. portu projekts.uzņēmēja. Nav nepieciešams instalēt Apatch. Kā daļa no bibliotēkas savīti jau ir tīmekļa serveris, BuildBot izmanto to.

Lai saglabātu iekšējo informāciju par BuildBot mēs izmantosim sqlite.

Sūtīšanai ir nepieciešams saimnieks smtp.your.domain - tas ļauj nosūtīt vēstules no pasta [e-pasts aizsargāts] bez autentifikācijas. Arī uzņēmējā 'SMTP Protokols tiek noklausīts postenī 1025.

Šajā procesā ir iesaistīti divi cilvēki: admin и lietotājs. administrators administrē BuildBot. lietotājs ir persona, kas apņemas izdarīt-s.

Izpildāmais fails tiek ģenerēts, izmantojot pyinstaller. Dokumentācija tiek ģenerēta, izmantojot doksigēns.

Šai arhitektūrai es uzrakstīju šo: 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"
}

Vispirms jums vajag izveidot BuildMaster- un Strādnieks-a. Pēc tam ielīmējiet šo failu master.cfg в /home/habr/master.

Nākamais solis ir pakalpojuma palaišana BuildMasteraa


sudo buildbot start /home/habr/master

Pēc tam sāciet pakalpojumu Strādnieks-a


buildbot-worker start /home/habr/worker

Gatavs! Tagad Buildbot izsekos izmaiņas un aktivizēs izdarīt-y iekšā svn, veicot projekta izveides un testēšanas soļus ar augstākminēto arhitektūru.

Tālāk es aprakstīšu dažas iepriekš minētā iezīmes master.cfg.

6.1. Ceļā uz savu meistaru.cfg


Rakstot manu master.cfg Tiks pieļautas daudzas kļūdas, tāpēc būs jālasa žurnālfails. Tas tiek glabāts kā BuildMaster-ec absolūtais ceļš /home/habr/master/twistd.log, un sānos Strādnieks-a ar absolūtu ceļu /home/habr/worker/twistd.log. Izlasot kļūdu un to izlabojot, pakalpojums būs jārestartē BuildMaster-a. Lūk, kā tas tiek darīts:


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

6.2 Darbs ar 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)

Lai sāktu, apskatīsim svn_poller. Šis joprojām ir tas pats interfeiss, kas regulāri veic repozitorija aptauju reizi minūtē. Šajā gadījumā svn_poller piekļūst tikai filiālei stumbrs. Noslēpumains parametrs split_file=util.svn.split_file_alwaystrunk nosaka noteikumus: kā sadalīt mapju struktūru svn uz zariem. Viņš piedāvā viņiem arī relatīvus ceļus. Savukārt split_file_alwaystrunk vienkāršo procesu, sakot, ka repozitorijā ir tikai stumbrs.

В Plānotāji norādīts Mainīt filtrukurš redz neviens un saista ar to filiāli stumbrs saskaņā ar doto asociāciju caur split_file_alwaystrunk. Reaģējot uz izmaiņām stumbrs, Palaiž celtnieks ar vārdu jūsu Projekts.

īpašības šeit tas ir nepieciešams, lai administrators kā procesa īpašnieks saņemtu adresātu sarakstus ar izveides un testēšanas rezultātiem.

Solis būvēt-a izrakstīšanās spēj pilnībā dzēst visus failus, kas atrodas repozitorija vietējā versijā Strādnieks-A. Un tad dariet visu svn atjauninājums. Režīms tiek konfigurēts, izmantojot parametru režīms=pilns, metode = svaigs. Parametrs haltOnTailure saka, ka ja svn atjauninājums tiks izpildīts ar kļūdu, tad viss veidošanas un testēšanas process ir jāaptur, jo turpmākajām darbībām nav jēgas.

6.3. Vēstule jums: ziņotāji ir tiesīgi deklarēt


reportieriem ir pakalpojums paziņojumu nosūtīšanai pa e-pastu.


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]

Viņš var nosūtīt ziņas Dažādi ceļi.

MailNotifier izmanto e-pastu, lai nosūtītu paziņojumus.

template_html iestata informatīvā izdevuma teksta veidni. HTML tiek izmantots, lai izveidotu marķējumu. To pārveido dzinējs jinja2 (var salīdzināt ar Django). BuildBot ir mainīgo lielumu kopa, kuras vērtības tiek aizstātas veidnē ziņojuma teksta ģenerēšanas procesā. Šie mainīgie ir ietverti {{ double curly braces }}. Piemēram, kopsavilkums parāda pabeigto darbību statusu, tas ir, veiksmi vai neveiksmi. A projekti izvadīs jūsu Projekts. Tātad, izmantojot vadības komandas jinja2, mainīgie BuildBot-a un python virknes formatēšanas rīki, varat izveidot diezgan informatīvu ziņojumu.

MailNotifier satur šādus argumentus.

fromaddr – adrese, no kuras ikviens saņems biļetenu.

sūtītInterestedUsers=True nosūta ziņojumu īpašniekam un lietotājam, kas to izveidoja izdarīt.

lookup — sufikss, kas jāpievieno to lietotāju vārdiem, kuri saņem biļetenu. Tātad admin kā lietotājs saņems biļetenu adresē [e-pasts aizsargāts].

relayhost norāda resursdatora nosaukumu, uz kura tiek atvērts serveris SMTP, smptPort norāda porta numuru, kas klausās SMTP serveris.

režīms = brīdinājums saka, ka pasta sūtīšana jāveic tikai tad, ja ir vismaz viens solis būvēt-a, kas beidzās ar statusa kļūmi vai brīdinājumu. Veiksmes gadījumā jaunumu izdevums nav jāsūta.

papildu saņēmēji satur to personu sarakstu, kurām jānosūta sūtījums, papildus īpašniekam un personai, kas to veica izdarīt.

ziņaFormatētājs ir objekts, kas norāda ziņojuma formātu, tā veidni un mainīgo kopu, kas pieejama no jinja2. Iespējas, piemēram, wantProperties=True и wantSteps=Tiesa definējiet šo pieejamo mainīgo kopu.

with['services']=[sendMessageToAll] sniedz pakalpojumu sarakstu, starp kuriem būs arī mūsu reportieris.

Mēs to izdarījām! Apsveicu

Mēs izveidojām paši savu konfigurāciju un redzējām funkcionalitāti, ko tā spēj. BuildBot. Tas, manuprāt, ir pietiekami, lai saprastu, vai šis rīks ir nepieciešams jūsu projekta izveidei. Tevi viņš interesē? Vai tas jums noderēs? Vai ar viņu ir ērti strādāt? Tad es nerakstu šo rakstu velti.

Un tālāk. Es vēlētos, lai to izmantotu profesionālā sabiedrība BuildBot, kļuva plašāks, rokasgrāmatas tika tulkotas, un piemēru bija vēl vairāk.

Paldies visiem par uzmanību. Veiksmi.

Avots: www.habr.com

Pievieno komentāru