Isang halimbawa ng pagpapatupad ng Continuous Integration gamit ang BuildBot

Isang halimbawa ng pagpapatupad ng Continuous Integration gamit ang BuildBot
(Larawan ni Computerizer mula Pixabay)

Привет!

Ang pangalan ko ay Evgeniy Cherkin, Ako ay isang programmer sa isang development team sa isang mining company Polymetal.

Kapag nagsimula ng anumang malaking proyekto, nagsisimula kang mag-isip: "Anong software ang pinakamahusay na gamitin upang mapanatili ito?" Dumadaan ang isang proyekto sa IT sa ilang yugto bago ilabas ang susunod na bersyon. Mabuti kapag ang kadena ng mga yugtong ito ay awtomatiko. Ang automated na proseso ng paglalabas ng bagong bersyon ng isang proyekto ng IT mismo ay tinatawag Patuloy na Pagsasama. BuildBot naging mabuting katulong namin sa pagpapatupad ng prosesong ito.

Sa artikulong ito nagpasya akong magbigay ng pangkalahatang-ideya ng mga posibilidad BuildBot. Ano ang kaya ng software na ito? Paano siya lapitan at paano bumuo ng isang normal na EFFECTIVE WORKING RELATIONSHIP sa kanya? Maaari mong ilapat ang aming karanasan sa pamamagitan ng paggawa ng isang gumaganang serbisyo para sa pagbuo at pagsubok ng iyong proyekto sa iyong makina.

nilalaman

nilalaman

1. Bakit BuildBot?
2. Konsepto na pinangunahan ng BuildMaster
3. Pag-install
4. Mga unang hakbang

5. Configuration. Hakbang-hakbang na recipe

5.1 BuildmasterConfig
5.2 manggagawa
5.3 change_source
5.4 mga scheduler

5.5 BuildFactory
5.6 tagabuo

6. Halimbawa ng sarili mong configuration

6.1 Sa daan patungo sa iyong master.cfg
6.2 Nagtatrabaho sa svn
6.3 Liham sa iyo: ang mga reporter ay awtorisadong magdeklara

Nagawa natin! Binabati kita

1. Bakit BuildBot?

Dati sa habr-e nakatagpo ako ng mga artikulo tungkol sa pagpapatupad Patuloy na Pagsasama gamit BuildBot. Hal, Itong isa Natagpuan ko ito ang pinaka-kaalaman. May isa pang halimbawa - mas simple. Ang mga artikulong ito ay maaaring tikman halimbawa mula sa manwalAt это pagkatapos nito, sa Ingles. Ang coupe ay gumagawa ng isang magandang panimulang punto. Pagkatapos basahin ang mga artikulong ito, malamang na may gusto ka kaagad BuildBot gawin.

Tumigil ka! Mayroon bang gumamit nito sa kanilang mga proyekto? Oo nga pala marami inilapat ito sa kanilang mga gawain. Maaaring matagpuan mga halimbawa gamitin BuildBot at sa mga archive ng code ng Google.

Kaya kung ano ang lohika ng mga tao na gumagamit Buildbot? Pagkatapos ng lahat, may iba pang mga tool: CruiseControl и Jenkins. Sasagot ako ng ganito. Para sa karamihan ng mga gawain Jenkins at ang katotohanan ay magiging sapat na. Sa turn nito, BuildBot - mas madaling umangkop, habang ang mga problema ay nalulutas doon nang simple tulad ng sa Jenkins. Nasa iyo ang pagpipilian. Ngunit dahil naghahanap kami ng tool para sa pagbuo ng target na proyekto, bakit hindi pumili ng isa na magbibigay-daan, simula sa mga simpleng hakbang, upang makakuha ng build system na may interaktibidad at kakaibang interface.

Para sa mga taong ang target na proyekto ay nakasulat sa python, ang tanong ay lumitaw: "Bakit hindi pumili ng isang sistema ng pagsasama na may malinaw na interface sa mga tuntunin ng wikang ginamit sa proyekto?" At ngayon ay oras na upang ipakita ang mga benepisyo BuildBot.

Kaya, ang aming "instrumental quartet". Para sa aking sarili, natukoy ko ang apat na tampok BuildBot:

  1. Ito ay isang open source na balangkas sa ilalim ng lisensya ng GPL
  2. Ito ang paggamit ng python bilang isang tool sa pagsasaayos at paglalarawan ng mga kinakailangang aksyon
  3. Ito ay isang pagkakataon upang makatanggap ng tugon mula sa makina kung saan nagaganap ang pagpupulong
  4. Ito ay, sa wakas, ang pinakamababang kinakailangan para sa isang Host. Ang deployment ay nangangailangan ng python at twisted, at hindi nangangailangan ng virtual machine at java machine.

2. Konsepto na pinangunahan ng BuildMaster

Isang halimbawa ng pagpapatupad ng Continuous Integration gamit ang BuildBot

Ang sentro ng arkitektura ng pamamahagi ng gawain ay BuildMaster. Ito ay isang serbisyo na:

  • Sinusubaybayan mga pagbabago sa puno ng pinagmulan ng proyekto
  • nagpapadala mga utos na dapat isagawa ng serbisyo ng Manggagawa upang maitayo ang proyekto at subukan ito
  • nagpapaalam mga gumagamit tungkol sa mga resulta ng mga pagkilos na ginawa

BuildMaster na-configure sa pamamagitan ng file master.cfg. Ang file na ito ay nasa ugat BuildMaster. Mamaya ay ipapakita ko kung paano nilikha ang ugat na ito. Ang file mismo master.cfg naglalaman ng script ng python na gumagamit ng mga tawag BuildBot.

Susunod na pinakamahalagang bagay BuildBot Ito ay may mga pangalan Manggagawa. Ang serbisyong ito ay maaaring ilunsad sa isa pang host na may ibang OS, o marahil sa isa kung saan BuildMaster. Maaari rin itong umiral sa isang espesyal na inihandang virtual na kapaligiran na may sarili nitong mga pakete at variable. Ang mga virtual na kapaligiran na ito ay maaaring ihanda gamit ang mga python utilities tulad ng virtualenv, venv.

BuildMaster nag-broadcast ng mga utos sa lahat Manggagawa-y, at siya naman ay tinutupad ang mga ito. Iyon ay, lumalabas na ang proseso ng pagbuo at pagsubok ng isang proyekto ay maaaring magpatuloy Manggagawa-e nagpapatakbo ng Windows at sa isa pang Manggagawa na nagpapatakbo ng Linux.

Tignan mo ang mga source code ng proyekto ay nangyayari sa bawat isa Manggagawa-e.

3. Pag-install

So, tara na. Gagamitin ko ang Ubuntu 18.04 bilang host. Ilalagay ko ang isa dito BuildMaster-a at isa Manggagawa-a. Ngunit kailangan mo munang mag-install ng python3.7:

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

Para sa mga nangangailangan ng python3.7.2 sa halip na 3.7.1, maaari mong gawin ang sumusunod:


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

Ang susunod na hakbang ay ang pag-install Na-tweet и BuildBot, pati na rin ang mga pakete na nagbibigay-daan sa iyong gumamit ng karagdagang pag-andar BuildBot-Ang.


/*Все что под 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. Mga unang hakbang

Oras upang lumikha BuildMaster. Ito ay makikita sa aming folder /home/habr/master.

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

Susunod na hakbang. Lumikha tayo Manggagawa. Ito ay makikita sa aming folder /home/habr/worker.

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

Kapag tumakbo ka Manggagawa, pagkatapos bilang default ay lilikha ito sa /home/habr/worker folder na may pangalan ng proyekto, na tinukoy sa master.cfg. At sa folder na may pangalan ng proyekto ay lilikha ito ng isang direktoryo magtayo, at patuloy itong gagawin pagsisiyasat. Direktoryo ng pagtatrabaho para sa Manggagawa-at ito ay magiging isang direktoryo /home/habr/yourProject/build.

"Gintuang Susi
At ngayon kung ano ang sinulat ko sa nakaraang talata para sa: isang script na Panginoon hihingi sa Manggagawa-at ginawa nang malayuan sa direktoryo na ito ay hindi isasagawa dahil ang script ay walang mga karapatang tumakbo. Upang itama ang sitwasyon, kakailanganin mo ng isang susi --umask=0o22, na nagbabawal sa pagsulat sa direktoryong ito, ngunit mananatili ang mga karapatan sa paglulunsad. At iyon lang ang kailangan natin.

BuildMaster и Manggagawa magtatag ng koneksyon sa isa't isa. Ito ay nangyayari na ito break off at Manggagawa naghihintay ng ilang oras para sa tugon mula sa BuildMaster-A. Kung walang tugon, ang koneksyon ay restart. Susi --keepalive=60 kailangan lang ipahiwatig ang oras pagkatapos nito ikabit nagre-reboot.

5. Configuration. Hakbang-hakbang na recipe

Configuration BuildMaster ay isinasagawa sa gilid ng makina kung saan namin pinaandar ang utos lumikha-master. Sa aming kaso, ito ay isang direktoryo /home/habr/master. File ng configuration master.cfg ay wala pa, ngunit ang utos mismo ay nakalikha na ng file master.cmg.sample. Kailangan mong palitan ang pangalan nito sa master.cfg.sample в master.cfg

mv master.cfg.sample master.cfg

Buksan natin ang isang ito master.cfg. At tingnan natin kung ano ang binubuo nito. At pagkatapos nito, subukan nating gumawa ng sarili nating configuration file.

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 — pangunahing diksyunaryo ng configuration file. Dapat itong kasama sa configuration file. Para sa kadalian ng paggamit, ang isang alias ay ipinakilala sa code ng pagsasaayos "c". Mga pamagat ng mga susi в c["keyFromDist"] ay mga nakapirming elemento para sa pakikipag-ugnayan sa BuildMaster. Para sa bawat key, ang katumbas na bagay ay pinapalitan bilang isang halaga.

5.2 manggagawa

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

Sa pagkakataong ito ay ipinapahiwatig namin BuildMaster-y listahan ng Manggagawa-s. Ang sarili ko Manggagawa nilikha namin sa itaas, na nagpapahiwatig pangalan-manggagawa mo и password. Ngayon kailangan nilang tukuyin sa halip halimbawang manggagawa и pumasa .

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

Sa pamamagitan ng susi change_source diksyunaryo c nakakakuha tayo ng access sa listahan kung saan gusto nating maglagay ng object na nagbo-poll sa repository na may source code ng proyekto. Ang halimbawa ay gumagamit ng Git repository na sinusuri sa ilang partikular na pagitan.

Ang unang argumento ay ang landas sa iyong repositoryo.

workdir kumakatawan sa landas patungo sa folder kung saan nasa gilid Manggagawa-isang kamag-anak sa landas /home/habr/worker/yourProject/build Ang git ay mag-iimbak ng lokal na bersyon ng imbakan.

sangay naglalaman ng isang partikular na sangay sa repositoryo na dapat sundin.

pollInterval naglalaman ng bilang ng mga segundo pagkatapos nito BuildMaster poll ang repositoryo para sa mga pagbabago.

Mayroong ilang mga paraan upang subaybayan ang mga pagbabago sa repositoryo ng isang proyekto.

Ang pinakasimpleng paraan ay Pagboto, na nagpapahiwatig na BuildMaster pana-panahong binobotohan ang server gamit ang repositoryo. Kung gumawa sumasalamin sa mga pagbabago sa repositoryo, pagkatapos BuildMaster ay lilikha ng panloob na bagay na may ilang pagkaantala Baguhin at ipadala ito sa tagapangasiwa ng kaganapan Scheduler, na maglulunsad ng mga hakbang sa pagbuo at pagsubok sa proyekto Manggagawa-e. Kabilang sa mga hakbang na ito ay ipahiwatig update imbakan. Eksakto sa ManggagawaGagawa ito ng lokal na kopya ng repositoryo. Ang mga detalye ng prosesong ito ay tatalakayin sa ibaba sa susunod na dalawang seksyon. (5.4 и 5.5).

Ang isang mas eleganteng paraan ng pagsubaybay sa mga pagbabago sa isang repository ay ang direktang magpadala ng mga mensahe mula sa server na nagho-host nito BuildMaster- tungkol sa pagbabago ng mga source code ng proyekto. Sa kasong ito, sa sandaling gumawa ang developer gumawa, magpapadala ng mensahe ang server na may repositoryo ng proyekto BuildMaster-y. At siya naman, haharangin ito sa pamamagitan ng paglikha ng isang bagay PBChangeSource. Susunod, ang bagay na ito ay ililipat sa Scheduler, na nagpapagana sa mga hakbang upang buuin ang proyekto at subukan ito. Ang isang mahalagang bahagi ng pamamaraang ito ay gumagana sa kawitan-server script sa repositoryo. Sa script kawitan-a, responsable para sa pagproseso ng mga aksyon kapag gumawa-e, kailangan mong tawagan ang utility magpadala ng pagbabago at tukuyin ang address ng network BuildMaster-A. Kailangan mo ring tukuyin ang network port na makikinig PBChangeSource. PBChangeSource, sa pamamagitan ng paraan, ay bahagi BuildMaster-A. Ang pamamaraang ito ay mangangailangan ng pahintulot admin-a sa server kung saan matatagpuan ang repositoryo ng proyekto. Kakailanganin mo munang gumawa ng backup ng repositoryo.

5.4 mga scheduler


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

mga scheduler – ito ay isang elemento na nagsisilbing trigger na nagsisimula sa buong hanay ng pagpupulong at pagsubok ng proyekto.
Isang halimbawa ng pagpapatupad ng Continuous Integration gamit ang BuildBot

Ang mga pagbabagong iyon na naitala change_source, binago sa proseso ng trabaho BuildBot-a tumutol Baguhin at ngayon tuwing Sheduler batay sa kanila, bumubuo ito ng mga kahilingan upang simulan ang proseso ng pagbuo ng proyekto. Gayunpaman, tinutukoy din nito kung kailan ililipat ang mga kahilingang ito sa pila. Isang bagay Ang nagpapagawa nag-iimbak ng pila ng mga kahilingan at sinusubaybayan ang estado ng kasalukuyang pagpupulong sa isang hiwalay Manggagawa-e. Ang nagpapagawa umiiral sa BuildMaster-e at sa Manggagawa-e. Nagpapadala siya kasama BuildMaster-a on Manggagawa-at tiyak na magtayo - isang serye ng mga hakbang na dapat sundin.
Nakikita natin na sa kasalukuyang halimbawa ay ganito mga scheduler 2 piraso ay nilikha. Bukod dito, ang bawat isa ay may sariling uri.

SingleBranchScheduler – isa sa mga pinakasikat na klase sa iskedyul. Nanonood ito ng isang branch at na-trigger ng isang naitalang pagbabago dito. Kapag nakakita siya ng mga pagbabago, maaari niyang iantala ang pagpapadala ng kahilingan sa pagbuo (ipagpaliban ang panahon na tinukoy sa espesyal na parameter treeStableTimer) Sa pangalan nagtatakda ng pangalan ng iskedyul na ipapakita sa BuildBot-interface sa web. SA ChangeFilter nakatakda ang isang filter, pagkatapos maipasa kung aling mga pagbabago sa sangay ang mag-prompt sa iskedyul na magpadala ng kahilingan para sa pagtatayo. SA builderNames ipinahiwatig ang pangalan tagabuo ng-a, na itatakda natin mamaya. Ang pangalan sa aming kaso ay magiging kapareho ng pangalan ng proyekto: iyong Proyekto.

ForceScheduler isang napakasimpleng bagay. Ang ganitong uri ng iskedyul ay na-trigger ng isang pag-click sa pamamagitan ng mouse BuildBot-interface sa web. Ang mga parameter ay may parehong kakanyahan tulad ng sa SingleBranchScheduler.

PS No. 3. Marahil ito ay magiging kapaki-pakinabang
Pana-panahon ay isang iskedyul na tumatakbo sa isang tiyak na frequency na nakatakda sa oras. Parang ganito ang tawag


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 tumutukoy sa oras ng periodicity na ito sa mga segundo.

BuildFactory lumilikha ng isang tiyak magtayo, na noon tagabuo ng ipinapadala sa Manggagawa. Sa BuildFactory nagsasaad ng mga hakbang na dapat sundin Manggagawa-y. Ang mga hakbang ay idinagdag sa pamamagitan ng pagtawag sa pamamaraan addStep

Ang unang idinagdag na hakbang sa halimbawang ito ay git clean -d -f -f –xpagkatapos git checkout. Ang mga pagkilos na ito ay kasama sa parameter paraan, na hindi malinaw na nakasaad ngunit nagpapahiwatig ng default na halaga sariwa. Parameter mode='incremental' ay nagpapahiwatig na ang mga file ay mula sa direktoryo kung saan ang chechout, habang nawawala sa repository, mananatiling hindi nagalaw.

Ang pangalawang idinagdag na hakbang ay ang pagtawag sa script pagsubok may parameter hoy sa gilid Manggagawa-a mula sa direktoryo /home/habr/worker/yourProject/build gamit ang variable ng kapaligiran na PATHONPATH=... Kaya, maaari mong isulat ang iyong sariling mga script at isagawa ang mga ito sa gilid Manggagawa-a bawat hakbang util.ShellCommand. Ang mga script na ito ay maaaring direktang ilagay sa repositoryo. Pagkatapos sa chechout-e mahuhulog sila sa /home/habr/worker/yourProject/build. Gayunpaman, mayroong dalawang "ngunit":

  1. Manggagawa dapat gawin gamit ang isang susi --umask upang hindi nito harangan ang mga karapatan sa pagpapatupad pagkatapos pagsisiyasat-Ang.
  2. Sa git push-e sa mga script na ito kailangan mong tukuyin ang property maipapatupadpara mamaya chechout-e hindi nawalan ng karapatang isagawa ang Git script.

5.6 tagabuo


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

Tungkol sa kung ano Ang nagpapagawa sinabihan dito. Ngayon sasabihin ko sa iyo nang mas detalyado kung paano ito likhain. BuilderConfig ay isang constructor tagabuo ng. Ang ganitong mga designer sa c['mga tagabuo'] maaari mong tukuyin ang ilan, dahil ito ay isang sheet ng mga bagay tagabuo ng uri. Ngayon ay muling isulat natin ang halimbawa mula sa BuildBot, pinalalapit ito sa ating gawain.


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

Ngayon sasabihin ko sa iyo ang tungkol sa mga parameter BuilderConfig.

pangalan tumutukoy sa pangalan tagabuo ng-a. Dito namin pinangalanan iyong Proyekto. Nangangahulugan ito na sa Manggagawa- ang mismong landas na ito ay malilikha /home/habr/worker/yourProject/build. Sheduler Naghahanap ng tagabuo ng sa pamamagitan lamang ng pangalang ito.

mga pangalan ng manggagawa naglalaman ng sheet Manggagawa-s. Ang bawat isa ay dapat idagdag sa c['manggagawa'].

pabrika - tiyak magtayo, kung saan ito nauugnay tagabuo ng. Ipapadala niya ang bagay magtayo sa Manggagawa upang makumpleto ang lahat ng mga hakbang na kasama dito magtayo-Ang.

6. Halimbawa ng sarili mong configuration

Narito ang halimbawa ng arkitektura ng proyekto na iminumungkahi kong ipatupad sa pamamagitan ng BuildBot
.

Gagamitin namin bilang isang version control system svn. Ang repositoryo mismo ay matatagpuan sa ilang uri ng ulap. Narito ang address ng ulap na ito svn.host/svn/yourProject/trunk. Sa ulap sa ilalim svn mayroong isang account username: gumagamit, passwd: password. Mga script na kumakatawan sa mga hakbang magtayo-a ay magiging sa sangay din svn, sa isang hiwalay na folder buildbot/worker_linux. Ang mga script na ito ay matatagpuan sa repository na may naka-save na property pinatutupad.

BuildMaster и Manggagawa tumakbo sa parehong host project.host .BuildMaster nag-iimbak ng mga file nito sa isang folder /home/habr/master. Manggagawa ito ay naka-imbak sa sumusunod na landas /home/habr/worker. Proseso ng komunikasyon BuildMaster-a at Manggagawa-a ay isinasagawa sa pamamagitan ng port 4000 ayon sa protocol BuildBot-a, iyon ay 'pb' protocol.

Ang target na proyekto ay ganap na nakasulat sa Python. Ang gawain ay subaybayan ang mga pagbabago nito, lumikha ng isang maipapatupad na file, bumuo ng dokumentasyon, at magsagawa ng pagsubok. Sa kaso ng pagkabigo, ang lahat ng mga developer ay kailangang magpadala ng mensahe sa pamamagitan ng email na nagsasabi na mayroong isang hindi matagumpay na pagkilos.

Pagpapakita sa web BuildBot kami ay kumonekta sa port 80 para sa project.host. Hindi kinakailangang i-install ang Apache. Bilang bahagi ng aklatan baluktot mayroon nang web server, BuildBot ginagamit ito.

Upang mag-imbak ng panloob na impormasyon para sa BuildBot gagamitin natin sqlite.

Ang isang host ay kinakailangan para sa pagpapadala ng koreo smtp.your.domain - pinapayagan nito ang pagpapadala ng mga liham mula sa koreo [protektado ng email] nang walang pagpapatunay. Gayundin sa host 'SMTP ' Ang mga minuto ay dinidinig sa post 1025.

Mayroong dalawang tao na kasangkot sa proseso: admin и gumagamit. pinangangasiwaan ng admin BuildBot. ang gumagamit ay ang taong gumagawa gumawa-s.

Nabuo ang exacutable file sa pamamagitan ng pyinstaller. Ang dokumentasyon ay nabuo sa pamamagitan ng doxygen.

Para sa arkitektura na ito isinulat ko ito: 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"
}

Una kailangan mo upang lumikha BuildMaster-a at Manggagawa-a. Pagkatapos ay i-paste ang file na ito master.cfg в /home/habr/master.

Ang susunod na hakbang ay upang simulan ang serbisyo BuildMaster-a


sudo buildbot start /home/habr/master

Pagkatapos ay simulan ang serbisyo Manggagawa-a


buildbot-worker start /home/habr/worker

handa na! Ngayon Buildbot susubaybayan ang mga pagbabago at magti-trigger gumawa-y sa svn, nagsasagawa ng mga hakbang sa pagbuo at pagsubok ng isang proyekto na may arkitektura sa itaas.

Sa ibaba ay ilalarawan ko ang ilang mga tampok ng nasa itaas master.cfg.

6.1 Sa daan patungo sa iyong master.cfg


Habang sinusulat ang aking master.cfg Maraming mga error ang gagawin, kaya ang pagbabasa ng log file ay kinakailangan. Ito ay naka-imbak bilang BuildMaster-ec ganap na landas /home/habr/master/twistd.log, at sa gilid Manggagawa-a na may ganap na landas /home/habr/worker/twistd.log. Habang binabasa mo ang error at inaayos ito, kakailanganin mong i-restart ang serbisyo BuildMaster-a. Narito kung paano ito ginagawa:


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

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

Una, tingnan natin svn_poller. Ito pa rin ang parehong interface, regular na pagboto sa repositoryo isang beses sa isang minuto. Sa kasong ito svn_poller nag-a-access lamang sa sangay nguso ng elepante. Mahiwagang parameter split_file=util.svn.split_file_alwaystrunk nagtatakda ng mga patakaran: kung paano hatiin ang istraktura ng folder svn sa mga sanga. Nag-aalok din siya sa kanila ng mga kamag-anak na landas. Sa turn nito split_file_alwaystrunk pinapasimple ang proseso sa pamamagitan ng pagsasabi na naglalaman lamang ang repositoryo nguso ng elepante.

В Mga tagapag-iskedyul ipinahiwatig ChangeFiltersino ang nakakakita Wala at iniuugnay ang isang sangay dito nguso ng elepante ayon sa isang ibinigay na asosasyon sa pamamagitan ng split_file_alwaystrunk. Pagtugon sa mga pagbabago sa nguso ng elepante, Naglulunsad tagabuo ng may pangalan iyong Proyekto.

mga katangian dito ito ay kinakailangan upang ang admin ay makatanggap ng mga mailing list ng mga resulta ng build at pagsubok bilang may-ari ng proseso.

Hakbang magtayo-a pagsisiyasat may kakayahang ganap na tanggalin ang anumang mga file na matatagpuan sa lokal na bersyon ng repositoryo Manggagawa-A. At pagkatapos ay gawin ang buong pag-update ng svn. Ang mode ay na-configure sa pamamagitan ng parameter mode=puno, paraan=sariwa. Parameter humintoOnTailure sinasabi na kung pag-update ng svn ay isasagawa nang may error, pagkatapos ay ang buong proseso ng pagbuo at pagsubok ay dapat na masuspinde, dahil ang mga karagdagang aksyon ay hindi makatwiran.

6.3 Liham sa iyo: ang mga reporter ay awtorisadong magdeklara


reporter ay isang serbisyo para sa pagpapadala ng mga abiso sa pamamagitan ng email.


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]

Maaari siyang magpadala ng mga mensahe iba't ibang paraan.

MailNotifier gumagamit ng email upang magpadala ng mga abiso.

template_html nagtatakda ng template ng teksto para sa newsletter. Ginagamit ang HTML upang lumikha ng markup. Ito ay binago ng makina jinja2 (maaaring ihambing sa django). BuildBot ay may isang hanay ng mga variable na ang mga halaga ay pinapalitan sa template sa panahon ng proseso ng pagbuo ng text ng mensahe. Ang mga variable na ito ay nakapaloob sa {{ double curly braces }}. Halimbawa, buod ipinapakita ang katayuan ng mga nakumpletong operasyon, iyon ay, tagumpay o kabiguan. A ay proyekto ay output iyong Proyekto. Kaya, gamit ang mga control command sa jinja2, mga variable BuildBot-a at mga tool sa pag-format ng string ng python, maaari kang lumikha ng isang medyo nagbibigay-kaalaman na mensahe.

MailNotifier naglalaman ng mga sumusunod na argumento.

mula saaddr – ang address kung saan matatanggap ng lahat ang newsletter.

sendToInterestedUsers=Nagpapadala ang True ng mensahe sa may-ari at user na gumawa gumawa.

paghahanap — isang suffix na dapat idagdag sa mga pangalan ng mga user na tumatanggap ng newsletter. Kaya admin kung paano matatanggap ng user ang newsletter sa address [protektado ng email].

relayhost tumutukoy sa hostname kung saan binuksan ang server SMTPSa smtPort tumutukoy sa numero ng port na nakikinig SMTP server.

mode="babala" sinasabi na ang pagpapadala ay dapat lamang gawin kung mayroong kahit isang hakbang magtayo-a, na nagtapos sa pagkabigo sa katayuan o babala. Sa kaso ng tagumpay, hindi na kailangang magpadala ng newsletter.

mga extraRecipient naglalaman ng listahan ng mga tao kung kanino dapat ipadala ang pagpapadala bilang karagdagan sa may-ari at sa taong nagsagawa ng gumawa.

messageFormatter ay isang bagay na tumutukoy sa format ng mensahe, template nito, at isang hanay ng mga variable na makukuha mula sa jinja2. Mga pagpipilian tulad ng wantProperties=Totoo и wantSteps=Totoo tukuyin ang hanay na ito ng mga magagamit na variable.

with['services']=[sendMessageToAll] ay nagbibigay ng isang listahan ng mga serbisyo, kung saan ang sa amin ay magiging reporter.

Nagawa natin! Binabati kita

Gumawa kami ng sarili naming configuration at nakita namin ang functionality na kaya nito. BuildBot. Ito, sa palagay ko, ay sapat na upang maunawaan kung ang tool na ito ay kinakailangan upang lumikha ng iyong proyekto. Interesado ka ba sa kanya? Magiging kapaki-pakinabang ba ito sa iyo? Komportable ba siyang katrabaho? Kung gayon hindi ko isinusulat ang artikulong ito nang walang kabuluhan.

At higit pa. Gusto kong ginagamit ng propesyonal na komunidad BuildBot, naging mas malawak, isinalin ang mga manwal, at marami pang mga halimbawa.

Salamat sa lahat ng iyong atensyon. Good luck.

Pinagmulan: www.habr.com

Magdagdag ng komento