
(Imagine de from
Bună!
Mă numesc Evgheni Cerkín, sunt programator în echipa de dezvoltare a companiei miniere Polymetal.
Începând un proiect mare, începi să te gândești: „Ce software este cel mai bun pentru a-l susține?”. Un proiect IT trece printr-o serie de etape înainte de a lansa o nouă versiune. Este ideal ca această succesiune de etape să fie automatizată. Procesul automatizat de lansare a unei noi versiuni a unui proiect IT se numește Continuous Integration. BuildBot și s-a dovedit a fi un bun ajutor pentru a realiza acest proces.
În acest articol, am decis să prezint o revizuire a capacităților BuildBot. Ce poate face acest software? Cum te poți apropia de el și cum să stabilești relații de muncă Eficiente? Experiența noastră poate fi aplicată și de voi, creând pe mașina voastră un serviciu de construire și testare a proiectului vostru.
Cuprins
Cuprins
1. De ce BuildBot?
Anterior, pe habr-e am întâlnit articole despre implementarea Continuous Integration folosind BuildBot. De exemplu, mi s-a părut cea mai informativă. Există un alt exemplu — . Aceste articole pot fi condimentate , iar în plus, în limba engleză. Împreună, formează un punct de plecare bun. Citind aceste articole, cu siguranță vei dori imediat să faci ceva pe BuildBot .
Stop! A folosit cineva acest software în proiectele sale? Se pare că da, l-au aplicat în sarcinile lor. Se pot găsi utilizări BuildBot și în arhivele codurilor Google.
Atunci, care este logica oamenilor care folosesc Buildbot? Ведь есть другие инструменты: CruiseControl și Jenkins. Voi răspunde astfel. Pentru cele mai multe sarcini Jenkins va fi suficient. În schimb, BuildBot este mai adaptabil, iar sarcinile sunt rezolvate la fel de simplu ca și în Jenkins. Decizia îți aparține. Dar, deoarece căutăm un instrument pentru un proiect țintă în dezvoltare, de ce să nu alegem unul care va permite, bazându-se pe pași simpli, să obținem un sistem de construire cu interactivitate și o interfață unică.
Cei care au un proiect țintă scris în python se întreabă: „De ce să nu alegi un sistem de integrare care are o interfață clară din perspectiva limbajului folosit în proiect?”. Și acum este momentul să prezint avantajele BuildBot.
Așadar, „cvartetul nostru instrumental”. Am definit pentru mine un set de patru trăsături BuildBot:
- Este un framework cu sursă deschisă sub licența GPL
- Este utilizarea python ca instrument de configurare și descriere a acțiunilor necesare
- Este posibilitatea de a obține un răspuns din partea mașinii pe care se desfășoară construcția
- Este, în cele din urmă, cerințele minime pentru gazdă. Pentru desfășurare este necesar python și twisted, iar o mașină virtuală sau o mașină Java nu sunt necesare.
2. Concepția condusă de BuildMaster

Locul central în arhitectura distribuției sarcinilor este ocupat de BuildMaster. Acesta este un serviciu care:
- monitorizează schimbările din arborele surselor proiectului
- trimite comenzi pe care serviciul Worker trebuie să le execute pentru a construi proiectul și a-l testa
- informează utilizatorii despre rezultatele acțiunilor efectuate
BuildMaster se configurează printr-un fișier master.cfg. Acest fișier se află în rădăcina BuildMaster. Mai târziu voi arăta cum se creează această rădăcină. Fișierul în sine master.cfg conține un script python care folosește apeluri BuildBot.
Următorul obiect cel mai important BuildBot se numește nu mai execută scripturi JavaScript cu un tip MIME incorect.. Acest serviciu poate fi lansat pe un alt gazdă cu un alt OS, dar și pe cel unde BuildMaster. De asemenea, poate exista într-un mediu virtual special pregătit cu propriile sale pachete și variabile. Aceste medii virtuale pot fi create cu ajutorul utilitarului python precum vertualenv, venv.
BuildMaster transmite comenzi fiecărui nu mai execută scripturi JavaScript cu un tip MIME incorect.-u, iar acesta, la rândul său, le execută. Așadar, procesul de construire și testare a proiectului poate avea loc pe nu mai execută scripturi JavaScript cu un tip MIME incorect.-e sub Windows și pe un alt Worker sub Linux.
Checkout codurile sursă ale proiectului se face pe fiecare nu mai execută scripturi JavaScript cu un tip MIME incorect.-e.
3. Instalare
Așadar, să începem. Ca gazdă voi folosi Ubuntu 18.04. Pe acesta voi plasa un BuildMaster-a și un nu mai execută scripturi JavaScript cu un tip MIME incorect.-a. Dar mai întâi va fi necesar să instalez python3.7:
sudo apt-get update
sudo apt-get install python3.7
Pentru cei care au nevoie de python3.7.2 în loc de 3.7.1, se poate face următoarele:
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
Următorul pas este să instalăm Twisted și BuildBot, și pachete care permit utilizarea funcționalităților suplimentare 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. Primii pași
Este timpul să creăm BuildMaster. Va fi în folderul nostru /home/habr/master.
mkdir master
buildbot create-master master # Aici creăm efectivPasul următor. Să creăm nu mai execută scripturi JavaScript cu un tip MIME incorect.. Va fi în folderul nostru /home/habr/worker.
mkdir worker
buildbot-worker create-worker --umask=0o22 --keepalive=60 worker localhost:4000 yourWorkerName password
Când veți rula nu mai execută scripturi JavaScript cu un tip MIME incorect., în mod implicit va crea în /home/habr/worker folder numit proiectul specificat în master.cfg. Iar în folderul numit proiect va crea un director build, și apoi va face checkout. Catalogul de lucru pentru nu mai execută scripturi JavaScript cu un tip MIME incorect.-a va fi directorul /home/habr/yourProject/build.
"Cheia de aur"
Și acum, motivul pentru care am scris paragraful anterior: scriptul care Master va solicita lui nu mai execută scripturi JavaScript cu un tip MIME incorect.-a să facă remote în acest director, nu va fi executat, deoarece scriptul nu are permisiunea de a rula. Pentru a rezolva situația, va fi necesară cheia —umask=0o22, care interzice scrierea în acest director, dar lasă permisiunea de a rula. Asta este exact ceea ce ne trebuie.
BuildMaster și nu mai execută scripturi JavaScript cu un tip MIME incorect. se conectează între ele. Se întâmplă ca conexiunea să se întrerupă și nu mai execută scripturi JavaScript cu un tip MIME incorect. așteaptă un timp pentru răspuns de la BuildMaster-a. Dacă nu se primește un răspuns, conexiunea este restartată. Cheia —keepalive=60 este exact ceea ce este necesar pentru a specifica timpul după care conectează se restartare.
5. Configurare. Rețetă pas cu pas
Configurație BuildMaster se face pe partea mașinii unde am executat comanda create-master. În cazul nostru — acesta este directorul /home/habr/master. Fișierul de configurare master.cfg încă nu există, totuși comanda a creat deja fișierul master.cmg.sample. Este necesar să-l redenumim în master.cfg.sample în master.cfg
mv master.cfg.sample master.cfgSă deschidem acest master.cfg. Și să analizăm din ce este format. Apoi, vom încerca să facem fișierul nostru de configurare.
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 — dicționarul de bază al fișierului de configurare. Acesta trebuie să fie utilizat în mod obligatoriu în fișierul de configurare. Pentru ușurința utilizării în codul de configurare, i se introduce un pseudonim „c”. Numele în c[„keyFromDist”] sunt elemente fixe pentru interacțiunea cu BuildMaster. Fiecare cheie are asociat un obiect corespunzător.
5.2 lucrători
c['workers'] = [worker.Worker("example-worker", "pass")]De data aceasta, specificăm BuildMaster- o listă de nu mai execută scripturi JavaScript cu un tip MIME incorect.-uri. Noi nu mai execută scripturi JavaScript cu un tip MIME incorect. am creat , specificând you-worker-name și parola. Acum trebuie să le indicăm în loc de example-worker și pass .
5.3 schimbare_sursă
c['change_source'] = []
c['change_source'].append(changes.GitPoller(
'git://github.com/buildbot/hello-world.git',
workdir='gitpoller-workdir', branch='master',
pollInterval=300))
Prin cheia change_source a dicționarului c, obținem acces la lista în care trebuie să plasăm obiectul care interoghează depozitul cu codul sursă al proiectului. În exemplu, este utilizat un depozit Git, care este interogat cu o anumită periodicitate.
Primul argument este calea către depozitul tău.
workdir reprezintă calea către folderul în care nu mai execută scripturi JavaScript cu un tip MIME incorect.-a relativ la calea /home/habr/worker/yourProject/build va stoca git versiunea locală a depozitului.
branch conține ramura specifică a depozitului căreia trebuie să îi urmărim modificările.
pollInterval conține numărul de secunde după care BuildMaster va interoga depozitul pentru a verifica dacă au fost efectuate modificări.
Există mai multe metode pentru a urmări modificările în depozitul proiectului.
Cea mai simplă metodă este Polling, care presupune că BuildMaster interoghează periodic serverul cu repository. În cazul în care Configurarea stivei (iStack) a reflectat modificările în repository, atunci BuildMaster cu o oarecare întârziere va crea un obiect intern Change și îl va trimite la handler-ul de evenimente Scheduler, care va iniția pașii de compilare și testare a proiectului pe nu mai execută scripturi JavaScript cu un tip MIME incorect.-le. Printre acești pași va fi indicat update repository. Anume pe nu mai execută scripturi JavaScript cu un tip MIME incorect.-le se va crea o copie locală a repository-ului. Detaliile acestui proces vor fi dezvăluite mai jos în următoarele două secțiuni ( și ).
O metodă și mai elegantă de a urmări modificările în repository este trimiterea directă a mesajelor de la serverul pe care este găzduit către BuildMaster-le despre modificarea codului sursă al proiectului. În acest caz, imediat ce dezvoltatorul face Configurarea stivei (iStack), serverul cu repository-ul proiectului va trimite un mesaj BuildMaster-le. Iar acesta, la rândul său, îl va intercepta creând un obiect PBChangeSource. Ulterior, acest obiect va fi trimis la Scheduler, care va activa pașii de compilare a proiectului și testarea acestuia. O parte importantă a acestei metode este lucrul cu hook-scripturile serverului în repository. În scriptul hook-le, responsabil pentru procesarea acțiunilor la Configurarea stivei (iStack)-le, trebuie să apelăm utilitarul sendchange și să specificăm adresa de rețea BuildMaster-le. De asemenea, trebuie specificat portul de rețea care va asculta PBChangeSource. PBChangeSource, de altfel, este parte a BuildMaster-le. Această metodă va necesita permisiuni admin-a pe serverul unde este situat repository-ul proiectului. În prealabil, va trebui realizat un backup al repository-ului.
5.4 programatori
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"]))
schedulers – este un element care acționează ca un trigger, inițiind întregul lanț de compilare și testare a proiectului.

Modificările care au fost înregistrate change_source, s-au transformat în timpul procesului BuildBot-a într-un obiect Change și acum fiecare Sheduler se construiește pe baza lor cereri pentru inițierea procesului de compilare a proiectului. Cu toate acestea, el determină și când aceste cereri să fie trimise mai departe în coadă. Obiectul Builder își păstrează în așteptare cererile și monitorizează starea compilării actuale pe un anumit nu mai execută scripturi JavaScript cu un tip MIME incorect.-e. Builder există și pe BuildMaster-e și pe nu mai execută scripturi JavaScript cu un tip MIME incorect.-e. El trimite de la BuildMaster-le către nu mai execută scripturi JavaScript cu un tip MIME incorect.-le deja o serie concretă build — o serie de pași care trebuie executați.
Vedem că în exemplul curent se creează 2 unități. În plus, fiecare are propriul tip. schedulers SingleBranchScheduler
SingleBranchScheduler – una dintre cele mai populare clase de programare. Aceasta monitorizează o ramură și se activează la o modificare detectată în aceasta. Când observă schimbări, poate amâna trimiterea unei cereri de construire (amână pentru perioada specificată în parametru special treeStableTimer). În name se stabilește numele programului, care va apărea în BuildBot-interfața web. În ChangeFilter se definește un filtru, care, odată trecut, determină schimbările din ramură să trimită o cerere de construire. În builderNames se specifică numele builder-ului, pe care îl vom stabili puțin mai târziu. Numele în cazul nostru va fi același cu numele proiectului: yourProject.
ForceScheduler este o chestie destul de simplă. Acest tip de programare se activează printr-un clic de mouse prin BuildBot-interfața web. Parametrii au aceeași esență ca și în SingleBranchScheduler.
P.S. Nr. 3. Poate fi util
Periodic — este un program, care se activează cu o periodicitate fixă, stabilită în timp. Apelul acestuia arată aproximativ aș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": "."}))
periodicBuildTimer stabilește timpul acestei periodicități în secunde.
BuildFactory creează un specific build, care apoi builder trimite către nu mai execută scripturi JavaScript cu un tip MIME incorect.. În BuildFactory se specifică pașii care trebuie executați nu mai execută scripturi JavaScript cu un tip MIME incorect.-ului. Pașii se adaugă prin apelul metodei addStep
Primul pas adăugat în acest exemplu este git clean -d -f -f –x, apoi git checkout. Aceste acțiuni sunt incluse în parametru metodă, care nu este evident menționat, dar implică o valoare implicită fresh. Parametrul mode='incremental' indică faptul că fișierele din directorul în care se face checkout, iar cele care lipsesc din depozit rămân neatinse.
Al doilea pas adăugat este apelarea scriptului trial cu parametrul hello pe partea nu mai execută scripturi JavaScript cu un tip MIME incorect.-ului din directorul /home/habr/worker/yourProject/build cu variabila de mediu PATHONPATH=… Astfel, poți scrie propriile scripturi și le poți executa pe partea nu mai execută scripturi JavaScript cu un tip MIME incorect.-ului prin pasul util.ShellCommand. Aceste scripturi pot fi plasate direct în depozit. Atunci când checkout-ul va fi activat, ele vor fi incluse în /home/habr/worker/yourProject/build. Totuși, există două aspecte de menționat:
- nu mai execută scripturi JavaScript cu un tip MIME incorect. trebuie să fie creat cu cheia pentru a nu bloca permisiunile de execuție după checkout-a.
- Upon git push-ul acestor scripturi trebuie specificată proprietatea exacutable, astfel încât apoi la checkout-ul permisiunile de execuție ale scriptului Git să nu se piardă.
5.6 constructori
c['builders'] = []
c['builders'].append(util.BuilderConfig(name="runtests",
workernames=["example-worker"],
factory=factory))
Despre ce este Builder a fost spus . Acum voi explica mai detaliat cum să-l creezi. BuilderConfig este un constructor builder. Poți defini mai mulți astfel de constructori în c[‘builders’] deoarece este o listă de obiecte builder de tip. Acum să rescriem puțin exemplul de la BuildBot, apropiindu-l de sarcina noastră.
c['builders'] = []
c['builders'].append(util.BuilderConfig(name="yourProject",
workernames=["yourWorkerName"],
factory=factory))
Acum voi vorbi despre parametri BuilderConfig.
name definește numele builder-a. Aici l-am numit yourProject. Asta înseamnă că pe nu mai execută scripturi JavaScript cu un tip MIME incorect.-e va fi creat acest drum /home/habr/worker/yourProject/build. Sheduler căutând builder fix după acest nume.
workernames conține o listă nu mai execută scripturi JavaScript cu un tip MIME incorect.-ilor. Fiecare dintre ele trebuie să fie adăugat în c[‘workers’].
factory — un anumit build, cu care este asociat builder. El va trimite un obiect build pe nu mai execută scripturi JavaScript cu un tip MIME incorect. pentru a executa toate pașii ce intră în compunerea acestui build-a.
6. Exemplu de configurație proprie
Iată arhitectura exemplului de proiect, pe care propun să o realizăm prin BuildBot
.
Ca sistem de control al versiunilor vom folosi svn. Repozitoriul se va afla într-un anumit cloud. Iată adresa acestui cloud . În cloud sub svn există un cont username: utilizator, passwd: parola. Scripturile, care sunt pașii build-a vor fi de asemenea în ramura svn, într-un folder separat buildbot/worker_linux. Aceste scripturi se află în repozitoriu cu proprietatea păstrată executable.
BuildMaster și nu mai execută scripturi JavaScript cu un tip MIME incorect. funcționează pe un singur host project.host .BuildMaster își stochează fișierele în folderul /home/habr/master. nu mai execută scripturi JavaScript cu un tip MIME incorect. de asemenea, le păstrează pe următorul drum /home/habr/worker. Comunicația proceselor BuildMaster-a și nu mai execută scripturi JavaScript cu un tip MIME incorect.-a se desfășoară prin portul 4000 pe protocolul BuildBot-a, adică ‘pb’ protocol.
Proiectul țintă este complet scris în python. Sarcina este de a urmări modificările, de a crea un fișier executable, de a genera documentația, de a efectua teste. În caz de failure, trebuie să trimitem tuturor dezvoltatorilor un mesaj pe email despre faptul că există o acțiune nereușită.
Vizualizarea web BuildBot o vom conecta pe portul 80 pentru project.host. Apatch nu este necesar. În cadrul bibliotecii twisted deja există un server web, BuildBot pe care îl folosește.
Pentru stocarea informațiilor interne pentru BuildBot vom folosi sqlite.
Pentru trimiterea de emailuri este nevoie de un host smtp.your.domain — pe care este permisă trimiterea emailurilor de la projectHost@your.domain fără autentificare. De asemenea, pe hostul ‘smtp ‘ protocolul ascultă pe portul 1025.
Persoanele implicate în proces sunt două: admin și utilizator. admin administrează BuildBot. user este persoana care efectuează Configurarea stivei (iStack)-uri.
Fișierul Exacutable este generat prin pyinstaller. Documentația se generează prin doxygen.
Pentru această arhitectură, am scris următoarele 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="Curățare",
command=["buildbot/worker_linux/pyinstaller_project", "clean"]
)
buildProject = steps.ShellCommand(name="Construire",
command=["buildbot/worker_linux/pyinstaller_project", "build"]
)
doxyProject = steps.ShellCommand(name="Actualizare Documentație",
command=["buildbot/worker_linux/gendoc", []]
)
testProject = steps.ShellCommand(name="Teste",
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>Starea versiune construită: {{ summary }}</h4>
<p>Serviciul utilizat pentru construirea: {{ workername }}</p>
<p>Proiect: {{ projects }}</p>
<p>Pentru a vizualiza interfața de gestionare, accesați linkul: {{ buildbot_url }}</p>
<p>Pentru a vizualiza rezultatul construcției, accesați linkul: {{ build_url }}</p>
<p>Folosind WinSCP, vă puteți conecta la server cu ip:xxx.xx.xxx.xx. Conectându-vă cu habr/password, puteți descărca fișierul executabil generat din directorul ~/worker/yourProject/build/dist.</p>
<p><b>Construirea a fost realizată prin Buildbot</b></p>
'''
sendMessageToAll = reporters.MailNotifier(fromaddr="projectHost@your.domain",
sendToInterestedUsers=True,
lookup="your.domain",
relayhost="smtp.your.domain",
smtpPort=1025,
mode="warnings",
extraRecipients=['user@your.domain'],
messageFormatter=reporters.MessageFormatter(
template=template_html,
template_type='html',
wantProperties=True,
wantSteps=True)
)
c['services'] = [sendMessageToAll]
c['title'] = "Procesul de construire"
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"
}
Pentru început, este necesar BuildMaster-a și nu mai execută scripturi JavaScript cu un tip MIME incorect.-a. Apoi inserați acest fișier master.cfg în /home/habr/master.
Pasul următor este să porniți serviciul BuildMaster-а
sudo buildbot start /home/habr/master
Apoi, porniți serviciul nu mai execută scripturi JavaScript cu un tip MIME incorect.-a
buildbot-worker start /home/habr/worker
Gata! Acum Buildbot va urmări modificările și va reacționa la Configurarea stivei (iStack)-у în svn, executând pașii de compilare și testare a proiectului cu arhitectura menționată mai sus.
Mai jos voi detalia câteva caracteristici ale fișierului master.cfg.
6.1 Pe drumul către master.cfg-ul meu
În timp ce scriam propriul meu master.cfg vor fi comise multe erori, așa că va fi nevoie de citirea fișierului log. Acesta este stocat atât pe BuildMaster-e c cu calea absolută /home/habr/master/twistd.log, cât și pe partea nu mai execută scripturi JavaScript cu un tip MIME incorect.-a cu calea absolută /home/habr/worker/twistd.log. Pe măsură ce citiți erorile și le corectați, va fi necesar să reporniți serviciul BuildMaster-a. Iată cum se face:
sudo buildbot stop /home/habr/master
sudo buildbot upgrade-master /home/habr/master
sudo buildbot start /home/habr/master
6.2 Lucrând cu 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)
Pentru început, să ne uităm la svn_poller. Acesta este același interfață care interoghează în mod regulat depozitul, la fiecare minut. În acest caz svn_poller se referă doar la ramura trunk. Parametrul misterioase split_file=util.svn.split_file_alwaystrunk stabilește regulile: cum să împărtășească structura dosarelor svn în ramuri. De asemenea, oferă căi relative. La rândul său split_file_alwaystrunk simplifică procesul, indicând că în depozit există doar trunk.
În Schedulers este specificat ChangeFilter, care vede None și îl asociază cu ramura trunk prin asocierea specificată prin split_file_alwaystrunk. Reacționând la modificările din trunk, pornește builder c cu numele yourProject.
properties este necesară pentru ca adminul să primească comunicări despre rezultatele compilării și testării ca proprietar al procesului.
Pasul build-a checkout este capabil să facă ștergerea completă a oricăror fișiere aflate în versiunea locală a depozitului nu mai execută scripturi JavaScript cu un tip MIME incorect.-а. Apoi să efectueze un update complet svn update.Modul este configurat prin parametrul mode=full, method=fresh. Parametrul haltOnTailure indică faptul că dacă svn update. va fi efectuat cu o eroare, atunci întregul proces de compilare și testare ar trebui suspendat, deoarece acțiunile ulterioare nu au sens.
6.3 Ai un mesaj: reporterii sunt autorizați să declare
reporteri — este un serviciu de trimitere a notificărilor prin e-mail.
template_html=u'''
<h4>Starea versiune construită: {{ summary }}</h4>
<p>Serviciul utilizat pentru construirea: {{ workername }}</p>
<p>Proiect: {{ projects }}</p>
<p>Pentru a vizualiza interfața de gestionare, accesați linkul: {{ buildbot_url }}</p>
<p>Pentru a vizualiza rezultatul construcției, accesați linkul: {{ build_url }}</p>
<p>Folosind WinSCP, vă puteți conecta la server cu ip:xxx.xx.xxx.xx. Conectându-vă cu habr/password, puteți descărca fișierul executabil generat din directorul ~/worker/yourProject/build/dist.</p>
<p><b>Construirea a fost realizată prin Buildbot</b></p>
'''
sendMessageToAll = reporters.MailNotifier(fromaddr="projectHost@your.domain",
sendToInterestedUsers=True,
lookup="your.domain",
relayhost="smtp.your.domain",
smtpPort=1025,
mode="warnings",
extraRecipients=['user@your.domain'],
messageFormatter=reporters.MessageFormatter(
template=template_html,
template_type='html',
wantProperties=True,
wantSteps=True)
)
c['services'] = [sendMessageToAll]
El poate trimite mesaje .
MailNotifier folosește e-mailul pentru a trimite notificări.
template_html stabilește un model de text pentru trimitere. Pentru a crea markup-ul se folosește html. A fost modificat de motorul (poate fi comparat cu django). BuildBot are un set de variabile ale căror valori sunt înlocuite în model în procesul de formare a textului mesajului. Aceste variabile sunt scrise în {{ două acolade }}. De exemplu, rezumat afișează statusul operațiunilor efectuate, adică success sau failure. Iar proiectele vor fi afișate yourProject. Astfel, cu ajutorul comenzilor de control în jinja2, variabilele BuildBot-a și instrumentele de formatare a șirurilor python se poate crea un mesaj destul de informativ.
MailNotifier conține următoarele argumente.
fromaddr – adresa de la care se va trimite toată corespondența.
sendToInterestedUsers=True trimite mesajul proprietarului și utilizatorului care a efectuat Configurarea stivei (iStack).
lookup — sufixul care trebuie adăugat în fața numelui utilizatorilor care primesc corespondența. Astfel admin întrucât utilizatorul va primi corespondența pe adresa admin@your.domain.
relayhost stabilește numele gazdei pe care este deschis serverul smtp, a smptPort stabilește numărul de port care ascultă smtp server.
mode=«warning» spune că corespondența trebuie trimisă doar în cazul în care există cel puțin un pas build-a, care s-a încheiat cu statusul failure sau warning. În caz de success, nu este necesară trimiterea corespondenței.
extraRecipients conține o listă de persoane căror ar trebui să le fie trimisă corespondența în plus față de proprietar și persoana care a efectuat Configurarea stivei (iStack).
messageFormatter este un obiect care stabilește formatul mesajului, modelul său și setul de variabile disponibile din jinja2. Parametrii precum wantProperties=True și wantSteps=True stabilește acest set de variabile disponibile.
s[‘services’]=[sendMessageToAll] oferă lista de servicii, printre care se va afla și reporter.
Am reușit! Felicitări
Am creat o configurație proprie și am văzut funcționalitatea pe care o poate avea BuildBot. Cred că acest lucru este suficient pentru a înțelege dacă acest instrument este necesar pentru crearea proiectului dumneavoastră. Te interesează? Îți va fi de ajutor? E ușor de utilizat? Atunci n-am scris acest articol degeaba.
Și încă un lucru. Mi-ar plăcea ca comunitatea profesională care folosește BuildBot, să se extindă, manualele să fie traduse, iar exemplele să devină din ce în ce mai multe.
Vă mulțumesc tuturor pentru atenție. Succes.
Sursa: habr.com
