Yon egzanp aplikasyon entegrasyon kontinyèl ak BuildBot

Yon egzanp aplikasyon entegrasyon kontinyèl ak BuildBot
(Imaj pa Computerizer soti nan Pixabay)

Hi!

Non mwen se Evgeniy Cherkin, Mwen se yon pwogramè nan yon ekip devlopman nan yon konpayi min Polymetal.

Lè w kòmanse nenpòt gwo pwojè, ou kòmanse panse: "Ki lojisyèl ki pi bon pou itilize pou sèvis li?" Yon pwojè IT ale nan yon kantite etap anvan lage pwochen vèsyon an. Li bon lè chèn etap sa yo otomatize. Yo rele pwosesis otomatik pou pibliye yon nouvo vèsyon yon pwojè IT tèt li Entegrasyon kontinyèl. BuildBot te tounen yon bon asistan pou nou nan aplikasyon pwosesis sa a.

Nan atik sa a mwen deside bay yon apèsi sou posiblite yo BuildBot. Ki sa ki lojisyèl sa a kapab? Ki jan yo apwoche l 'ak ki jan yo bati yon nòmal RELASYON TRAVAY EFIKAS ak li? Ou ka aplike eksperyans nou an tèt ou lè w kreye yon sèvis k ap travay pou bati ak teste pwojè w sou machin ou.

Content

Content

1. Poukisa BuildBot?
2. Konsèp ki te dirije pa BuildMaster
3. Enstalasyon
4. Premye etap yo

5. Konfigirasyon. Etap pa etap resèt

5.1 BuildmasterConfig
5.2 travayè
5.3 change_source
5.4 orè

5.5 BuildFactory
5.6 bòs mason

6. Egzanp pwòp configuration ou

6.1 Sou wout pou mèt ou.cfg
6.2 Travay ak svn
6.3 Lèt pou ou: repòtè yo gen otorizasyon pou yo deklare

Nou te fè li! Felisitasyon

1. Poukisa BuildBot?

Précédemment sou habr-e mwen te rankontre atik sou aplikasyon Entegrasyon kontinyèl lè l sèvi avèk BuildBot. Pa egzanp, Yon sèl sa a Mwen te jwenn li ki pi enfòmatif. Gen yon lòt egzanp - pi senp. Atik sa yo ka sezonman egzanp nan manyèl laAk sa a apre sa, an Angle. Koupe a fè yon bon pwen depa. Apre ou fin li atik sa yo, ou pral pwobableman imedyatman vle yon bagay sou BuildBot pou fè.

Sispann! Èske gen moun ki aktyèlman itilize li nan pwojè yo? Li sanble wi anpil aplike li nan travay yo. Ou ka jwenn egzanp itilize nan BuildBot ak nan achiv kòd Google yo.

Se konsa, ki sa ki lojik nan moun ki itilize Buildbot? Apre yo tout, gen lòt zouti: CruiseControl и Jenkins. Mwen pral reponn fason sa a. Pou pifò travay Jenkins e verite a ap ase. Nan vire li, BuildBot - plis adaptasyon, pandan ke pwoblèm yo rezoud la kòm tou senpleman tankou nan Jenkins. Chwa a se pou ou. Men, depi nou ap chèche pou yon zouti pou yon pwojè sib devlope, poukisa pa chwazi youn ki pral pèmèt, kòmanse nan etap senp, jwenn yon sistèm bati ki gen entèaktif ak yon koòdone inik.

Pou moun ki gen pwojè sib yo ekri nan piton, kesyon an rive: "Poukisa yo pa chwazi yon sistèm entegrasyon ki gen yon koòdone klè an tèm de lang yo itilize nan pwojè a?" Epi kounye a li lè yo prezante benefis yo BuildBot.

Se konsa, nou an "instrumental quartet". Pou tèt mwen, mwen te idantifye kat karakteristik BuildBot:

  1. Li se yon fondasyon sous louvri anba lisans GPL
  2. Sa a se itilizasyon python kòm yon zouti konfigirasyon ak deskripsyon aksyon ki nesesè yo
  3. Sa a se yon opòtinite yo resevwa yon repons nan men machin nan sou asanble a pran plas
  4. Sa yo se, finalman, kondisyon yo minimòm pou yon Lame. Deplwaman mande pou python ak trese, epi li pa mande pou yon machin vityèl ak machin java.

2. Konsèp ki te dirije pa BuildMaster

Yon egzanp aplikasyon entegrasyon kontinyèl ak BuildBot

Santral achitekti distribisyon travay la se BuildMaster. Li se yon sèvis ki:

  • kenbe tras chanjman nan pyebwa sous pwojè a
  • voye kòmandman sèvis Travayè a ta dwe egzekite pou konstwi pwojè a epi teste li
  • notifye itilizatè yo sou rezilta aksyon yo pran

BuildMaster konfigirasyon atravè dosye mèt.cfg. Fichye sa a se nan rasin lan BuildMaster. Apre sa, mwen pral montre kijan rasin sa a kreye. Dosye a li menm mèt.cfg gen yon script python ki sèvi ak apèl BuildBot.

Pwochen objè ki pi enpòtan BuildBot gen yon non Travayè. Sèvis sa a ka lanse sou yon lòt lame ak yon OS diferan, oswa petèt sou youn nan kote BuildMaster. Li kapab egziste tou nan yon anviwònman vityèl ki prepare espesyalman ak pwòp pakè ak varyab li yo. Anviwònman vityèl sa yo ka prepare lè l sèvi avèk sèvis piblik python tankou virtualenv, venv.

BuildMaster difize kòmandman bay tout moun Travayè-y, epi li, nan vire, akonpli yo. Sa vle di, li sanble ke pwosesis la nan bati ak tès yon pwojè ka kontinye Travayè-e kouri Windows ak sou yon lòt travayè kouri Linux.

Kesye kòd sous pwojè rive sou chak Travayè-e.

3. Enstalasyon

Donk, ann ale. Mwen pral sèvi ak Ubuntu 18.04 kòm lame a. Mwen pral mete youn sou li BuildMaster-a ak youn Travayè-a. Men, anvan ou bezwen enstale python3.7:

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

Pou moun ki bezwen python3.7.2 olye de 3.7.1, ou ka fè bagay sa yo:


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

Pwochen etap la se enstale Tweeted и BuildBot, osi byen ke pakè ki pèmèt ou sèvi ak fonksyonalite adisyonèl BuildBot-La.


/*Все что под 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. Premye etap yo

Tan pou kreye BuildMaster. Li pral nan katab nou an /home/habr/master.

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

Lòt etap. Ann kreye Travayè. Li pral nan katab nou an /kay/habr/travayè.

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

Lè ou kouri Travayè, Lè sa a, pa default li pral kreye nan /kay/habr/travayè katab ak non pwojè a, ki espesifye nan mèt.cfg. Ak nan katab la ak non an nan pwojè a li pral kreye yon anyè bati, epi yo pral kontinye fè li kesye. Anyè travay pou Travayè-epi li pral tounen yon anyè /home/habr/yourProject/build.

"Kle an lò
Epi, koulye a sa mwen te ekri paragraf anvan an pou: yon script ki Mèt pral mande nan men Travayè-ak fè adistans nan anyè sa a pa pral egzekite paske script la pa gen otorizasyon yo kouri. Pou korije sitiyasyon an, w ap bezwen yon kle --umask=0o22, ki entèdi ekri nan anyè sa a, men ki pral kenbe dwa lansman. E se tout sa nou bezwen.

BuildMaster и Travayè etabli yon koneksyon youn ak lòt. Li rive ke li kraze koupe ak Travayè ap tann pou kèk tan pou yon repons soti nan BuildMaster-A. Si pa gen okenn repons, koneksyon an rekòmanse. Kle --keepalive=60 jis bezwen endike tan an apre sa konekte rdemare.

5. Konfigirasyon. Etap pa etap resèt

Konfigirasyon BuildMaster se te pote soti sou bò a nan machin nan kote nou egzekite lòd la kreye-mèt. Nan ka nou an, sa a se yon anyè /home/habr/master. Fichye konfigirasyon mèt.cfg pa egziste ankò, men kòmandman an li menm te deja kreye dosye a mèt.cmg.echantiyon. Ou bezwen chanje non li mèt.cfg.echantiyon в mèt.cfg

mv master.cfg.sample master.cfg

Ann louvri yon sèl sa a mèt.cfg. Epi ann gade nan ki sa li konsiste. Apre sa, ann eseye fè pwòp dosye konfigirasyon nou an.

mèt.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 — diksyonè debaz dosye konfigirasyon an. Li dwe enkli nan dosye konfigirasyon an. Pou fasilite yo itilize, yon alyas prezante nan kòd konfigirasyon an "c". Tit kle в c["keyFromDist"] se eleman fiks pou entèraksyon ak BuildMaster. Pou chak kle, objè ki koresponn lan ranplase kòm yon valè.

5.2 travayè

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

Fwa sa a nou endike BuildMaster-y lis Travayè-s. Mwen menm Travayè nou te kreye pi wo a, ki endike ou-travayè-non и modpas. Koulye a, yo bezwen espesifye olye egzanp-travayè и pase .

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

Pa kle change_source diksyonè c nou jwenn aksè nan lis la kote nou vle mete yon objè ki sondaj depo a ak kòd sous pwojè a. Egzanp lan sèvi ak yon depo Git ki te vote nan sèten entèval.

Premye agiman an se chemen ki mennen nan depo ou a.

travay dir reprezante chemen ki mennen nan katab la kote sou bò a Travayè-yon relatif nan chemen an /home/habr/worker/yourProject/build git pral estoke vèsyon lokal la nan repozitwa a.

Branch gen yon branch espesifik nan repozitwa a ki ta dwe swiv.

pollInterval gen kantite segonn apre sa BuildMaster pral sondaj repozitwa a pou chanjman.

Gen plizyè metòd pou swiv chanjman nan depo yon pwojè.

Metòd ki pi senp lan se Biwo vòt, ki vle di sa BuildMaster tanzantan sondaj sèvè a ak repozitwa a. Si komèt reflete chanjman yo nan depo a, lè sa a BuildMaster pral kreye yon objè entèn ak kèk reta Chanje epi voye li bay moun kap okipe evènman an Planifikateur, ki pral lanse etap yo bati ak teste pwojè a sou Travayè-e. Pami etap sa yo pral endike aktyalizasyon depo. Egzakteman sou TravayèSa a pral kreye yon kopi lokal depo a. Detay yo sou pwosesis sa a pral kouvri anba a nan de pwochen seksyon yo. (5.4 и 5.5).

Yon metòd menm plis elegant nan swiv chanjman nan yon depo se voye mesaj dirèkteman nan sèvè a hosting li nan BuildMaster- sou chanje kòd sous pwojè yo. Nan ka sa a, le pli vit ke pwomotè a fè komèt, sèvè a ak depo pwojè a pral voye yon mesaj BuildMaster-y. Apre sa, li, nan vire, pral entèsepte li pa kreye yon objè PBChangeSource. Apre sa, objè sa a pral transfere nan Planifikateur, ki aktive etap yo bati pwojè a ak teste li. Yon pati enpòtan nan metòd sa a se travay ak zen-sèvè scripts nan depo a. Nan script la zen-a, responsab pou trete aksyon lè komèt-e, ou bezwen rele sèvis piblik la voye chanje epi presize adrès rezo a BuildMaster-A. Ou bezwen tou presize pò rezo a ki pral koute PBChangeSource. PBChangeSource, nan chemen an, se yon pati BuildMaster-A. Metòd sa a pral mande pèmisyon admin-a sou sèvè a kote depo pwojè a ye. Ou pral premye bezwen fè yon backup nan repozitwa a.

5.4 orè


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

pwogramè yo – sa a se yon eleman ki aji kòm yon deklanche ki kòmanse tout chèn nan asanble ak tès nan pwojè a.
Yon egzanp aplikasyon entegrasyon kontinyèl ak BuildBot

Chanjman sa yo ki te anrejistre change_source, transfòme nan pwosesis travay la BuildBot-a fè objeksyon Chanje e kounye a chak Sheduler baze sou yo, li bati demann yo kòmanse pwosesis la bati pwojè. Sepandan, li detèmine tou lè demann sa yo transfere pi lwen nan keu la. Yon objè Konstrukteur magazen yon keu nan demann epi swiv eta a nan asanble aktyèl la sou yon separe Travayè-e. Konstrukteur egziste sou BuildMaster-e ak sou Travayè-e. Li voye ak BuildMaster-yon sou Travayè-ak deja espesifik bati - yon seri etap ki dwe swiv.
Nou wè ke nan egzanp aktyèl la tankou pwogramè yo 2 moso yo kreye. Anplis de sa, chak gen kalite pwòp li yo.

SingleBranchScheduler - youn nan klas ki pi popilè nan orè a. Li gade yon branch epi li deklanche pa yon chanjman anrejistre nan li. Lè li wè chanjman, li ka retade voye demann konstriksyon an (ranfere pou peryòd ki espesifye nan paramèt espesyal la. treeStableTimer). IN File fikse non orè a ki pral parèt nan BuildBot-koòdone entènèt. NAN Chanje Filtè se yon filtè mete, apre yo fin pase ki chanjman nan branch lan mande orè a voye yon demann pou konstriksyon. NAN builderNames non yo endike mason-a, ke nou pral mete yon ti kras pita. Non nan ka nou an pral menm jan ak non pwojè a: Pwojè w la.

ForceScheduler yon bagay trè senp. Sa a se kalite orè deklanche pa yon klike sou sourit nan BuildBot-koòdone entènèt. Paramèt yo gen menm sans ak nan SingleBranchScheduler.

PS nimewo 3. Petèt li pral vin an sou la men
Peryodik se yon orè ki kouri nan yon sèten tan-fiks frekans. Apèl la sanble yon bagay tankou sa a


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": "."}))

periodBuildTimer presize tan peryodik sa a an segonn.

BuildFactory kreye yon espesifik bati, ki lè sa a mason voye bay Travayè. Nan BuildFactory endike etap yo dwe swiv Travayè-y. Etap yo ajoute lè w rele metòd la addStep

Premye etap la ajoute nan egzanp sa a se git clean -d -f -f –xlè sa a git kesye. Aksyon sa yo enkli nan paramèt la metòd, ki pa endike klèman men implique yon valè default fre. Paramèt mòd = 'enkresyonèl' endike ke dosye yo soti nan anyè a kote yo chechout, pandan y ap manke nan depo a, rete intact.

Dezyèm etap la ajoute se rele script la jijman ak paramèt alo sou bò Travayè-a soti nan anyè /home/habr/worker/yourProject/build ak anviwònman varyab PATHONPATH=... Kidonk, ou ka ekri pwòp script ou epi egzekite yo sou bò a. Travayè-a chak etap util.ShellCommand. Scripts sa yo ka mete dirèkteman nan depo a. Lè sa a, nan chechout-e yo pral tonbe nan /home/habr/worker/yourProject/build. Sepandan, Lè sa a, gen de "men":

  1. Travayè dwe kreye ak yon kle --umask pou ke li pa bloke dwa ekzekisyon apre kesye-La.
  2. Nan git pouse-e nan scripts sa yo ou bezwen presize pwopriyete a egzakitabpou sa pita chechout-e pa t pèdi dwa pou egzekite script Git la.

5.6 bòs mason


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

Sou sa ki Konstrukteur te di isit la. Koulye a, mwen pral di ou nan plis detay sou ki jan yo kreye li. BuilderConfig se yon konstrukteur mason. Konsèpteur sa yo nan c ['mason'] ou ka presize plizyè, paske sa a se yon fèy objè mason kalite. Koulye a, ann reekri egzanp nan BuildBot, pote li pi pre travay nou an.


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

Koulye a, mwen pral di ou sou paramèt yo BuilderConfig.

File espesifye non an mason-a. Isit la nou te nonmen li Pwojè w la... Sa vle di ke sou Travayè- chemen sa a menm pral kreye /home/habr/worker/yourProject/build. Sheduler kap chèche mason jis sou non sa a.

non travayè yo gen fèy Travayè-s. Chak nan yo dwe ajoute nan c ['travayè'].

faktori - espesifik bati, ak ki li asosye mason. Li pral voye objè a bati sou Travayè pou konplete tout etap ki enkli nan sa a bati-La.

6. Egzanp pwòp configuration ou

Isit la se achitekti pwojè egzanp ke mwen pwopoze aplike atravè BuildBot
.

Nou pral itilize kòm yon sistèm kontwòl vèsyon svn. Repozitwa nan tèt li pral lokalize nan kèk kalite nwaj. Men adrès nwaj sa a svn.host/svn/yourProject/trunk. Nan nwaj la anba svn gen yon non itilizatè kont: itilizatè, passwd: modpas. Scripts ki reprezante etap yo bati-a ap tou nan branch lan svn, nan yon katab separe buildbot/worker_linux. Scripts sa yo sitiye nan depo a ak pwopriyete a sove ègzèkutabl.

BuildMaster и Travayè kouri sou menm lame a pwojè.lame .BuildMaster estoke dosye li yo nan yon katab /home/habr/master. Travayè li estoke nan chemen sa a /kay/habr/travayè. Pwosesis kominikasyon BuildMaster-a ak Travayè-a te pote soti nan pò 4000 dapre pwotokòl la BuildBot-a, sa vle di 'pb' pwotokòl.

Pwojè sib la ekri antyèman nan Python. Travay la se swiv chanjman li yo, kreye yon dosye ègzèkutabl, jenere dokiman, ak fè tès. Nan ka echèk, tout devlopè yo bezwen voye yon mesaj pa imel ki di ke gen yon aksyon san siksè.

Ekspozisyon entènèt BuildBot nou pral konekte ak pò 80 pou pwojè.lame. Li pa nesesè pou enstale Apatch. Kòm yon pati nan bibliyotèk la sere gen deja yon sèvè entènèt, BuildBot sèvi ak li.

Pou estoke enfòmasyon entèn pou BuildBot nou pral itilize sqlite.

Yon lame obligatwa pou poste smtp.domèn.ou - li pèmèt voye lèt nan lapòs [imèl pwoteje] san otantifikasyon. Epitou sou lame a 'smp ' Yo tande minit yo nan pòs 1025.

Gen de moun ki enplike nan pwosesis la: admin и itilizatè. admin administre BuildBot. itilizatè se moun ki komèt la komèt-s.

Fichye egzaktabl pwodwi atravè pyinstaller. Dokimantasyon yo pwodwi atravè doksijèn.

Pou achitekti sa a mwen te ekri sa a: mèt.cfg:

mèt.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"
}

Premye ou bezwen kreye BuildMaster-a ak Travayè-a. Lè sa a, kole dosye sa a mèt.cfg в /home/habr/master.

Pwochen etap la se kòmanse sèvis la BuildMastera


sudo buildbot start /home/habr/master

Lè sa a, kòmanse sèvis la Travayè-a


buildbot-worker start /home/habr/worker

Pare! Kounye a Buildbot pral swiv chanjman ak deklanche komèt-y nan svn, fè etap sa yo nan bati ak tès yon pwojè ak achitekti ki pi wo a.

Anba a mwen pral dekri kèk karakteristik nan pi wo a mèt.cfg.

6.1 Sou wout pou mèt ou.cfg


Pandan w ap ekri mwen mèt.cfg Anpil erè yo pral fè, kidonk li pral ranpli dosye a. Li estoke kòm BuildMaster-ec chemen absoli /home/habr/master/twistd.log, ak sou bò a Travayè-a ak chemen absoli /home/habr/worker/twistd.log. Pandan w ap li erè a epi ranje li, w ap bezwen rekòmanse sèvis la BuildMaster-a. Men ki jan li fèt:


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

6.2 Travay ak 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)

Premyèman, kite a pran yon gade nan svn_poller. Sa a se toujou menm koòdone a, regilyèman biwo vòt depo a yon fwa pa minit. Nan ka sa svn_poller sèlman aksè nan branch lan kòf. Paramèt misterye split_file=util.svn.split_file_alwaystrunk fikse règ yo: ki jan yo kraze estrikti nan katab svn sou branch yo. Li ofri yo tou chemen relatif. Nan vire li split_file_alwaystrunk senplifye pwosesis la lè li di ke repozitwa a sèlman gen ladan l kòf.

В Orè yo endike Chanje Filtèki moun ki wè Pa gen okenn epi asosye yon branch ak li kòf dapre yon asosyasyon bay atravè split_file_alwaystrunk. Reponn a chanjman nan kòf, Lanse mason ak non Pwojè w la.

pwopriyete isit la li nesesè pou administratè a resevwa lis adrès nan bati ak rezilta tès kòm pwopriyetè pwosesis la.

Etap bati-a kesye kapab konplètman efase nenpòt ki dosye ki sitiye nan vèsyon lokal la nan repozitwa a Travayè-A. Lè sa a, fè plen la svn aktyalizasyon. Se mòd nan configuré atravè paramèt la mòd = plen, metòd = fre. Paramèt haltOnTailure di ke si svn aktyalizasyon pral egzekite ak yon erè, Lè sa a, tout pwosesis la nan bilding ak tès yo ta dwe sispann, depi plis aksyon pa fè sans.

6.3 Lèt pou ou: repòtè yo gen otorizasyon pou yo deklare


repòtè se yon sèvis pou voye notifikasyon pa imel.


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]

Li ka voye mesaj diferan fason.

MailNotifier itilize imel pou voye notifikasyon.

template_html fikse modèl tèks pou bilten an. HTML yo itilize pou kreye mak. Li modifye pa motè a jinja2 (ka konpare ak django). BuildBot gen yon seri varyab ki gen valè yo ranplase nan modèl la pandan pwosesis la nan jenere tèks mesaj la. Varyab sa yo fèmen nan {{ doub akolad boukle }}. Pa egzanp, rezime montre estati a nan operasyon fini, se sa ki, siksè oswa echèk. A pwojè pral pwodiksyon Pwojè w la. Se konsa, lè l sèvi avèk kòmandman kontwòl nan jinja2, varyab BuildBot-a ak python fisèl fòma zouti, ou ka kreye yon mesaj byen enfòmatif.

MailNotifier gen agiman sa yo.

fromaddr – adrès kote tout moun ap resevwa bilten an.

sendToInterestedUsers=True voye yon mesaj bay pwopriyetè a ak itilizatè ki te fè a komèt.

rechèch — yon sifiks ki dwe ajoute nan non itilizatè k ap resevwa bilten an. Se konsa admin ki jan itilizatè a pral resevwa bilten an nan adrès la [imèl pwoteje].

relayhost espesifye non host la sou ki sèvè a louvri smp, Yon smptPort espesifye nimewo pò a ki koute smp sèvè.

mòd="avètisman" di ke poste a ta dwe fèt sèlman si gen omwen yon etap bati-a, ki te fini ak echèk estati a oswa avètisman. Nan ka siksè, pa gen okenn nesesite pou voye yon bilten.

Resipyan siplemantè gen yon lis moun ki ta dwe voye poste a anplis de pwopriyetè a ak moun ki te pote a komèt.

messageFormatter se yon objè ki espesifye fòma mesaj la, modèl li yo, ak yon seri varyab ki disponib nan jinja2. Opsyon tankou wantProperties=Vre и wantSteps=Vre defini seri sa a nan varyab ki disponib.

with['services']=[voyeMessageToAll] bay yon lis sèvis, pami nou yo pral repòtè.

Nou te fè li! Felisitasyon

Nou te kreye pwòp konfigirasyon nou epi nou te wè fonksyonalite li kapab. BuildBot. Sa a, mwen panse, se ase yo konprann si zouti sa a nesesè yo kreye pwojè ou a. Èske w enterese nan li? Èske l ap itil ou? Èske li konfòtab pou travay avèk li? Lè sa a, mwen pa ekri atik sa a pou gremesi.

Ak pi lwen. Mwen ta renmen kominote pwofesyonèl la ap itilize BuildBot, te vin pi laj, manyèl yo te tradui, e te gen menm plis egzanp.

Mèsi tout pou atansyon ou. Bon chans.

Sous: www.habr.com

Add nouvo kòmantè