Een voorbeeld van het implementeren van continue integratie met BuildBot

Een voorbeeld van het implementeren van continue integratie met BuildBot
(Afbeelding door Computermaker oppompen van pix)

Hey there!

mijn naam Jevgeni Tsjerkin, Ik ben programmeur in een ontwikkelingsteam bij een mijnbouwbedrijf Polymetaal.

Wanneer u aan een groot project begint, begint u te denken: “Welke software kan ik het beste gebruiken om het te onderhouden?” Een IT-project doorloopt een aantal fasen voordat de volgende versie wordt uitgebracht. Het is goed als de keten van deze fasen geautomatiseerd is. Het geautomatiseerde proces van het vrijgeven van een nieuwe versie van een IT-project zelf wordt genoemd Continue integratie. BouwBot bleek voor ons een goede assistent bij de uitvoering van dit traject.

In dit artikel heb ik besloten een overzicht te geven van de mogelijkheden BouwBot. Waartoe is deze software in staat? Hoe kun je hem benaderen en hoe kun je een normale, effectieve werkrelatie met hem opbouwen? U kunt onze ervaring zelf toepassen door een werkende service te creëren voor het bouwen en testen van uw project op uw machine.

Inhoud

Inhoud

1. Waarom BuildBot?
2. Concept geleid door BuildMaster
3. Installatie
4. Eerste stappen

5. Configuratie. Stap voor stap recept

5.1 BuildmasterConfig
5.2 werknemers
5.3 verander_bron
5.4 planners

5.5 BouwFactory
5.6 bouwers

6. Voorbeeld van uw eigen configuratie

6.1 Op weg naar je master.cfg
6.2 Werken met svn
6.3 Brief aan u: melders zijn bevoegd tot aangifte

We hebben het gedaan! Gefeliciteerd

1. Waarom BuildBot?

Eerder kwam ik op habr-e artikelen tegen over implementatie Continue integratie met BouwBot. Bijvoorbeeld, deze Ik vond het het meest informatief. Er is nog een voorbeeld - gemakkelijker. Deze artikelen kunnen gekruid worden voorbeeld uit de handleidingEn het daarna in het Engels. De coupé vormt een goed startpunt. Na het lezen van deze artikelen wil je waarschijnlijk meteen iets aan hebben BouwBot Doen.

Stop! Heeft iemand het daadwerkelijk in zijn projecten gebruikt? Het blijkt ja veel pasten het toe in hun taken. Is te vinden voorbeelden gebruiken BouwBot en in de codearchieven van Google.

Dus wat is de logica van mensen die dit gebruiken Bouwbot? Er zijn tenslotte andere hulpmiddelen: Cruise control и Jenkins. Ik zal op deze manier antwoorden. Voor de meeste taken Jenkins en de waarheid zal genoeg zijn. Op zijn beurt, BouwBot - adaptiever, terwijl problemen daar net zo eenvoudig worden opgelost als in Jenkins. De keuze is aan jou. Maar aangezien we op zoek zijn naar een tool voor een zich ontwikkelend doelproject, waarom zouden we er dan niet een kiezen die het mogelijk maakt om, beginnend met eenvoudige stappen, een bouwsysteem te verkrijgen dat interactiviteit en een unieke interface heeft.

Voor degenen wier doelproject in Python is geschreven, rijst de vraag: "Waarom kiezen we niet voor een integratiesysteem dat een duidelijke interface heeft in termen van de taal die in het project wordt gebruikt?" En nu is het tijd om de voordelen te presenteren BouwBot.

Ons “instrumentale kwartet” dus. Voor mezelf heb ik vier kenmerken geïdentificeerd BouwBot:

  1. Het is een open source-framework onder GPL-licentie
  2. Dit is het gebruik van Python als configuratietool en beschrijving van de vereiste acties
  3. Dit is een mogelijkheid om een ​​reactie te ontvangen van de machine waarop de montage plaatsvindt
  4. Dit zijn tenslotte de minimale vereisten voor een Host. Voor de implementatie is Python en Twisted vereist, en er zijn geen virtuele machine en Java-machine vereist.

2. Concept geleid door BuildMaster

Een voorbeeld van het implementeren van continue integratie met BuildBot

Centraal in de taakverdelingsarchitectuur staat Bouwmeester. Het is een dienst die:

  • bijhouden wijzigingen in de projectbronboom
  • stuurt opdrachten die door de Worker-service moeten worden uitgevoerd om het project te bouwen en te testen
  • meldt gebruikers over de resultaten van ondernomen acties

Bouwmeester geconfigureerd via bestand master.cfg. Dit bestand bevindt zich in de root Bouwmeester. Later zal ik laten zien hoe deze wortel ontstaat. Het bestand zelf master.cfg bevat een Python-script dat oproepen gebruikt BouwBot.

Volgende belangrijkste object BouwBot Het heeft de naam Arbeider. Deze service kan worden gelanceerd op een andere host met een ander besturingssysteem, of misschien op degene waar Bouwmeester. Het kan ook bestaan ​​in een speciaal voorbereide virtuele omgeving met zijn eigen pakketten en variabelen. Deze virtuele omgevingen kunnen worden voorbereid met behulp van Python-hulpprogramma's zoals virtuele omgeving, venv.

Bouwmeester zendt opdrachten uit naar iedereen Arbeider-y, en hij vervult ze op zijn beurt. Dat wil zeggen, het blijkt dat het proces van het bouwen en testen van een project door kan gaan Arbeider-e met Windows en op een andere Worker met Linux.

Uitchecken projectbroncodes komen op elk voor Arbeider-e.

3. Installatie

Dus laten we gaan. Ik zal Ubuntu 18.04 als host gebruiken. Ik plaats er een op Bouwmeester-een en één Arbeider-A. Maar eerst moet je python3.7 installeren:

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

Voor degenen die python3.7.2 nodig hebben in plaats van 3.7.1, kun je het volgende doen:


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

De volgende stap is installeren Getweet и BouwBot, evenals pakketten waarmee u extra functionaliteit kunt gebruiken BouwBot-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. Eerste stappen

Tijd om te creëren Bouwmeester. Het komt in onze map te staan /home/habr/master.

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

Volgende stap. Laten we creëren Arbeider. Het komt in onze map te staan /home/habr/werknemer.

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

Wanneer je rent Arbeider, dan wordt het standaard aangemaakt /home/habr/werknemer map met de naam van het project, die is opgegeven in master.cfg. En in de map met de naam van het project wordt een map aangemaakt bouw, en zal dat blijven doen uitchecken. Werkmap voor Arbeider-en het wordt een map /home/habr/uwproject/build.

"Gouden sleutel
En nu waar ik de vorige paragraaf voor schreef: een script dat Master van zal eisen Arbeider-en op afstand gedaan in deze map zal niet worden uitgevoerd omdat het script geen toestemming heeft om te worden uitgevoerd. Om de situatie te corrigeren, heeft u een sleutel nodig --umask=0o22, die het schrijven naar deze map verbiedt, maar de opstartrechten behoudt. En dat is alles wat we nodig hebben.

Bouwmeester и Arbeider een verbinding met elkaar tot stand brengen. Het komt voor dat het afbreekt en Arbeider wacht al enige tijd op een reactie van Bouwmeester-A. Als er geen reactie is, wordt de verbinding opnieuw gestart. Sleutel --keepalive=60 hoefde alleen maar de tijd aan te geven waarna connect herstart.

5. Configuratie. Stap voor stap recept

Configuratie Bouwmeester wordt uitgevoerd aan de kant van de machine waar we de opdracht hebben uitgevoerd creëer-meester. In ons geval is dit een map /home/habr/master. Configuratiebestand master.cfg bestaat nog niet, maar de opdracht zelf heeft het bestand al gemaakt master.cmg.voorbeeld. Je moet het hernoemen naar master.cfg.sample в master.cfg

mv master.cfg.sample master.cfg

Laten we deze openen master.cfg. En laten we eens kijken waar het uit bestaat. En laten we daarna proberen ons eigen configuratiebestand te maken.

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 — basiswoordenboek van het configuratiebestand. Het moet worden opgenomen in het configuratiebestand. Voor gebruiksgemak is er een alias in de configuratiecode opgenomen "tegen". Titels sleutels в c["keyFromDist"] zijn vaste elementen voor interactie Bouwmeester. Voor elke sleutel wordt het overeenkomstige object als waarde vervangen.

5.2 werknemers

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

Deze keer geven wij aan Bouwmeester-y lijst van Arbeider-S. Mezelf Arbeider wij hebben gemaakt boven, wijzend op jij-werknemer-naam и wachtwoord. Nu moeten ze in plaats daarvan worden gespecificeerd voorbeeld-werker и passeren .

5.3 verander_bron

c['change_source'] = []
c['change_source'].append(changes.GitPoller(
                            'git://github.com/buildbot/hello-world.git',
                             workdir='gitpoller-workdir', branch='master',
                             pollInterval=300))                

Per sleutel verander_bron woordenboek c we krijgen toegang tot de lijst waar we een object willen plaatsen dat de repository opvraagt ​​met de broncode van het project. In het voorbeeld wordt een Git-repository gebruikt die met bepaalde tussenpozen wordt ondervraagd.

Het eerste argument is het pad naar uw repository.

werkmap vertegenwoordigt het pad naar de map aan de zijkant Arbeider-een relatief ten opzichte van het pad /home/habr/worker/uwproject/build git zal de lokale versie van de repository opslaan.

tak bevat een specifieke vertakking in de repository die moet worden gevolgd.

pollInterval bevat het aantal seconden waarna Bouwmeester zal de repository op wijzigingen peilen.

Er zijn verschillende methoden om wijzigingen in de repository van een project bij te houden.

De eenvoudigste methode is Stemming, wat dat impliceert Bouwmeester controleert periodiek de server met de repository. Als plegen weerspiegelde dus de veranderingen in de repository Bouwmeester zal met enige vertraging een intern object creëren Veranderen en stuur het naar de gebeurtenishandler Scheduler, waarmee de stappen worden gelanceerd om het project op te bouwen en te testen Arbeider-e. Een van deze stappen zal worden aangegeven -update opslagplaats. Precies op ArbeiderHiermee wordt een lokale kopie van de repository gemaakt. De details van dit proces worden hieronder in de volgende twee paragrafen besproken. (5.4 и 5.5).

Een nog elegantere methode om wijzigingen in een repository bij te houden, is door berichten rechtstreeks vanaf de server waarop deze wordt gehost, te verzenden Bouwmeester- over het wijzigen van de projectbroncodes. In dit geval, zodra de ontwikkelaar dit maakt plegen, zal de server met de projectrepository een bericht sturen Bouwmeester-j. En hij zal het op zijn beurt onderscheppen door een object te creëren PBWijzigbron. Vervolgens wordt dit object overgebracht naar Scheduler, waarmee de stappen worden geactiveerd om het project te bouwen en te testen. Een belangrijk onderdeel van deze werkwijze is het werken met haak-serverscripts in de repository. In het script haak-a, verantwoordelijk voor verwerkingsacties wanneer plegen-e, u moet het hulpprogramma bellen stuurwissel en geef het netwerkadres op Bouwmeester-A. U moet ook de netwerkpoort opgeven die zal luisteren PBWijzigbron. PBWijzigbronis trouwens een onderdeel Bouwmeester-A. Voor deze methode is toestemming vereist beheerder-a op de server waarop de projectrepository zich bevindt. U moet eerst een back-up maken van de repository.

5.4 planners


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

planners – dit is een element dat fungeert als een trigger die de hele keten van assemblage en testen van het project start.
Een voorbeeld van het implementeren van continue integratie met BuildBot

De wijzigingen die zijn vastgelegd verander_bron, getransformeerd tijdens het werkproces BouwBot-a om bezwaar te maken Veranderen en nu elke Planner op basis daarvan bouwt het verzoeken op om het projectbouwproces te starten. Het bepaalt echter ook wanneer deze verzoeken verder in de wachtrij worden geplaatst. Een voorwerp Bouwer slaat een wachtrij met verzoeken op en volgt de status van de huidige assembly op een aparte Arbeider-is. Bouwer bestaat op Bouwmeester-e en verder Arbeider-e. Hij stuurt mee Bouwmeester-een aan Arbeider-en al specifiek bouw - een reeks stappen die moeten worden gevolgd.
Dat zien we in het huidige voorbeeld zo planners Er zijn 2 stukken gemaakt. Bovendien heeft elk zijn eigen type.

SingleBranchScheduler – een van de meest populaire lessen op het rooster. Het houdt één tak in de gaten en wordt geactiveerd door een geregistreerde verandering daarin. Wanneer hij wijzigingen ziet, kan hij het verzenden van het buildverzoek uitstellen (uitstellen gedurende de periode die is opgegeven in de speciale parameter boomStableTimer). de naam stelt de naam in van het schema dat wordt weergegeven BouwBot-webinterface. IN WijzigFilter er wordt een filter ingesteld, waarna de wijzigingen in het filiaal het schema ertoe aanzetten een bouwaanvraag te verzenden. IN bouwerNamen naam wordt aangegeven bouwer-a, die we iets later zullen instellen. De naam zal in ons geval hetzelfde zijn als de projectnaam: jouw project.

ForceScheduler iets heel eenvoudigs. Dit type schema wordt geactiveerd door een muisklik BouwBot-webinterface. De parameters hebben dezelfde essentie als in SingleBranchScheduler.

PS-nr. 3. Misschien komt het van pas
Periodiek is een schema dat op een bepaalde tijdsvaste frequentie draait. De oproep ziet er ongeveer zo uit


from buildbot.plugins import schedulers
nightly = schedulers.Periodic(name="daily",
                              builderNames=["full-solaris"],
                              periodicBuildTimer=24*60*60)
c['schedulers'] = [nightly]                    

5.5 BouwFactory


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

periodiekeBuildTimer specificeert de tijd van deze periodiciteit in seconden.

BouwFabriek creëert een specifiek bouw, welke dan bouwer stuurt naar Arbeider. In BouwFabriek geeft aan welke stappen moeten worden gevolgd Arbeider-j. Er worden stappen toegevoegd door de methode aan te roepen toevoegenStap

De eerste toegevoegde stap in dit voorbeeld is git clean -d -f -f –x, we zweren het git kassa. Deze acties zijn opgenomen in de parameter methode, wat niet duidelijk wordt vermeld, maar een standaardwaarde impliceert vers. Parameter mode='incrementeel' geeft aan dat de bestanden afkomstig zijn uit de map waar de checheut, hoewel ze ontbreken in de repository, blijven onaangeroerd.

De tweede toegevoegde stap is het aanroepen van het script proces met parameter hallo aan de kant Arbeider-a uit map /home/habr/worker/uwproject/build met de omgevingsvariabele PATHONPATH=... Zo kunt u uw eigen scripts schrijven en deze daarnaast uitvoeren Arbeider-a elke stap util.ShellCommand. Deze scripts kunnen rechtstreeks in de repository worden geplaatst. Dan bij checheut-e waar ze in zullen vallen /home/habr/worker/uwproject/build. Er zijn echter twee “maren”:

  1. Arbeider moet met een sleutel worden aangemaakt --umasker zodat het de uitvoeringsrechten daarna niet blokkeert uitchecken-a.
  2. bij git push-e van deze scripts moet u de eigenschap opgeven uitvoerbaardus dat later checheut-e verloor niet het recht om het Git-script uit te voeren.

5.6 bouwers


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

Over wat het is Bouwer werd verteld hier. Nu zal ik je meer in detail vertellen over hoe je het kunt maken. BuilderConfig is een constructeur bouwer. Dergelijke ontwerpers in c['bouwers'] u kunt er meerdere opgeven, aangezien dit een blad met objecten is bouwer type. Laten we nu het voorbeeld herschrijven van BouwBot, waardoor het dichter bij onze taak komt.


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

Nu zal ik je vertellen over de parameters BuilderConfig.

naam specificeert de naam bouwer-A. Hier hebben we het genoemd jouw project. Dit betekent dat op Arbeider- dit pad zal worden gecreëerd /home/habr/worker/uwproject/build. Planner zoeken naar bouwer alleen onder deze naam.

namen van werknemers bevat blad Arbeider-S. Elk daarvan moet worden toegevoegd c['werknemers'].

fabriek - specifiek bouw, waarmee het geassocieerd is bouwer. Hij zal het object verzenden bouw op Arbeider om alle stappen die hierin zijn opgenomen te voltooien bouw-a.

6. Voorbeeld van uw eigen configuratie

Hier is de voorbeeldprojectarchitectuur die ik voorstel te implementeren via BouwBot
.

We zullen gebruiken als versiebeheersysteem svn. De repository zelf zal zich in een soort cloud bevinden. Hier is het adres van deze wolk svn.host/svn/uwProject/trunk. In de wolk eronder svn er is een accountgebruikersnaam: gebruiker, wachtwoord: wachtwoord. Scripts die stappen vertegenwoordigen bouw-a zal ook in het filiaal aanwezig zijn svn, in een aparte map buildbot/worker_linux. Deze scripts bevinden zich in de repository met de opgeslagen eigenschap uitvoerbaar.

Bouwmeester и Arbeider draaien op dezelfde host project.host .Bouwmeester slaat zijn bestanden op in een map /home/habr/master. Arbeider het wordt opgeslagen in het volgende pad /home/habr/werknemer. Procescommunicatie Bouwmeester-een en Arbeider-a wordt uitgevoerd via poort 4000 volgens het protocol BouwBot-a, dus 'pb' protocol.

Het doelproject is volledig in Python geschreven. De taak is om de wijzigingen bij te houden, een uitvoerbaar bestand te maken, documentatie te genereren en tests uit te voeren. In geval van een mislukking moeten alle ontwikkelaars een bericht per e-mail sturen waarin staat dat er een mislukte actie is.

Webweergave BouwBot we zullen verbinding maken met poort 80 voor project.host. Het is niet nodig om Apatch te installeren. Als onderdeel van de bibliotheek gedraaid er is al een webserver, BouwBot gebruikt het.

Om interne informatie op te slaan voor BouwBot ем использовать sqlite.

Voor mailing is een host vereist smtp.uw.domein - het maakt het verzenden van brieven vanuit de post mogelijk [e-mail beveiligd] zonder authenticatie. Ook op de gastheer 'smtp 'De notulen worden gehoord op post 1025.

Er zijn twee mensen betrokken bij het proces: beheerder и gebruiker. beheerder beheert BouwBot. gebruiker is de persoon die commit plegen-S.

Uitvoerbaar bestand wordt gegenereerd via pyinstaller. Documentatie wordt gegenereerd via zuurstof.

Voor deze architectuur schreef ik dit: 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"
}

Eerst heb je nodig создать Bouwmeester-een en Arbeider-A. Plak vervolgens dit bestand master.cfg в /home/habr/master.

De volgende stap is het starten van de service Bouwmeesters


sudo buildbot start /home/habr/master

Start vervolgens de dienst Arbeider-a


buildbot-worker start /home/habr/worker

Klaar! Nu Bouwbot zal veranderingen volgen en triggeren plegen-y in svn, het uitvoeren van de stappen voor het bouwen en testen van een project met de bovenstaande architectuur.

Hieronder beschrijf ik enkele kenmerken van het bovenstaande meester.cfg.

6.1 Op weg naar je master.cfg


Tijdens het schrijven van mijn master.cfg Er zullen veel fouten worden gemaakt, dus het lezen van het logbestand is vereist. Het wordt opgeslagen als Bouwmeester-ec absoluut pad /home/habr/master/twistd.log, en aan de zijkant Arbeider-a met absoluut pad /home/habr/worker/twistd.log. Terwijl u de fout leest en oplost, moet u de service opnieuw starten Bouwmeester-A. Zo werkt het:


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

6.2 Werken met 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)

Laten we eerst eens kijken svn_poller. Dit is nog steeds dezelfde interface, die de repository regelmatig één keer per minuut ondervraagt. In dit geval svn_poller heeft alleen toegang tot het filiaal stam. Mysterieuze parameter split_file=util.svn.split_file_alwaystrunk bepaalt de regels: hoe de mappenstructuur op te splitsen svn op de takken. Hij biedt ze ook relatieve paden. Op zijn beurt split_file_alwaystrunk vereenvoudigt het proces door te zeggen dat de repository alleen bevat stam.

В Planners aangegeven WijzigFilterwie ziet Geen en koppelt er een filiaal aan stam volgens een bepaalde associatie door split_file_alwaystrunk. Inspelen op veranderingen in stam, Lanceringen bouwer met naam jouw project.

vastgoed hier is het nodig zodat de beheerder mailinglijsten met build- en testresultaten ontvangt als eigenaar van het proces.

stap bouw-a uitchecken in staat om alle bestanden in de lokale versie van de repository volledig te verwijderen Arbeider-A. En dan voluit doen svn update. De modus wordt geconfigureerd via de parameter modus=vol, methode=vers. Parameter haltOnTailure zegt dat als svn update met een fout wordt uitgevoerd, moet het hele proces van bouwen en testen worden opgeschort, aangezien verdere acties geen zin hebben.

6.3 Brief aan u: melders zijn bevoegd tot aangifte


verslaggevers is een dienst voor het versturen van notificaties per e-mail.


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]

Hij kan berichten sturen verschillende manieren.

MailNotifier gebruikt e-mail om meldingen te verzenden.

sjabloon_html stelt het tekstsjabloon voor de nieuwsbrief in. HTML wordt gebruikt om markeringen te maken. Het wordt aangepast door de motor jinja2 (kan worden vergeleken met django). BouwBot heeft een reeks variabelen waarvan de waarden in de sjabloon worden vervangen tijdens het genereren van de berichttekst. Deze variabelen staan ​​tussen {{ dubbele accolades }}. Bijvoorbeeld, beknopte versie geeft de status weer van voltooide bewerkingen, dat wil zeggen succes of mislukking. A projecten zal uitvoeren jouw project. Dus, met behulp van besturingsopdrachten in jinja2, variabelen BouwBot-a en python tekenreeksopmaakhulpmiddelen, kunt u een behoorlijk informatief bericht maken.

MailNotifier bevat de volgende argumenten.

vanadr – het adres waar iedereen de nieuwsbrief zal ontvangen.

sendToInterestedUsers=True stuurt een bericht naar de eigenaar en gebruiker die het gemaakt heeft plegen.

lookup — een achtervoegsel dat moet worden toegevoegd aan de namen van gebruikers die de nieuwsbrief ontvangen. Dus beheerder hoe de gebruiker de nieuwsbrief op het adres ontvangt [e-mail beveiligd].

relaishost specificeert de hostnaam waarop de server wordt geopend smtp, een smptPort specificeert het poortnummer dat luistert smtp server.

mode = "waarschuwing" zegt dat de mailing alleen moet gebeuren als er minimaal één stap is bouw-a, wat eindigde met de statusfout of waarschuwing. Bij succes hoeft u geen nieuwsbrief te sturen.

extraOntvangers bevat een lijst met personen aan wie de mailing moet worden verzonden, naast de eigenaar en de persoon die de mailing heeft uitgevoerd plegen.

messageFormatter is een object dat het berichtformaat, de sjabloon en een reeks beschikbare variabelen specificeert jinja2. Opties zoals wantProperties=Waar и wantSteps=Waar definieer deze set beschikbare variabelen.

met['services']=[sendMessageToAll] biedt een lijst met diensten, waaronder die van ons verslaggever.

We hebben het gedaan! Gefeliciteerd

We hebben onze eigen configuratie gemaakt en gezien tot welke functionaliteit deze in staat is. BouwBot. Dit is, denk ik, voldoende om te begrijpen of deze tool nodig is om uw project te maken. Ben je geïnteresseerd in hem? Zal het nuttig voor u zijn? Is hij comfortabel om mee te werken? Dan schrijf ik dit artikel niet voor niets.

En verder. Ik zou graag willen dat de professionele gemeenschap er gebruik van maakt BouwBot, werd breder, handleidingen werden vertaald en er kwamen nog meer voorbeelden.

Ik dank u allen voor uw aandacht. Succes.

Bron: www.habr.com

Voeg een reactie