Príklad implementácie nepretržitej integrácie pomocou BuildBot

Príklad implementácie nepretržitej integrácie pomocou BuildBot
(Obrázok od Computerizer z Pixabay)

Ahoj!

Volám Jevgenij Čerkin, Som programátor vo vývojovom tíme v ťažobnej spoločnosti Polymetal.

Pri spustení akéhokoľvek veľkého projektu začnete premýšľať: „Aký softvér je najlepšie použiť na jeho údržbu? IT projekt pred vydaním ďalšej verzie prechádza niekoľkými fázami. Je dobré, keď je reťazec týchto fáz automatizovaný. Automatizovaný proces samotného uvoľnenia novej verzie IT projektu je tzv Kontinuálna integrácia. BuildBot sa nám ukázal ako dobrý pomocník pri implementácii tohto procesu.

V tomto článku som sa rozhodol poskytnúť prehľad možností BuildBot. Čo dokáže tento softvér? Ako k nemu pristupovať a ako si s ním vybudovať normálny EFEKTÍVNY PRACOVNÝ VZŤAH? Naše skúsenosti môžete sami uplatniť vytvorením fungujúcej služby na zostavenie a testovanie vášho projektu na vašom stroji.

Obsah

Obsah

1. Prečo BuildBot?
2. Koncept vedený BuildMasterom
3. Inštalácia
4. Prvé kroky

5. Konfigurácia. Recept krok za krokom

5.1 BuildmasterConfig
pracovníci 5.2
5.3 change_source
5.4 plánovače

5.5 BuildFactory
5.6 staviteľov

6. Príklad vlastnej konfigurácie

6.1 Na ceste k vášmu master.cfg
6.2 Práca so svn
6.3 List pre vás: reportéri sú oprávnení vyhlásiť

Zvládli sme to! gratulujem

1. Prečo BuildBot?

Predtým som na habr-e narazil na články o implementácii Kontinuálna integrácia s BuildBot, Napríklad Toto Zdalo sa mi to najinformatívnejšie. Existuje ďalší príklad - ľahšie. Tieto články sa dajú okoreniť príklad z manuáluA это potom v angličtine. Kupé je dobrým východiskovým bodom. Po prečítaní týchto článkov budete pravdepodobne hneď chcieť niečo na sebe BuildBot urobiť.

Stop! Použil to niekto skutočne vo svojich projektoch? Ukazuje sa, že áno veľa aplikovali ho vo svojich úlohách. Môže byť najdený príklady použitie BuildBot a v archívoch kódov Google.

Aká je teda logika ľudí pomocou Buildbot? Koniec koncov, existujú aj iné nástroje: Tempomat и Jenkins. Odpoviem takto. Pre väčšinu úloh Jenkins a pravdy bude stačiť. Na druhej strane BuildBot - prispôsobivejší, pričom problémy sa tam riešia rovnako jednoducho ako v Jenkins. Výber je na tebe. Ale keďže hľadáme nástroj pre vyvíjajúci sa cieľový projekt, prečo si nevybrať taký, ktorý umožní, počnúc jednoduchými krokmi, získať zostavovací systém, ktorý má interaktivitu a jedinečné rozhranie.

Pre tých, ktorých cieľový projekt je napísaný v pythone, vyvstáva otázka: „Prečo si nezvoliť integračný systém, ktorý má jasné rozhranie z hľadiska jazyka použitého v projekte? A teraz je čas predstaviť výhody BuildBot.

Takže naše „inštrumentálne kvarteto“. Pre seba som identifikoval štyri vlastnosti BuildBot:

  1. Je to open source framework pod licenciou GPL
  2. Ide o použitie pythonu ako konfiguračného nástroja a popis požadovaných akcií
  3. Toto je príležitosť získať odpoveď od stroja, na ktorom prebieha montáž
  4. Toto sú napokon minimálne požiadavky na hostiteľa. Nasadenie vyžaduje python a twisted a nevyžaduje virtuálny stroj a java stroj.

2. Koncept vedený BuildMasterom

Príklad implementácie nepretržitej integrácie pomocou BuildBot

Ústredným prvkom architektúry distribúcie úloh je BuildMaster. Ide o službu, ktorá:

  • sleduje zmeny v zdrojovom strome projektu
  • posiela príkazy, ktoré by mala vykonať služba Worker na zostavenie projektu a jeho otestovanie
  • oznamuje používateľov o výsledkoch vykonaných akcií

BuildMaster nakonfigurovaný cez súbor master.cfg. Tento súbor je v koreňovom adresári BuildMaster. Neskôr ukážem, ako sa tento koreň vytvára. Samotný súbor master.cfg obsahuje python skript, ktorý používa volania BuildBot.

Ďalší najdôležitejší objekt BuildBot To má názov Pracovník. Táto služba môže byť spustená na inom hostiteľovi s iným operačným systémom alebo možno na tom, kde BuildMaster. Môže existovať aj v špeciálne pripravenom virtuálnom prostredí s vlastnými balíkmi a premennými. Tieto virtuálne prostredia je možné pripraviť pomocou pomocných programov pythonu, ako je napr virtualenv, venv.

BuildMaster vysiela príkazy všetkým Pracovník-y, a on ich zasa plní. To znamená, že sa ukazuje, že proces budovania a testovania projektu môže pokračovať Pracovník-e so systémom Windows a na inom pracovníkovi so systémom Linux.

Odhlásiť sa zdrojové kódy projektu sa vyskytujú na každom z nich Pracovník-e.

3. Inštalácia

Tak, poďme. Ako hostiteľa budem používať Ubuntu 18.04. Jednu na ňu položím BuildMaster-a jeden Pracovník-a. Najprv však musíte nainštalovať python3.7:

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

Pre tých, ktorí potrebujú python3.7.2 namiesto 3.7.1, môžete urobiť nasledovné:


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

Ďalším krokom je inštalácia Tweetoval и BuildBot, ako aj balíky, ktoré vám umožňujú využívať ďalšie funkcie BuildBot-A.


/*Все что под sudo будет установленно для всех пользователей в директорию /usr/local/lib/python3.7/dist-packages*/

#На хосте который производит мониторинг Worker-ов 
sudo pip install twisted #Библиотека twisted
sudo pip install buildbot #BuildMaster
#Дополнительный функционал
pip install pysqlite3 #Устанавливаем базу sqllite в учебных целях
pip install jinja2 #framework наподобие django, для web и для почтовых рассыллок
pip install autobahn #Web cокеты для связи BuildMaster->Worker
pip install sqlalchemy sqlalchemy-migrate #Для отображения схемы базы данных
#Для Web отображения BuildBot-a
pip install buildbot-www buildbot-grid-view buildbot-console-view buildbot-waterfall-view
pip install python-dateutil #Отображение дат в web
#На стороне хоста который непосредственно осуществляет сборку и тестирование 
pip install buildbot-worker #Worker
#Дополнительный функционал
sudo pip install virtualenv #Виртуальная среда 

4. Prvé kroky

Čas na vytvorenie BuildMaster. Bude v našom priečinku /domov/habr/majster.

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

Ďalši krok. Poďme tvoriť Pracovník. Bude v našom priečinku /domov/habr/pracovník.

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

Keď bežíte Pracovník, potom sa predvolene vytvorí v /domov/habr/pracovník priečinok s názvom projektu, ktorý je uvedený v master.cfg. A v priečinku s názvom projektu vytvorí adresár vybudovať, a bude v tom pokračovať pokladňa. Pracovný adresár pre Pracovník-a stane sa z neho adresár /home/habr/yourProject/build.

"Zlatý kľúč."
A teraz to, kvôli čomu som napísal predchádzajúci odsek: scenár, ktorý majster bude požadovať od Pracovník-a vykonané vzdialene v tomto adresári sa nevykonajú, pretože skript nemá povolenia na spustenie. Na nápravu situácie budete potrebovať kľúč --umask=0o22, ktorý zakazuje zapisovanie do tohto adresára, ale zachová si práva na spustenie. A to je všetko, čo potrebujeme.

BuildMaster и Pracovník nadviazať spojenie medzi sebou. Stáva sa, že sa odlomí a Pracovník čakám nejaký čas na odpoveď od BuildMaster-A. Ak nepríde žiadna odpoveď, pripojenie sa reštartuje. kľúč --keepalive=60 len treba uviesť čas, po ktorom pripojiť reštartuje.

5. Konfigurácia. Recept krok za krokom

konfigurácia BuildMaster sa vykonáva na strane stroja, kde sme príkaz vykonali vytvoriť-majster. V našom prípade ide o adresár /domov/habr/majster. Konfiguračný súbor master.cfg zatiaľ neexistuje, ale samotný príkaz už súbor vytvoril master.cmg.sample. Musíte ho premenovať na master.cfg.sample в master.cfg

mv master.cfg.sample master.cfg

Otvorme tento master.cfg. A pozrime sa, z čoho pozostáva. A potom sa pokúsme vytvoriť vlastný konfiguračný súbor.

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 — základný slovník konfiguračného súboru. Musí byť súčasťou konfiguračného súboru. Pre uľahčenie používania je v konfiguračnom kóde zavedený alias "c". Tituly klávesov в c["keyFromDist"] sú pevné prvky na interakciu s BuildMaster. Pre každý kľúč je príslušný objekt nahradený hodnotou.

pracovníci 5.2

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

Tentoraz naznačujeme BuildMaster-y zoznam Pracovník-s. Ja sám Pracovník sme vytvorili nad, čo naznačuje ty-meno-pracovníka и heslo. Teraz ich treba špecifikovať príkladný pracovník и prejsť .

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

Podľa kľúča change_source slovník c získame prístup k zoznamu, do ktorého chceme vložiť objekt, ktorý sa pýta na úložisko so zdrojovým kódom projektu. Príklad používa úložisko Git, ktoré sa v určitých intervaloch vyvoláva.

Prvým argumentom je cesta k vášmu úložisku.

workdir predstavuje cestu k priečinku, kde je na strane Pracovník-vzťah k ceste /home/habr/worker/yourProject/build git uloží lokálnu verziu úložiska.

vetva obsahuje konkrétnu vetvu v úložisku, ktorá by sa mala dodržiavať.

pollInterval obsahuje počet sekúnd, po ktorých BuildMaster vyzve úložisko na zmeny.

Existuje niekoľko metód na sledovanie zmien v úložisku projektu.

Najjednoduchšia metóda je polling, čo znamená, že BuildMaster pravidelne žiada server s úložiskom. Ak spáchať odrážali zmeny v úložisku BuildMaster vytvorí interný objekt s určitým oneskorením Zmena a odošlite ho obsluhe udalosti Scheduler, ktorá spustí kroky na zostavenie a testovanie projektu Pracovník-e. Medzi týmito krokmi budú uvedené aktualizovať Úložisko. Presne na PracovníkTým sa vytvorí lokálna kópia úložiska. Podrobnosti o tomto procese budú uvedené nižšie v nasledujúcich dvoch častiach. (5.4 и 5.5).

Ešte elegantnejšou metódou sledovania zmien v úložisku je posielanie správ priamo zo servera, ktorý ho hostí BuildMaster- o zmene zdrojových kódov projektu. V tomto prípade, akonáhle vývojár urobí spáchať, server s úložiskom projektu odošle správu BuildMaster-y. A on to zas zachytí vytvorením objektu PBChangeSource. Ďalej bude tento objekt prenesený do Scheduler, ktorý aktivuje kroky na zostavenie projektu a jeho testovanie. Dôležitou súčasťou tejto metódy je práca s háčik-serverové skripty v úložisku. V scenári háčik-a, zodpovedný za úkony spracovania, keď spáchať-e, musíte zavolať obslužný program odoslať zmenu a zadajte sieťovú adresu BuildMaster-A. Musíte tiež určiť sieťový port, ktorý bude počúvať PBChangeSource. PBChangeSource, mimochodom, je súčasťou BuildMaster-A. Táto metóda bude vyžadovať povolenie admin-a na serveri, kde sa nachádza úložisko projektu. Najprv budete musieť vytvoriť zálohu úložiska.

5.4 plánovače


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ánovačov – ide o prvok, ktorý funguje ako spúšťač, ktorý spúšťa celý reťazec montáže a testovania projektu.
Príklad implementácie nepretržitej integrácie pomocou BuildBot

Zmeny, ktoré boli zaznamenané change_source, transformované v procese práce BuildBot-a namietať Zmena a teraz každý Plánovač na ich základe zostavuje požiadavky na spustenie procesu zostavovania projektu. Určuje však aj to, kedy sa tieto požiadavky prenesú ďalej do frontu. Objekt Staviteľ ukladá rad požiadaviek a samostatne sleduje stav aktuálneho zhromaždenia Pracovník-a. Staviteľ existuje na BuildMaster-e a ďalej Pracovník-e. Posiela s BuildMaster-a na Pracovník- a už konkrétne vybudovať - séria krokov, ktoré treba dodržať.
Vidíme, že na aktuálnom príklade napr plánovačov Sú vytvorené 2 kusy. Okrem toho má každý svoj vlastný typ.

SingleBranchScheduler – jedna z najobľúbenejších tried v rozvrhu. Sleduje jednu vetvu a spúšťa ju zaznamenaná zmena v nej. Keď uvidí zmeny, môže odložiť odoslanie požiadavky na zostavenie (odložiť na obdobie uvedené v špeciálnom parametri treeStableTimer). názov nastaví názov rozvrhu, ktorý sa zobrazí v BuildBot- webové rozhranie. IN ChangeFilter je nastavený filter, po prejdení ktorého zmeny vo vetve vyzvú harmonogram na zaslanie požiadavky na výstavbu. IN mená staviteľov je uvedené meno staviteľ-a, ktorý nastavíme o niečo neskôr. Názov v našom prípade bude rovnaký ako názov projektu: vášProjekt.

ForceScheduler veľmi jednoduchá vec. Tento typ rozvrhu sa spúšťa kliknutím myši BuildBot- webové rozhranie. Parametre majú rovnakú podstatu ako v SingleBranchScheduler.

PS č.3. Možno sa to bude hodiť
periodický je plán, ktorý beží v určitej časovo pevnej frekvencii. Hovor vyzerá asi takto


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 určuje čas tejto periodicity v sekundách.

BuildFactory vytvára špecifický vybudovať, ktorý potom staviteľ posiela do Pracovník. V BuildFactory označuje kroky, ktoré treba dodržať Pracovník-y. Kroky sa pridávajú volaním metódy addStep

Prvým pridaným krokom v tomto príklade je git clean -d -f -f -x, potom pokladňa git. Tieto akcie sú zahrnuté v parametri metóda, čo nie je jasne uvedené, ale predpokladá predvolenú hodnotu svieža. Parameter mode='incremental' označuje, že súbory sú z adresára, v ktorom je chechout, aj keď chýbajú v úložisku, zostávajú nedotknuté.

Druhým pridaným krokom je volanie skriptu pokus s parametrom ahoj na strane Pracovník-a z adresára /home/habr/worker/yourProject/build s premennou prostredia PATHONPATH=... Takto môžete písať svoje vlastné skripty a spúšťať ich na strane Pracovník- na každom kroku util.ShellCommand. Tieto skripty je možné umiestniť priamo do úložiska. Potom o chechout-e padnú do /home/habr/worker/yourProject/build. Existujú však dve „ale“:

  1. Pracovník musí byť vytvorený pomocou kľúča --umask aby neblokoval exekučné práva po pokladňa-A.
  2. Na git push-e z týchto skriptov musíte špecifikovať vlastnosť vykonateľnýtakže neskôr chechout-e nestratilo právo vykonávať skript Git.

5.6 staviteľov


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

O tom, čo je Staviteľ bolo povedané tu. Teraz vám poviem podrobnejšie o tom, ako ho vytvoriť. BuilderConfig je konštruktér staviteľ. Takíto dizajnéri v c['builders'] môžete zadať niekoľko, keďže ide o hárok objektov staviteľ typu. Teraz prepíšme príklad z BuildBot, čím sa priblížime k našej úlohe.


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

Teraz vám poviem o parametroch BuilderConfig.

názov určuje názov staviteľ-a. Tu sme to pomenovali vášProjekt... To znamená, že na Pracovník- práve táto cesta bude vytvorená /home/habr/worker/yourProject/build. Plánovač hľadám staviteľ práve týmto názvom.

pracovné mená obsahuje list Pracovník-s. Každý z nich musí byť pridaný c['pracovníci'].

továreň - špecifický vybudovať, s ktorým je spojená staviteľ. Pošle predmet vybudovať na Pracovník dokončiť všetky kroky, ktoré sú v tomto zahrnuté vybudovať-A.

6. Príklad vlastnej konfigurácie

Tu je príklad architektúry projektu, ktorý navrhujem implementovať cez BuildBot
.

Použijeme ako systém na správu verzií svn. Samotné úložisko bude umiestnené v nejakom cloude. Tu je adresa tohto cloudu svn.host/svn/yourProject/trunk. V oblaku pod ním svn existuje používateľské meno účtu: užívateľ, heslo: heslo. Skripty, ktoré predstavujú kroky vybudovať-a bude aj v pobočke svn, v samostatnom priečinku buildbot/worker_linux. Tieto skripty sa nachádzajú v úložisku s uloženou vlastnosťou spustiteľný.

BuildMaster и Pracovník bežať na rovnakom hostiteľovi projekt.hostiteľ .BuildMaster ukladá svoje súbory do priečinka /domov/habr/majster. Pracovník je uložený v nasledujúcej ceste /domov/habr/pracovník. Procesná komunikácia BuildMaster-a a Pracovník-a sa vykonáva cez port 4000 podľa protokolu BuildBot-a, teda 'pb' protokol.

Cieľový projekt je napísaný celý v Pythone. Úlohou je sledovať jeho zmeny, vytvárať spustiteľný súbor, generovať dokumentáciu a vykonávať testovanie. V prípade zlyhania musia všetci vývojári poslať správu e-mailom o neúspešnej akcii.

Webové zobrazenie BuildBot pripojíme sa k portu 80 pre projekt.hostiteľ. Nie je potrebné inštalovať Apatch. Ako súčasť knižnice skrútený už existuje webový server, BuildBot používa to.

Na ukladanie interných informácií pre BuildBot budeme používať sqlite.

Na odosielanie pošty je potrebný hostiteľ smtp.vasa.domena - umožňuje odosielanie listov z pošty [chránené e-mailom] bez autentifikácie. Tiež na hostiteľovi 'smtp “ Zápisnica sa vypočuje na pošte 1025.

Do procesu sú zapojené dve osoby: admin и užívateľ. admin spravuje BuildBot. užívateľ je osoba, ktorá sa zaväzuje spáchať-s.

Spustiteľný súbor sa generuje cez pyinstaller. Dokumentácia sa generuje cez doxygén.

Pre túto architektúru som napísal toto: 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"
}

Najprv potrebujete vytvoriť BuildMaster-a a Pracovník-a. Potom prilepte tento súbor master.cfg в /domov/habr/majster.

Ďalším krokom je spustenie služby BuildMasters


sudo buildbot start /home/habr/master

Potom spustite službu Pracovník-a


buildbot-worker start /home/habr/worker

Pripravený! Teraz Buildbot bude sledovať zmeny a spúšťať spáchať-y v svn, vykonávanie krokov budovania a testovania projektu s vyššie uvedenou architektúrou.

Nižšie popíšem niektoré funkcie vyššie uvedeného master.cfg.

6.1 Na ceste k vášmu master.cfg


Pri písaní mojej master.cfg Urobí sa veľa chýb, takže bude potrebné prečítať súbor denníka. Je uložený ako BuildMaster-ec absolútna cesta /home/habr/master/twistd.loga na strane Pracovník-a s absolútnou cestou /home/habr/worker/twistd.log. Keď si prečítate chybu a opravíte ju, budete musieť reštartovať službu BuildMaster-a. Tu je postup:


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

6.2 Práca so 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)

Na začiatok sa pozrime na to svn_poller. Toto je stále to isté rozhranie, ktoré sa pravidelne pýta na úložisko raz za minútu. V tomto prípade svn_poller pristupuje len k pobočke kufor. Tajomný parameter split_file=util.svn.split_file_alwaystrunk stanovuje pravidlá: ako rozložiť štruktúru priečinkov svn na konároch. Ponúka im aj relatívne cesty. Vo svojom poradí split_file_alwaystrunk zjednodušuje proces tým, že repozitár obsahuje iba kufor.

В Plánovače uvedené ChangeFilterkto vidí nikto a združuje s ním pobočku kufor podľa danej asociácie cez split_file_alwaystrunk. Reakcia na zmeny v kufor, Spustí sa staviteľ s menom vášProjekt.

vlastnosti tu je to potrebné, aby správca dostával zoznamy adries s výsledkami zostavovania a testovania ako vlastník procesu.

Krok vybudovať-a pokladňa schopný úplne vymazať všetky súbory umiestnené v lokálnej verzii úložiska Pracovník-A. A potom urobte naplno aktualizácia svn. Režim sa konfiguruje pomocou parametra režim=plný, metóda=čerstvé. Parameter haltOnTailure hovorí, že ak aktualizácia svn sa vykoná s chybou, potom by mal byť celý proces vytvárania a testovania pozastavený, pretože ďalšie akcie nemajú zmysel.

6.3 List pre vás: reportéri sú oprávnení vyhlásiť


reportéri je služba na zasielanie upozornení emailom.


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]

Vie posielať správy rôzne cesty.

MailNotifier používa e-mail na odosielanie upozornení.

template_html nastaví textovú šablónu pre newsletter. HTML sa používa na vytváranie značiek. Je upravený motorom jinja2 (možno porovnať s django). BuildBot má množinu premenných, ktorých hodnoty sa nahradia do šablóny počas procesu generovania textu správy. Tieto premenné sú uzavreté v {{ dvojitých zložených zátvorkách }}. Napríklad, zhrnutie zobrazuje stav dokončených operácií, teda úspech alebo neúspech. A projekty bude výstup vášProjekt. Takže pomocou ovládacích príkazov v jinja2, premenné BuildBot-a a nástroje na formátovanie reťazcov python, môžete vytvoriť celkom informatívnu správu.

MailNotifier obsahuje nasledujúce argumenty.

odaddr – adresa, z ktorej bude každý dostávať newsletter.

sendToInterestedUsers=True odošle správu vlastníkovi a používateľovi, ktorý vytvoril spáchať.

vyhľadať — prípona, ktorá sa musí pridať k menám používateľov, ktorí dostávajú newsletter. Takže admin ako používateľ dostane newsletter na adresu [chránené e-mailom].

relayhost určuje názov hostiteľa, na ktorom je server otvorený smtpsa smptPort určuje číslo portu, ktorý počúva smtp serverov.

mode="varovanie" hovorí, že odoslanie by sa malo uskutočniť iba vtedy, ak existuje aspoň jeden krok vybudovať-a, ktoré skončilo poruchou stavu alebo varovaním. V prípade úspechu nie je potrebné zasielať newsletter.

extraRecipients obsahuje zoznam osôb, ktorým má byť zásielka zaslaná okrem vlastníka a osoby, ktorá zásielku vykonala spáchať.

messageFormatter je objekt, ktorý špecifikuje formát správy, jej šablónu a množinu dostupných premenných jinja2. Možnosti ako napr wantProperties=Pravda и wantSteps=Pravda definovať túto množinu dostupných premenných.

with['services']=[sendMessageToAll] poskytuje zoznam služieb, medzi ktorými bude aj naša reportér.

Zvládli sme to! gratulujem

Vytvorili sme si vlastnú konfiguráciu a videli sme funkčnosť, ktorú dokáže. BuildBot. Myslím, že to stačí na pochopenie, či je tento nástroj potrebný na vytvorenie vášho projektu. Máte o neho záujem? Bude to pre vás užitočné? Je príjemné s ním pracovať? Potom tento článok nepíšem nadarmo.

A ďalej. Bol by som rád, keby odborná komunita používala BuildBot, sa rozšírilo, boli preložené príručky a príkladov bolo ešte viac.

Ďakujem vám všetkým za pozornosť. Veľa štastia.

Zdroj: hab.com

Pridať komentár