Un esempio di implementazione dell'integrazione continua utilizzando BuildBot

Un esempio di implementazione dell'integrazione continua utilizzando BuildBot
(Immagine di Informatizzatore da foto)

Hi!

Mi chiamo Evgenij Cherkin, Sono un programmatore in un team di sviluppo presso una società mineraria Polimetale.

Quando si avvia un progetto di grandi dimensioni, si inizia a pensare: "Quale software è meglio utilizzare per la sua manutenzione?" Un progetto IT attraversa una serie di fasi prima di rilasciare la versione successiva. È positivo quando la catena di queste fasi è automatizzata. Viene chiamato il processo automatizzato di rilascio di una nuova versione di un progetto IT stesso Integrazione continua. BuildBot si è rivelato un buon assistente per noi nell'implementazione di questo processo.

In questo articolo ho deciso di fornire una panoramica delle possibilità BuildBot. Di cosa è capace questo software? Come avvicinarsi a lui e come costruire con lui un normale RAPPORTO DI LAVORO EFFICACE? Puoi applicare tu stesso la nostra esperienza creando un servizio funzionante per costruire e testare il tuo progetto sulla tua macchina.

contenuto

contenuto

1. Perché BuildBot?
2. Concetto guidato da BuildMaster
3. Installazione
4. Primi passi

5. Configurazione. Ricetta passo dopo passo

5.1 Configurazione buildmaster
Lavoratori 5.2
5.3 cambia_fonte
5.4 pianificatori

5.5 CostruisciFactory
5.6 costruttori

6. Esempio della propria configurazione

6.1 Sulla strada per il tuo master.cfg
6.2 Lavorare con svn
6.3 Lettera a voi: i giornalisti sono autorizzati a dichiarare

Ce l'abbiamo fatta! Congratulazioni

1. Perché BuildBot?

In precedenza su habr-e mi sono imbattuto in articoli sull'implementazione Integrazione continua con BuildBot. Per esempio, Questo L'ho trovato il più informativo. C'è un altro esempio - più facile. Questi articoli possono essere stagionati esempio dal manualeE essa dopodiché, in inglese. La coupé è un buon punto di partenza. Dopo aver letto questi articoli, probabilmente vorrai subito qualcosa addosso BuildBot da fare.

Fermare! Qualcuno lo ha effettivamente utilizzato nei propri progetti? Risulta sì многие lo hanno applicato nei loro compiti. Possono essere trovati esempi utilizzare BuildBot e negli archivi di codice di Google.

Allora qual è la logica delle persone che usano Costruiscibot? Dopotutto, ci sono altri strumenti: Regolazione automatica della velocità и Jenkins. Risponderò in questo modo. Per la maggior parte delle attività Jenkins e la verità basterà. Nel suo turno, BuildBot - più adattivo, mentre i problemi vengono risolti lì semplicemente come in Jenkins. La scelta è tua. Ma poiché stiamo cercando uno strumento per un progetto target in via di sviluppo, perché non sceglierne uno che permetta, partendo da semplici passaggi, di ottenere un sistema di compilazione che abbia interattività e un'interfaccia unica.

Per coloro il cui progetto target è scritto in Python, sorge la domanda: “Perché non scegliere un sistema di integrazione che abbia un’interfaccia chiara in termini di linguaggio utilizzato nel progetto?” E ora è il momento di presentare i vantaggi BuildBot.

Quindi, il nostro “quartetto strumentale”. Per quanto mi riguarda, ho identificato quattro caratteristiche BuildBot:

  1. È un framework open source sotto licenza GPL
  2. Questo è l'uso di Python come strumento di configurazione e descrizione delle azioni richieste
  3. Questa è l'occasione per ricevere una risposta dalla macchina su cui avviene l'assemblaggio
  4. Questi sono, infine, i requisiti minimi per un Host. La distribuzione richiede Python e twisted e non richiede una macchina virtuale e una macchina Java.

2. Concetto guidato da BuildMaster

Un esempio di implementazione dell'integrazione continua utilizzando BuildBot

Centrale nell'architettura di distribuzione delle attività è Maestro di costruzione. È un servizio che:

  • tiene traccia modifiche nell'albero delle origini del progetto
  • invia comandi che dovrebbero essere eseguiti dal servizio Worker per creare il progetto e testarlo
  • Notifica utenti sui risultati delle azioni intraprese

Maestro di costruzione configurato tramite file master.cfg. Questo file è nella radice Maestro di costruzione. Più tardi mostrerò come viene creata questa radice. Il file stesso master.cfg contiene uno script Python che utilizza le chiamate BuildBot.

Il prossimo oggetto più importante BuildBot Ha un nome Lavoratore. Questo servizio può essere avviato su un altro host con un sistema operativo diverso, o magari su quello in cui Maestro di costruzione. Può anche esistere in un ambiente virtuale appositamente preparato con i propri pacchetti e variabili. Questi ambienti virtuali possono essere preparati utilizzando utilità Python come virtualenv, venv.

Maestro di costruzione trasmette comandi a tutti Lavoratore-y, e lui, a sua volta, li soddisfa. Cioè, risulta che il processo di costruzione e test di un progetto può continuare Lavoratore-e con Windows e su un altro Worker che esegue Linux.

Diamine i codici sorgente del progetto si verificano su ciascuno Lavoratore-e.

3. Installazione

Quindi andiamo. Utilizzerò Ubuntu 18.04 come host. Ne metterò uno sopra Maestro di costruzione-a e uno Lavoratore-UN. Ma prima devi installare python3.7:

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

Per coloro che hanno bisogno di python3.7.2 invece di 3.7.1, puoi fare quanto segue:


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

Il prossimo passo è installare Twittato и BuildBot, nonché pacchetti che consentono di utilizzare funzionalità aggiuntive 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. Primi passi

È ora di creare Maestro di costruzione. Sarà nella nostra cartella /home/habr/maestro.

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

Passo successivo. Creiamo Lavoratore. Sarà nella nostra cartella /home/habr/lavoratore.

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

Quando corri Lavoratore, quindi per impostazione predefinita verrà creato in /home/habr/lavoratore cartella con il nome del progetto, specificato in master.cfg. E nella cartella con il nome del progetto creerà una directory costruire, e continuerà a farlo cassa. Directory di lavoro per Lavoratore-e diventerà una directory /home/habr/tuoProgetto/build.

"Chiave d'oro
E ora per cosa ho scritto il paragrafo precedente: una sceneggiatura che Maestro richiederà da Lavoratore-e eseguito in remoto in questa directory non verrà eseguito perché lo script non dispone dei diritti per essere eseguito. Per correggere la situazione, avrai bisogno di una chiave --umask=0o22, che vieta la scrittura in questa directory, ma manterrà i diritti di avvio. E questo è tutto ciò di cui abbiamo bisogno.

Maestro di costruzione и Lavoratore stabilire una connessione tra loro. Succede che si interrompe e Lavoratore aspetto da tempo una risposta da Maestro di costruzione-UN. Se non c'è risposta, la connessione viene riavviata. Chiave --keepalive=60 bastava indicare l'ora dopo la quale connect si riavvia.

5. Configurazione. Ricetta passo dopo passo

Configurazione Maestro di costruzione viene eseguito sul lato della macchina dove abbiamo eseguito il comando creare-master. Nel nostro caso, questa è una directory /home/habr/maestro. File di configurazione master.cfg non esiste ancora, ma il comando stesso ha già creato il file master.cmg.esempio. Devi rinominarlo in master.cfg.esempio в master.cfg

mv master.cfg.sample master.cfg

Apriamo questo master.cfg. E vediamo in cosa consiste. E dopo, proviamo a creare il nostro file di configurazione.

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 Configurazione buildmaster

c = BuildmasterConfig = {} 

BuildmasterConfig — dizionario di base del file di configurazione. Deve essere incluso nel file di configurazione. Per facilità d'uso, nel codice di configurazione viene introdotto un alias "contro". Titoli chiavi в c["chiaveDaDist"] sono elementi fissi con cui interagire Maestro di costruzione. Per ogni chiave, l'oggetto corrispondente viene sostituito come valore.

Lavoratori 5.2

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

Questa volta indichiamo Maestro di costruzione-y elenco di Lavoratore-S. Me stessa Lavoratore abbiamo creato sopra, indicando tu-nome-lavoratore и parola d'ordine. Ora occorre invece specificarli lavoratore-esempio и passare .

5.3 cambia_fonte

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

Per chiave change_source dizionario c otteniamo l'accesso all'elenco in cui vogliamo inserire un oggetto che interroga il repository con il codice sorgente del progetto. L'esempio utilizza un repository Git che viene sottoposto a polling a determinati intervalli.

Il primo argomento è il percorso del tuo repository.

lavorodir rappresenta il percorso della cartella dove si trova a lato Lavoratore-a relativo al percorso /home/habr/lavoratore/tuoProgetto/build git memorizzerà la versione locale del repository.

ramo contiene un ramo specifico nel repository che dovrebbe essere seguito.

pollInterval contiene il numero di secondi dopo i quali Maestro di costruzione eseguirà il polling del repository per le modifiche.

Esistono diversi metodi per tenere traccia delle modifiche al repository di un progetto.

Il metodo più semplice è Polling, il che implica che Maestro di costruzione interroga periodicamente il server con il repository. Se commettere rifletteva le modifiche nel repository, quindi Maestro di costruzione creerà un oggetto interno con un certo ritardo Cambiamento di e inviarlo al gestore eventi Scheduler, che avvierà i passaggi per creare e testare il progetto Lavoratore-e. Tra questi passaggi verrà indicato update deposito. Esattamente acceso LavoratoreCiò creerà una copia locale del repository. I dettagli di questo processo saranno trattati di seguito nelle due sezioni successive. (5.4 и 5.5).

Un metodo ancora più elegante per tenere traccia delle modifiche apportate a un repository è inviare messaggi direttamente dal server che lo ospita Maestro di costruzione- sulla modifica dei codici sorgente del progetto. In questo caso, non appena lo sviluppatore lo fa commettere, il server con il repository del progetto invierà un messaggio Maestro di costruzione-y. E lui, a sua volta, lo intercetterà creando un oggetto PBChangeSource. Successivamente, questo oggetto verrà trasferito a Scheduler, che attiva i passaggi per costruire il progetto e testarlo. Una parte importante di questo metodo è lavorare con gancio-server script nel repository. Nella sceneggiatura gancio-a, responsabile dell'elaborazione delle azioni quando commettere-e, devi chiamare l'utilità inviamodifica e specificare l'indirizzo di rete Maestro di costruzione-UN. È inoltre necessario specificare la porta di rete che sarà in ascolto PBChangeSource. PBChangeSource, tra l'altro, fa parte Maestro di costruzione-UN. Questo metodo richiederà l'autorizzazione Admin-a sul server in cui si trova il repository del progetto. Dovrai prima effettuare un backup del repository.

5.4 pianificatori


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

pianificatori – questo è un elemento che funge da innesco che dà l’avvio a tutta la catena di montaggio e collaudo del progetto.
Un esempio di implementazione dell'integrazione continua utilizzando BuildBot

Quei cambiamenti che sono stati registrati change_source, trasformato nel processo di lavoro BuildBot-a opporsi Cambiamento di e ora ogni Sheduler sulla base di essi, crea le richieste per avviare il processo di creazione del progetto. Tuttavia, determina anche quando queste richieste vengono trasferite ulteriormente nella coda. Un oggetto Costruttore memorizza una coda di richieste e tiene traccia dello stato dell'assembly corrente su un separato Lavoratore-e. Costruttore esiste su Maestro di costruzione-e e così via Lavoratore-e. Invia con Maestro di costruzione-a su Lavoratore-e già specifico costruire - una serie di passaggi da seguire.
Lo vediamo nell'esempio attuale tale pianificatori Vengono creati 2 pezzi. Inoltre, ognuno ha il suo tipo.

SingleBranchScheduler – una delle lezioni più popolari in programma. Controlla un ramo e viene attivato da un cambiamento registrato in esso. Quando vede le modifiche, può ritardare l'invio della richiesta di compilazione (differire per il periodo specificato nel parametro speciale treeStableTimer). il Nome imposta il nome della pianificazione in cui verrà visualizzato BuildBot-interfaccia web. IN Cambia filtro viene impostato un filtro, dopo aver superato le modifiche nel ramo, si richiede al programma di inviare una richiesta di costruzione. IN nomecostruttore è indicato il nome costruttore-a, che imposteremo poco dopo. Il nome nel nostro caso sarà lo stesso del nome del progetto: il tuoProgetto.

ForceScheduler una cosa molto semplice. Questo tipo di pianificazione viene attivato con un clic del mouse BuildBot-interfaccia web. I parametri hanno la stessa essenza di in SingleBranchScheduler.

PS n.3. Forse tornerà utile
Periodico è un programma che viene eseguito con una certa frequenza temporale fissa. La chiamata assomiglia a questa


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

5.5 CostruisciFactory


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 specifica il tempo di questa periodicità in secondi.

CostruisciFactory crea uno specifico costruire, che poi costruttore invia a Lavoratore. In CostruisciFactory indica i passi da seguire Lavoratore-y. I passaggi vengono aggiunti chiamando il metodo aggiungiStep

Il primo passaggio aggiunto in questo esempio è git clean -d -f -f –x, lo giuro git verifica. Queste azioni sono incluse nel parametro metodo, che non è chiaramente indicato ma implica un valore predefinito fresco... Parametro modalità='incrementale' indica che i file provengono dalla directory in cui si trova il file checkout, pur mancando dal repository, rimangono intatti.

Il secondo passaggio aggiunto è la chiamata dello script prova con parametro Ciao sul lato Lavoratore-a dalla directory /home/habr/lavoratore/tuoProgetto/build con la variabile d'ambiente PATHONPATH=... In questo modo è possibile scrivere i propri script ed eseguirli lateralmente Lavoratore-a ogni passo util.ShellCommand. Questi script possono essere inseriti direttamente nel repository. Poi a checkout-e cadranno dentro /home/habr/lavoratore/tuoProgetto/build. Poi però ci sono due “ma”:

  1. Lavoratore deve essere creato con una chiave --umask in modo che non blocchi i diritti di esecuzione successivi cassa-a.
  2. A spingere-e di questi script è necessario specificare la proprietà eseguibilecosì dopo checkout-e non ha perso il diritto di eseguire lo script Git.

5.6 costruttori


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

A proposito di ciò che è Costruttore è stato detto qui. Ora ti dirò più in dettaglio come crearlo. Configurazione del costruttore è un costruttore costruttore. Tali designer in c['costruttori'] puoi specificarne diversi, poiché questo è un foglio di oggetti costruttore tipo. Ora riscriviamo l'esempio da BuildBot, avvicinandolo al nostro compito.


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

Ora ti parlerò dei parametri Configurazione del costruttore.

Nome specifica il nome costruttore-UN. Qui lo abbiamo chiamato il tuoProgetto... Ciò significa che su Lavoratore- verrà creato proprio questo percorso /home/habr/lavoratore/tuoProgetto/build. Sheduler cercando costruttore proprio con questo nome.

nomi dei lavoratori contiene foglio Lavoratore-S. Ognuno dei quali deve essere aggiunto c['lavoratori'].

fabbrica - specifica costruire, al quale è associato costruttore. Invierà l'oggetto costruire su Lavoratore per completare tutti i passaggi inclusi in questo costruire-a.

6. Esempio della propria configurazione

Ecco l'esempio di architettura del progetto che propongo di implementare tramite BuildBot
.

Utilizzeremo come sistema di controllo della versione svn. Il repository stesso si troverà in una sorta di cloud. Ecco l'indirizzo di questa nuvola svn.host/svn/tuoProgetto/trunk. Nella nuvola sotto svn c'è un nome utente dell'account: Utente, password: parola d'ordine. Script che rappresentano i passaggi costruire-a sarà anche nel ramo svn, in una cartella separata buildbot/worker_linux. Questi script si trovano nel repository con la proprietà salvata eseguibile.

Maestro di costruzione и Lavoratore eseguito sullo stesso host progetto.host .Maestro di costruzione memorizza i suoi file in una cartella /home/habr/maestro. Lavoratore è memorizzato nel seguente percorso /home/habr/lavoratore. Comunicazione di processo Maestro di costruzione-a e Lavoratore-a viene effettuato tramite la porta 4000 secondo il protocollo BuildBot-a, cioè 'pb' protocollo.

Il progetto di destinazione è scritto interamente in Python. Il compito è tenere traccia delle modifiche, creare un file eseguibile, generare documentazione e condurre test. In caso di fallimento, tutti gli sviluppatori devono inviare un messaggio via e-mail affermando che si è verificata un'azione non riuscita.

Visualizzazione Web BuildBot ci collegheremo alla porta 80 per progetto.host. Non è necessario installare Apache. Come parte della biblioteca ritorto esiste già un server web, BuildBot lo usa.

Per archiviare informazioni interne per BuildBot удем использовать sqlite.

Per l'invio della posta è necessario un host smtp.tuo.dominio - consente di inviare lettere dalla posta [email protected] senza autenticazione. Anche sull'ospite'smtp Il verbale verrà ascoltato alla postazione 1025.

Ci sono due persone coinvolte nel processo: Admin и Utente. l'amministratore amministra BuildBot. l'utente è la persona che effettua il commit commettere-S.

Il file eseguibile viene generato tramite pyinstaller. La documentazione viene generata tramite dossigeno.

Per questa architettura ho scritto questo: 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"
}

Per prima cosa hai bisogno создать Maestro di costruzione-a e Lavoratore-UN. Quindi incolla questo file master.cfg в /home/habr/maestro.

Il prossimo passo è avviare il servizio Maestro di costruziones


sudo buildbot start /home/habr/master

Quindi avvia il servizio Lavoratore-a


buildbot-worker start /home/habr/worker

Pronto! Ora Costruiscibot terrà traccia delle modifiche e si attiverà commettere-y dentro svn, eseguendo le fasi di costruzione e test di un progetto con l'architettura di cui sopra.

Di seguito descriverò alcune caratteristiche di quanto sopra master.cfg.

6.1 Sulla strada per il tuo master.cfg


Mentre scrivo il mio master.cfg Verranno commessi molti errori, quindi sarà necessaria la lettura del file di registro. È memorizzato come Maestro di costruzione-ec percorso assoluto /home/habr/master/twistd.loge sul lato Lavoratore-a con percorso assoluto /home/habr/worker/twistd.log. Mentre leggi l'errore e lo risolvi, dovrai riavviare il servizio Maestro di costruzione-UN. Ecco come è fatto:


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

6.2 Lavorare con 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)

Per iniziare, diamo un'occhiata svn_poller. Questa è sempre la stessa interfaccia, che esegue regolarmente il polling del repository una volta al minuto. In questo caso svn_poller accede solo alla filiale tronco. Parametro misterioso split_file=util.svn.split_file_alwaystrunk stabilisce le regole: come suddividere la struttura delle cartelle svn sui rami. Offre loro anche percorsi relativi. Nel suo turno split_file_alwaystrunk semplifica il processo dicendo che il repository contiene solo tronco.

В Programmatori è indicato Cambia filtrochi vede Nessuna e associa ad esso un ramo tronco secondo una determinata associazione attraverso split_file_alwaystrunk. Rispondere ai cambiamenti in tronco, Lancia costruttore con nome il tuoProgetto.

proprietà qui è necessario affinché l'amministratore riceva mailing list dei risultati di build e test come proprietario del processo.

Passo costruire-a cassa in grado di eliminare completamente qualsiasi file situato nella versione locale del repository Lavoratore-UN. E poi fai il pieno aggiornamento svn. La modalità è configurata tramite il parametro modalità=pieno, metodo=fresco... Parametro haltOnTailure dice che se aggiornamento svn verrà eseguito con un errore, l'intero processo di creazione e test dovrebbe essere sospeso, poiché ulteriori azioni non hanno senso.

6.3 Lettera a voi: i giornalisti sono autorizzati a dichiarare


giornalisti è un servizio per l'invio di notifiche via email.


template_html=u'''
<h4>Статус построенного релиза: {{ summary }}</h4>
<p>Используемый сервис для постраения: {{ workername }}</p>
<p>Проект: {{ projects }}</p>
<p>Для того что бы посмотреть интерфейс управления пройдите по ссылке: {{ buildbot_url }}</p>
<p>Для того что бы посмотреть результат сборки пройдите по ссылке: {{ build_url }}</p>
<p>Используя WinSCP можно подключиться к серверу c ip:xxx.xx.xxx.xx. Войдя под habr/password, забрать собранный executable файл с директории ~/worker/yourProject/build/dist.</p>
<p><b>Построение было произведено через Buildbot</b></p>
'''
                        
sendMessageToAll = reporters.MailNotifier(fromaddr="[email protected]",
                                          sendToInterestedUsers=True,
                                          lookup="your.domain",
                                          relayhost="smtp.your.domain",
                                          smtpPort=1025,
                                          mode="warnings",
                                          extraRecipients=['[email protected]'],
                                    messageFormatter=reporters.MessageFormatter(
                                                    template=template_html,
                                                    template_type='html',
                                                    wantProperties=True, 
                                                    wantSteps=True)
                                        )
c['services'] = [sendMessageToAll]

Può inviare messaggi diversi modi.

MailNotifier utilizza la posta elettronica per inviare notifiche.

modello_html imposta il modello di testo per la newsletter. HTML viene utilizzato per creare markup. Viene modificato dal motore Jinja2 (può essere confrontato con django). BuildBot ha un insieme di variabili i cui valori vengono sostituiti nel modello durante il processo di generazione del testo del messaggio. Queste variabili sono racchiuse tra {{ doppie parentesi graffe }}. Per esempio, sommario visualizza lo stato delle operazioni completate, ovvero l'esito positivo o negativo. UN progetti uscirà il tuoProgetto. Quindi, utilizzando i comandi di controllo in Jinja2, variabili BuildBot-a e gli strumenti di formattazione delle stringhe Python, puoi creare un messaggio piuttosto informativo.

MailNotifier contiene i seguenti argomenti.

daInd – l’indirizzo dal quale tutti riceveranno la newsletter.

sendToInterestedUsers=True invia un messaggio al proprietario e all'utente che lo ha creato commettere.

ricerca — un suffisso che deve essere aggiunto ai nomi degli utenti che ricevono la newsletter. COSÌ Admin come l'utente riceverà la newsletter all'indirizzo [email protected].

relèhost specifica il nome host su cui viene aperto il server smtp, un smptPort specifica il numero di porta in ascolto smtp server.

modalità="avviso" dice che il mailing va fatto solo se c'è almeno un passaggio costruire-a, che si è concluso con lo stato di errore o avviso. In caso di successo non è necessario inviare una newsletter.

extraRecipients contiene l'elenco dei soggetti a cui inviare l'invio oltre al titolare e alla persona che ha effettuato l'invio commettere.

messageFormatter è un oggetto che specifica il formato del messaggio, il suo modello e un insieme di variabili disponibili da Jinja2. Opzioni come WantProperties=Vero и WantSteps=Vero definire questo insieme di variabili disponibili.

con['services']=[sendMessageToAll] fornisce un elenco di servizi, tra i quali sarà il nostro reporter.

Ce l'abbiamo fatta! Congratulazioni

Abbiamo creato la nostra configurazione e abbiamo visto le funzionalità di cui è capace. BuildBot. Questo, credo, sia sufficiente per capire se questo strumento è necessario per creare il tuo progetto. Sei interessato a lui? Ti sarà utile? È a suo agio con cui lavorare? Allora non scriverò questo articolo invano.

E inoltre. Vorrei che la comunità professionale lo utilizzasse BuildBot, divenne più ampio, i manuali furono tradotti e ci furono ancora più esempi.

Grazie a tutti per l'attenzione. Buona fortuna.

Fonte: habr.com

Aggiungi un commento