Przykład wdrożenia Ciągłej Integracji z wykorzystaniem BuildBota

Przykład wdrożenia Ciągłej Integracji z wykorzystaniem BuildBota
(Zdjęcie autorstwa Komputeryzator od Pixabay)

Hi!

Mam na imię Jewgienij Czerkin, Jestem programistą w zespole programistów w firmie wydobywczej Polimetal.

Rozpoczynając jakikolwiek duży projekt zaczynasz się zastanawiać: „Jakiego oprogramowania najlepiej użyć do jego obsługi?” Projekt informatyczny przed wydaniem kolejnej wersji przechodzi przez szereg etapów. Dobrze, gdy łańcuch tych etapów jest zautomatyzowany. Sam proces wydawania nowej wersji projektu informatycznego nazywa się zautomatyzowanym Ciągła integracja. BudujBota okazał się dla nas dobrym pomocnikiem w realizacji tego procesu.

W tym artykule postanowiłem przedstawić przegląd możliwości BudujBota. Co potrafi to oprogramowanie? Jak do niego podejść i jak zbudować z nim normalną, EFEKTYWNĄ RELACJĘ W PRACY? Możesz sam zastosować nasze doświadczenie, tworząc działającą usługę do budowania i testowania projektu na swojej maszynie.

Zawartość

Zawartość

1. Dlaczego BuildBot?
2. Koncepcja prowadzona przez BuildMaster
3. Instalacja
4. Pierwsze kroki

5. Konfiguracja. Przepis krok po kroku

5.1 Konfiguracja Buildmaster
pracownicy 5.2
5.3 zmiana_źródła
Planiści 5.4

5.5 Budowa fabryki
5.6 budowniczych

6. Przykład własnej konfiguracji

6.1 W drodze do pliku master.cfg
6.2 Praca z svn
6.3 List do Ciebie: reporterzy są upoważnieni do składania deklaracji

Zrobiliśmy to! Gratulacje

1. Dlaczego BuildBot?

Wcześniej na habr-e natknąłem się na artykuły o wdrożeniach Ciągła integracja za pomocą BudujBota. Np, ten Wydało mi się to najbardziej pouczające. Jest inny przykład – prostsze. Artykuły te można sezonować przykład z instrukcjiI to potem po angielsku. Coupe jest dobrym punktem wyjścia. Po przeczytaniu tych artykułów prawdopodobnie od razu będziesz chciał mieć coś na sobie BudujBota Do.

Zatrzymywać się! Czy ktoś faktycznie stosował to w swoich projektach? Okazuje się, że tak wiele stosowali go w swoich zadaniach. Może być znaleziony przykłady używania BudujBota oraz w archiwach kodu Google.

Jaka jest więc logika ludzi korzystających Budujbota? W końcu istnieją inne narzędzia: Tempomat и Jenkins. Odpowiem w ten sposób. Do większości zadań Jenkins i prawda wystarczy. Z kolei BudujBota - bardziej adaptacyjny, podczas gdy problemy są tam rozwiązywane tak prosto, jak w Jenkins. Wybór nalezy do ciebie. Skoro jednak szukamy narzędzia do rozwijania projektu docelowego, dlaczego nie wybrać takiego, które pozwoli, zaczynając od prostych kroków, uzyskać system kompilacji charakteryzujący się interaktywnością i unikalnym interfejsem.

Dla tych, których docelowy projekt jest napisany w Pythonie, pojawia się pytanie: „Dlaczego nie wybrać systemu integracyjnego, który ma przejrzysty interfejs pod względem języka użytego w projekcie?” A teraz czas przedstawić korzyści BudujBota.

A więc nasz „kwartet instrumentalny”. Dla siebie zidentyfikowałem cztery cechy BudujBota:

  1. Jest to platforma open source na licencji GPL
  2. To jest użycie Pythona jako narzędzia konfiguracyjnego i opis wymaganych działań
  3. Jest to możliwość uzyskania odpowiedzi od maszyny, na której odbywa się montaż
  4. Są to w końcu minimalne wymagania dla Hosta. Wdrożenie wymaga języka Python i Twisted i nie wymaga maszyny wirtualnej ani maszyny Java.

2. Koncepcja prowadzona przez BuildMaster

Przykład wdrożenia Ciągłej Integracji z wykorzystaniem BuildBota

Najważniejszym elementem architektury dystrybucji zadań jest Mistrz budowy. Jest to usługa, która:

  • śledzi zmiany w drzewie źródłowym projektu
  • wysyła polecenia, które powinna wykonać usługa Worker, aby zbudować projekt i go przetestować
  • powiadamia użytkownikom o wynikach podjętych działań

Mistrz budowy skonfigurowany poprzez plik master.cfg. Ten plik znajduje się w katalogu głównym Mistrz budowy. Później pokażę jak powstaje ten korzeń. Sam plik master.cfg zawiera skrypt Pythona, który używa wywołań BudujBota.

Następny najważniejszy obiekt BudujBota ma imię Pracownik. Usługę tę można uruchomić na innym hoście z innym systemem operacyjnym lub może na tym, na którym Mistrz budowy. Może również istnieć w specjalnie przygotowanym środowisku wirtualnym z własnymi pakietami i zmiennymi. Te środowiska wirtualne można przygotować za pomocą narzędzi Pythona, takich jak wirtualne środowisko, venv.

Mistrz budowy rozsyła polecenia do wszystkich Pracownik-y, a on z kolei je spełnia. Oznacza to, że okazuje się, że proces budowania i testowania projektu może trwać dalej Pracownik-e z systemem Windows i na innym procesie roboczym z systemem Linux.

Wymeldować się kody źródłowe projektu występują na każdym z nich Pracownik-mi.

3. Instalacja

Więc chodźmy. Będę używać Ubuntu 18.04 jako hosta. Położę na nim jednego Mistrz budowy-a i jeden Pracownik-A. Ale najpierw musisz zainstalować Pythona 3.7:

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

Dla tych, którzy potrzebują Pythona 3.7.2 zamiast 3.7.1, możesz wykonać następujące czynności:


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

Następnym krokiem jest instalacja Tweetowano и BudujBota, a także pakiety umożliwiające skorzystanie z dodatkowej funkcjonalności BudujBota-I.


/*Все что под 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. Pierwsze kroki

Czas tworzyć Mistrz budowy. Będzie w naszym folderze /home/habr/master.

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

Następny krok. Stwórzmy Pracownik. Będzie w naszym folderze /home/habr/pracownik.

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

Kiedy biegniesz Pracownik, domyślnie utworzy się w /home/habr/pracownik folder z nazwą projektu, która jest określona w master.cfg. A w folderze z nazwą projektu utworzy katalog budowaći nadal będę to robić checkout. Katalog roboczy dla Pracownik-i stanie się katalogiem /home/habr/twójProjekt/build.

"Złoty klucz
A teraz to, dla czego napisałem poprzedni akapit: skrypt, który Mistrz będzie żądał od Pracownik-i wykonane zdalnie w tym katalogu nie zostaną wykonane, ponieważ skrypt nie ma uprawnień do uruchomienia. Aby naprawić sytuację, będziesz potrzebować klucza --umask=0o22, który zabrania zapisu w tym katalogu, ale zachowuje prawa do uruchamiania. I to wszystko, czego potrzebujemy.

Mistrz budowy и Pracownik nawiązać ze sobą połączenie. Zdarza się, że zrywa i Pracownik czekam trochę czasu na odpowiedź od Mistrz budowy-A. W przypadku braku odpowiedzi połączenie zostanie wznowione. Klucz --keepalive=60 wystarczyło wskazać czas, po którym connect uruchamia się ponownie.

5. Konfiguracja. Przepis krok po kroku

Konfiguracja Mistrz budowy odbywa się po tej stronie maszyny, na której wykonaliśmy polecenie mistrz tworzenia. W naszym przypadku jest to katalog /home/habr/master. Plik konfiguracyjny master.cfg jeszcze nie istnieje, ale samo polecenie utworzyło już plik master.cmg.sample. Musisz zmienić jego nazwę na master.cfg.sample в master.cfg

mv master.cfg.sample master.cfg

Otwórzmy ten master.cfg. I przyjrzyjmy się, z czego się składa. A potem spróbujmy stworzyć własny plik konfiguracyjny.

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 Konfiguracja Buildmaster

c = BuildmasterConfig = {} 

Konfiguracja Buildmaster — podstawowy słownik pliku konfiguracyjnego. Musi być zawarty w pliku konfiguracyjnym. Dla ułatwienia w kodzie konfiguracyjnym wprowadzono alias "vs"... Nazwy Klucze в c["kluczododl"] są stałymi elementami interakcji Mistrz budowy. Dla każdego klucza odpowiedni obiekt jest zastępowany jako wartość.

pracownicy 5.2

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

Tym razem wskazujemy Mistrz budowy-y lista Pracownik-S. Ja Pracownik stworzyliśmy powyżej, wskazując imię-pracownika и password. Zamiast tego należy je teraz określić przykładowy pracownik и przechodzić .

5.3 zmiana_źródła

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

Według klucza zmiana_źródła słownik c uzyskujemy dostęp do listy, na której chcemy umieścić obiekt odpytujący repozytorium o kod źródłowy projektu. W przykładzie zastosowano repozytorium Git, które jest odpytywane w określonych odstępach czasu.

Pierwszym argumentem jest ścieżka do repozytorium.

katalog pracy reprezentuje ścieżkę do folderu, gdzie znajduje się z boku Pracownik-a w stosunku do ścieżki /home/habr/worker/yourProject/build git będzie przechowywać lokalną wersję repozytorium.

oddział zawiera określoną gałąź w repozytorium, której należy przestrzegać.

ankietaInterwał zawiera liczbę sekund, po których następuje Mistrz budowy przeszuka repozytorium pod kątem zmian.

Istnieje kilka metod śledzenia zmian w repozytorium projektu.

Najprostsza metoda to Ankieta, co o tym świadczy Mistrz budowy okresowo odpytuje serwer z repozytorium. Jeśli popełnić odzwierciedlał zatem zmiany w repozytorium Mistrz budowy utworzy obiekt wewnętrzny z pewnym opóźnieniem zmiana i wyślij go do modułu obsługi zdarzeń Scheduler, który uruchomi kroki umożliwiające zbudowanie i przetestowanie projektu Pracownik-mi. Wśród tych kroków zostaną wskazane aktualizacja magazyn. Dokładnie na PracownikSpowoduje to utworzenie lokalnej kopii repozytorium. Szczegóły tego procesu zostaną omówione poniżej w dwóch kolejnych sekcjach. (5.4 и 5.5).

Jeszcze bardziej elegancką metodą śledzenia zmian w repozytorium jest wysyłanie wiadomości bezpośrednio z serwera, na którym jest ono hostowane Mistrz budowy- o zmianie kodów źródłowych projektu. W tym przypadku od razu po wykonaniu przez dewelopera popełnić, serwer z repozytorium projektu wyśle ​​wiadomość Mistrz budowy-y. A on z kolei przechwyci go, tworząc przedmiot Źródło zmiany PB. Następnie obiekt ten zostanie przeniesiony do Scheduler, co aktywuje kroki umożliwiające zbudowanie projektu i przetestowanie go. Ważną częścią tej metody jest praca hak-skrypty serwera w repozytorium. W skrypcie hak-a, odpowiedzialny za przetwarzanie działań kiedy popełnić-e, musisz wywołać narzędzie wyślijzmianę i podaj adres sieciowy Mistrz budowy-A. Musisz także określić port sieciowy, który będzie nasłuchiwał Źródło zmiany PB. Źródło zmiany PBnawiasem mówiąc, jest częścią Mistrz budowy-A. Ta metoda będzie wymagać pozwolenia Admin-a na serwerze, na którym znajduje się repozytorium projektu. Najpierw musisz wykonać kopię zapasową repozytorium.

Planiści 5.4


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

planiści – jest to element pełniący rolę wyzwalacza rozpoczynającego cały łańcuch montażu i testowania projektu.
Przykład wdrożenia Ciągłej Integracji z wykorzystaniem BuildBota

Te zmiany, które zostały zarejestrowane zmiana_źródła, przekształcony w procesie pracy BudujBota-a, aby sprzeciwić się zmiana a teraz każdy Sheduler na ich podstawie buduje żądania rozpoczęcia procesu budowy projektu. Określa jednak również, kiedy żądania te są przekazywane dalej do kolejki. Obiekt Budowniczy przechowuje kolejkę żądań i śledzi stan bieżącego zestawu na osobnym dysku Pracownik-jest. Budowniczy istnieje na Mistrz budowy-e i dalej Pracownik-mi. Wysyła z Mistrz budowy-a na Pracownik- i już konkretny budować - szereg kroków, które należy wykonać.
Widzimy, że w bieżącym przykładzie np planiści Tworzone są 2 sztuki. Co więcej, każdy ma swój własny typ.

Harmonogram pojedynczego oddziału – jedne z najpopularniejszych zajęć w grafiku. Obserwuje jedną gałąź i jest wyzwalany przez zarejestrowaną w niej zmianę. Kiedy zobaczy zmiany, może opóźnić wysłanie żądania budowy (odroczenie na czas określony w parametrze specjalnym drzewoStableTimer). W Nazwa ustawia nazwę harmonogramu, który będzie wyświetlany BudujBota-interfejs sieciowy. W Zmień filtr ustawiany jest filtr, po przejściu których zmiany w branży powodują, że harmonogram wysyła żądanie budowy. W nazwy konstruktorów nazwa jest wskazana budowniczy-a, które ustawimy nieco później. Nazwa w naszym przypadku będzie taka sama jak nazwa projektu: Twój projekt.

ForceScheduler bardzo prosta rzecz. Ten typ harmonogramu jest uruchamiany poprzez kliknięcie myszą BudujBota-interfejs sieciowy. Parametry mają tę samą istotę, co w Harmonogram pojedynczego oddziału.

PS nr 3. Może się przyda
Okresowy to harmonogram działający z określoną częstotliwością. Wywołanie wygląda mniej więcej tak


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

5.5 Budowa fabryki


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

okresowyBuildTimer określa czas trwania tej okresowości w sekundach.

Budowa fabryki tworzy konkret budować, który następnie budowniczy wysyła do Pracownik, Budowa fabryki wskazuje kroki, które należy wykonać Pracownik-y. Kroki dodaje się poprzez wywołanie metody dodajKrok

Pierwszym dodanym krokiem w tym przykładzie jest git clean -d -f -f –x, a następnie git kasa. Działania te są uwzględnione w parametrze metoda, co nie jest jasno określone, ale sugeruje wartość domyślną świeży. Parametr tryb='przyrostowy' wskazuje, że pliki pochodzą z katalogu, w którym znajduje się plik kasa, choć nie ma ich w repozytorium, pozostają nietknięte.

Drugim dodanym krokiem jest wywołanie skryptu próba z parametrem cześć od strony Pracownik-a z katalogu /home/habr/worker/yourProject/build ze zmienną środowiskową PATHONPATH=... W ten sposób możesz pisać własne skrypty i wykonywać je z boku Pracownik-na każdym kroku util.ShellCommand. Skrypty te można umieścić bezpośrednio w repozytorium. Następnie o godz kasa-e wpadną /home/habr/worker/yourProject/build. Są jednak dwa „ale”:

  1. Pracownik należy utworzyć za pomocą klucza --umaska aby nie blokowało później praw do wykonania checkout-I.
  2. w git push-e z tych skryptów musisz określić właściwość wykonalnyżeby później kasa-e nie utraciło prawa do wykonania skryptu Git.

5.6 budowniczych


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

O tym, co to jest Budowniczy było powiedziane tutaj. Teraz opowiem bardziej szczegółowo, jak go stworzyć. Konfiguracja konstruktora jest konstruktorem budowniczy. Tacy projektanci w c['budowniczowie'] możesz określić kilka, ponieważ jest to arkusz obiektów budowniczy typ. Teraz przepiszmy przykład z BudujBota, przybliżając go do naszego zadania.


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

Teraz opowiem o parametrach Konfiguracja konstruktora.

Nazwa określa nazwę budowniczy-A. Tutaj to nazwaliśmy Twój projekt. Oznacza to, że na Pracownik- ta właśnie ścieżka zostanie utworzona /home/habr/worker/yourProject/build. Sheduler szukam budowniczy właśnie pod tym imieniem.

nazwiska pracowników zawiera arkusz Pracownik-S. Do każdego trzeba dodać c['pracownicy'].

fabryka - konkretny budować, z którym jest powiązany budowniczy. Wyśle obiekt budować na Pracownik aby ukończyć wszystkie zawarte w tym kroki budować-I.

6. Przykład własnej konfiguracji

Oto przykładowa architektura projektu, którą proponuję wdrożyć za pośrednictwem BudujBota
.

Będziemy używać jako systemu kontroli wersji svn. Samo repozytorium będzie zlokalizowane w jakiejś chmurze. Oto adres tej chmury svn.host/svn/yourProject/trunk. W chmurze pod svn istnieje nazwa użytkownika konta: użytkownik, hasło: password. Skrypty reprezentujące kroki budować-a również będzie w gałęzi svn, w osobnym folderze buildbot/worker_linux. Skrypty te znajdują się w repozytorium z zapisaną właściwością plik wykonywalny.

Mistrz budowy и Pracownik uruchomić na tym samym hoście projekt.host .Mistrz budowy przechowuje swoje pliki w folderze /home/habr/master. Pracownik jest on przechowywany w następującej ścieżce /home/habr/pracownik. Komunikacja procesowa Mistrz budowy-a i Pracownik-a odbywa się poprzez port 4000 zgodnie z protokołem BudujBota-a, to znaczy „pb” protokół.

Projekt docelowy jest w całości napisany w Pythonie. Zadanie polega na śledzeniu jego zmian, utworzeniu pliku wykonywalnego, wygenerowaniu dokumentacji i przeprowadzeniu testów. W przypadku niepowodzenia wszyscy programiści muszą wysłać wiadomość e-mailem z informacją o niepowodzeniu działania.

Wyświetlanie internetowe BudujBota połączymy się z portem 80 dla projekt.host. Nie ma potrzeby instalowania Apatcha. Jako część biblioteki skręcone istnieje już serwer WWW, BudujBota używa go.

Do przechowywania informacji wewnętrznych BudujBota użyjemy sqlite.

Do wysłania wiadomości wymagany jest host smtp.twoja.domena - umożliwia wysyłanie listów z poczty [email chroniony] bez uwierzytelnienia. Również na gospodarzuSMTP Protokół jest odczytywany pod adresem 1025.

W proces zaangażowane są dwie osoby: Admin и użytkownik. administruje administrator BudujBota. użytkownik to osoba popełniająca przestępstwo popełnić-S.

Plik wykonywalny jest generowany przez pyinstaller. Dokumentacja generowana jest poprzez tlen.

Dla tej architektury napisałem to: 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"
}

Najpierw potrzebujesz stwórz Mistrz budowy-a i Pracownik-A. Następnie wklej ten plik master.cfg в /home/habr/master.

Kolejnym krokiem jest uruchomienie usługi Mistrz budowyaa


sudo buildbot start /home/habr/master

Następnie uruchom usługę Pracownik-a


buildbot-worker start /home/habr/worker

Gotowy! Teraz Budujbota będzie śledzić zmiany i wyzwalać popełnić-w svn, wykonując kroki budowania i testowania projektu o powyższej architekturze.

Poniżej opiszę niektóre cechy powyższych główny.cfg.

6.1 W drodze do pliku master.cfg


Podczas pisania mojego master.cfg Zostanie popełnionych wiele błędów, dlatego konieczne będzie przeczytanie pliku dziennika. Jest przechowywany jako Mistrz budowy-ec ścieżka bezwzględna /home/habr/master/twistd.log, i z boku Pracownik-a ze ścieżką bezwzględną /home/habr/worker/twistd.log. Po przeczytaniu błędu i naprawieniu go konieczne będzie ponowne uruchomienie usługi Mistrz budowy-A. Oto jak to się robi:


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

6.2 Praca z 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)

Najpierw przyjrzyjmy się svn_poller. To wciąż ten sam interfejs, regularnie odpytujący repozytorium raz na minutę. W tym przypadku svn_poller uzyskuje dostęp tylko do oddziału tułów. Tajemniczy parametr split_file=util.svn.split_file_alwaystrunk ustala zasady: jak podzielić strukturę folderów svn na gałęziach. Oferuje im także względne ścieżki. Z kolei split_file_alwaystrunk upraszcza proces, mówiąc, że repozytorium zawiera tylko pliki tułów.

В Harmonogramy wskazany Zmień filtrkto widzi żaden i wiąże z nim oddział tułów według danego skojarzenia poprzez split_file_alwaystrunk. W odpowiedzi na zmiany w tułów, Uruchamia budowniczy z imieniem Twój projekt.

niska zabudowa tutaj jest to potrzebne, aby administrator jako właściciel procesu otrzymywał listy mailingowe z wynikami kompilacji i testów.

Krok budować-a checkout zdolny do całkowitego usunięcia dowolnych plików znajdujących się w lokalnej wersji repozytorium Pracownik-A. A potem zrób całość aktualizacja svn. Tryb konfiguruje się za pomocą parametru tryb = pełny, metoda = świeża. Parametr haltOnTailure mówi, że jeśli aktualizacja svn zostanie wykonany z błędem, wówczas należy wstrzymać cały proces budowania i testowania, gdyż dalsze działania nie mają sensu.

6.3 List do Ciebie: reporterzy są upoważnieni do składania deklaracji


reporterzy to usługa wysyłania powiadomień e-mailem.


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]

Potrafi wysyłać wiadomości różne sposoby.

Powiadomienie poczty używa poczty e-mail do wysyłania powiadomień.

szablon_html ustawia szablon tekstu dla newslettera. Do tworzenia znaczników używany jest kod HTML. Jest modyfikowany przez silnik jinja2 (można porównać z django). BudujBota posiada zbiór zmiennych, których wartości są podstawiane do szablonu w trakcie generowania tekstu wiadomości. Zmienne te są ujęte w {{ podwójne nawiasy klamrowe }}. Na przykład, streszczenie wyświetla status wykonanych operacji, czyli sukces lub niepowodzenie. A projektowanie wyprowadzi Twój projekt. Tak więc, używając poleceń sterujących w jinja2, zmienne BudujBota-a i narzędzia do formatowania ciągów znaków w Pythonie, możesz stworzyć dość pouczającą wiadomość.

Powiadomienie poczty zawiera następujące argumenty.

zadresu – adres, z którego każdy będzie otrzymywał newsletter.

wyślij do zainteresowanych użytkowników=True wysyła wiadomość do właściciela i użytkownika, który dokonał popełnić.

wyszukiwania — przyrostek, który należy dodać do nazw użytkowników otrzymujących newsletter. Więc Admin w jaki sposób użytkownik będzie otrzymywał newsletter na podany adres [email chroniony].

gospodarz przekaźnika określa nazwę hosta, na którym otwarty jest serwer SMTP, A smptPort określa numer portu, który nasłuchuje SMTP serwer.

tryb="ostrzeżenie" mówi, że wysyłka powinna odbywać się tylko wtedy, gdy składa się z co najmniej jednego etapu budować-a, które zakończyło się niepowodzeniem statusu lub ostrzeżeniem. W przypadku powodzenia nie ma potrzeby wysyłania newslettera.

dodatkowi odbiorcy zawiera listę osób, do których należy wysłać mailing, oprócz właściciela i osoby, która go przeprowadziła popełnić.

Format wiadomości to obiekt określający format wiadomości, jej szablon i zestaw dostępnych zmiennych jinja2. Opcje takie jak wantProperties=True и wantSteps=Prawda zdefiniuj ten zestaw dostępnych zmiennych.

with['services']=[sendMessageToAll] udostępnia listę usług, wśród których znajdzie się nasza reporter.

Zrobiliśmy to! Gratulacje

Stworzyliśmy własną konfigurację i zobaczyliśmy, do jakich funkcjonalności jest zdolna. BudujBota. To myślę, że wystarczy, aby zrozumieć, czy to narzędzie jest potrzebne do stworzenia Twojego projektu. Czy jesteś nim zainteresowany? Czy będzie Ci to przydatne? Czy wygodnie się z nim pracuje? W takim razie nie piszę tego artykułu na próżno.

I dalej. Chciałbym, aby społeczność profesjonalna korzystała z niego BudujBota, stało się szersze, przetłumaczono podręczniki i było jeszcze więcej przykładów.

Dziękuję wszystkim za uwagę. Powodzenia.

Źródło: www.habr.com

Dodaj komentarz