BuildBot ilə Davamlı İnteqrasiya nümunəsi

BuildBot ilə Davamlı İnteqrasiya nümunəsi
(Şəkil kompüterçi etibarən (Pixabay)

Привет!

My name Yevgeni Çerkin, Mən bir mədən şirkətində inkişaf komandası üçün proqramçıyam Polimetal.

Hər hansı bir böyük layihəyə başlayarkən, düşünməyə başlayırsınız: "Onu saxlamaq üçün hansı proqramdan istifadə etmək daha yaxşıdır?". İT layihəsi növbəti versiyanı buraxmazdan əvvəl bir sıra mərhələlərdən keçir. Bu mərhələlərin zənciri avtomatlaşdırıldıqda yaxşıdır. Özlüyündə İT layihəsinin yeni versiyasının buraxılmasının avtomatlaşdırılmış prosesi adlanır Davamlı inteqrasiya. BuildBot bu prosesi həyata keçirərək bizim üçün yaxşı köməkçi oldu.

Bu yazıda imkanlar haqqında ümumi məlumat vermək qərarına gəldim BuildBot. Bu proqram nəyə qadirdir? Ona necə yanaşmaq və onunla normal, SƏMİRLİ İŞ MÜNASİBƏTİ necə qurmaq olar? Maşınınızda layihəniz üçün işçi montaj və sınaq xidməti yaradaraq təcrübəmizi özünüz tətbiq edə bilərsiniz.

Məzmun

Məzmun

1. Niyə BuildBot?
2. BuildMaster tərəfindən idarə olunan konsepsiya
3. Quraşdırma
4. İlk addımlar

5. Konfiqurasiya. Addım-addım resept

5.1 BuildmasterConfig
5.2 işçi
5.3 Dəyişiklik_mənbəsi
5.4 planlaşdırıcılar

5.5 Build Factory
5.6 inşaatçı

6. Öz konfiqurasiya nümunəsi

6.1 Ustanıza gedən yolda.cfg
6.2 svn ilə işləmək
6.3 Sizə məktub: reportyorlar xəbər vermək səlahiyyətinə malikdirlər

Biz bunu etdik! Təbrik edirik

1. Niyə BuildBot?

Daha əvvəl habr-e-də tətbiqi ilə bağlı məqalələrlə tanış oldum Davamlı inteqrasiya istifadə edərək BuildBot. Məsələn, Bu bir mənə ən məlumatlı göründü. Başqa bir misal var - daha sadə. Bu məqalələr redaktə edilə bilər təlimatdan nümunəbu sonra ingilis dilində. Kupe yaxşı başlanğıc nöqtəsidir. Bu məqalələri oxuduqdan sonra, şübhəsiz ki, bir şey istəyəcəksiniz BuildBot etmək.

Dayan! Kimsə həqiqətən öz layihələrində istifadə edibmi? Belə çıxır ki, bəli mnogie vəzifələrində tətbiq etdi. Tapmaq olar nümunələr istifadə BuildBot və google kodları arxivlərində.

Yəni insanların istifadə etmələrinin məntiqi nədir buildbot? Axı, başqa vasitələr də var: kruiz kontrol и Jenkins. Mən belə cavab verəcəm. Əksər tapşırıqlar üçün Jenkins və həqiqət kifayət edər. Öz növbəsində, BuildBot - daha uyğunlaşır, problemlər isə orada olduğu kimi sadə həll olunur Jenkins. Sən seçirsən. Ancaq inkişaf etməkdə olan bir hədəf layihəsi üçün alət axtardığımız üçün niyə sadə addımlardan başlayaraq interaktivliyə və unikal interfeysə malik bir quruluş sistemi əldə etməyə imkan verəcək birini seçməyək.

Hədəf layihəsi python dilində yazılmış şəxslər üçün sual yaranır: “Niyə layihədə istifadə olunan dil baxımından aydın interfeysə malik inteqrasiya sistemini seçməyək?”. İndi faydaları təqdim etmək vaxtıdır BuildBot.

Beləliklə, bizim "instrumental kvartetimiz". Özüm üçün dörd xüsusiyyət müəyyən etdim BuildBot:

  1. GPL lisenziyası altında açıq mənbə çərçivəsidir.
  2. Bu, python-dan tələb olunan hərəkətləri konfiqurasiya etmək və təsvir etmək üçün bir vasitə kimi istifadə olunur.
  3. Bu, montajın baş verdiyi maşından cavab almaq imkanıdır
  4. Bunlar, nəhayət, Host üçün minimum tələblərdir. Yerləşdirmə python və twisted tələb edir və virtual maşın və java maşını tələb etmir.

2. BuildMaster tərəfindən idarə olunan konsepsiya

BuildBot ilə Davamlı İnteqrasiya nümunəsi

Tapşırıq paylama arxitekturasının mərkəzidir BuildMaster. Bu bir xidmətdir ki:

  • izləyir layihənin mənbə ağacında dəyişikliklər
  • göndərir layihəni qurmaq və sınaqdan keçirmək üçün İşçi xidməti tərəfindən yerinə yetirilməli olan əmrlər
  • xəbər verir istifadəçilər öz fəaliyyətlərinin nəticələri haqqında

BuildMaster fayl vasitəsilə konfiqurasiya edilir master.cfg. Bu fayl kökdədir BuildMaster. Bu kökün necə yaradıldığını sonra göstərəcəyəm. Faylın özü master.cfg python ehtiva edir - zənglərdən istifadə edən skript BuildBot.

Növbəti ən vacib obyekt BuildBot Bu adı var Işçi. Bu xidmət başqa bir əməliyyat sistemi olan başqa bir hostda və ya bəlkə də harada işlədilə bilər BuildMaster. Öz paketləri və dəyişənləri ilə xüsusi hazırlanmış virtual mühitdə də mövcud ola bilər. Bu virtual mühitlər kimi python utilitlərindən istifadə etməklə hazırlana bilər verticalenv, venv.

BuildMaster əmrləri hər kəsə yayımlayın Işçi-y və o, öz növbəsində, onları yerinə yetirir. Yəni, belə çıxır ki, layihənin qurulması və sınaqdan keçirilməsi prosesi davam edə bilər Işçi-e Windows altında və başqa bir İşçidə Linux altında.

Yoxla layihənin mənbə kodu hər birində baş verir Işçi-e.

3. Quraşdırma

Beləliklə, gedək. Host kimi Ubuntu 18.04 istifadə edəcəyəm. Bunun üzərinə birini yerləşdirəcəyəm BuildMaster-a və bir Işçi-a. Ancaq əvvəlcə python3.7 quraşdırmalısınız:

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

3.7.2 əvəzinə python3.7.1 ehtiyacı olanlar üçün aşağıdakıları edə bilərsiniz:


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

Növbəti addım təyin etməkdir tvit etdi и BuildBot, həmçinin əlavə funksionallıqdan istifadə etməyə imkan verən paketlər BuildBot-The.


/*Все что под 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. İlk addımlar

Yaratmaq vaxtıdır BuildMaster. Qovluqumuzda olacaq. /ev/habr/usta.

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

Növbəti addım. Yaradaq Işçi. Qovluqumuzda olacaq. /ev/habr/işçi.

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

Qaçarkən Işçi, sonra defolt olaraq yaradılacaq /ev/habr/işçi -də göstərilən layihənin adı olan qovluq master.cfg. Və layihənin adı olan qovluqda bir kataloq yaradacaq qurmaq, və sonra edəcək checkout. üçün iş kataloqu Işçi-a qovluğa çevriləcək /home/habr/yourProject/build.

"Qızıl açar
İndi əvvəlki paraqrafı nə üçün yazdım: bir skript ki Master tələb edəcək Işçi-a do remote bu kataloqda icra olunmayacaq, çünki skriptin işləmək icazəsi yoxdur. Vəziyyəti düzəltmək üçün bir açar lazımdır --umask=0o22, bu kataloqa yazmağı qadağan edir, lakin işə salma hüquqlarını tərk edir. Və bizə lazım olan tək şey budur.

BuildMaster и Işçi bir-biri ilə əlaqə yaratmaq. Elə olur ki, qırılır və Işçi dan cavab gözləyir BuildMaster-Ə. Cavab yoxdursa, əlaqə yenidən başlayır. Açar --saxlama=60 yalnız bundan sonrakı vaxtı göstərmək üçün lazımdır birləşdirmək yenidən yüklənir.

5. Konfiqurasiya. Addım-addım resept

Konfiqurasiya BuildMaster əmri yerinə yetirdiyimiz maşının tərəfində həyata keçirilir yarat-master. Bizim vəziyyətimizdə bu kataloqdur /ev/habr/usta. Konfiqurasiya faylı master.cfg hələ mövcud deyil, lakin komandanın özü faylı artıq yaratmışdır master.cmg.nümunə. Bunun adını dəyişmək lazımdır master.cfg.nümunə в master.cfg

mv master.cfg.sample master.cfg

Bunu açaq master.cfg. Və onun nədən ibarət olduğunu görək. Və bundan sonra konfiqurasiya faylımızı yaratmağa çalışacağıq.

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 — konfiqurasiya faylının əsas lüğəti. O, konfiqurasiya faylına daxil edilməlidir. İstifadə rahatlığı üçün konfiqurasiya kodunda ləqəb təqdim olunur "c". Başlıqlar düymələr в c["keyFromDist"] qarşılıqlı əlaqədə olan sabit elementlərdir BuildMaster. Hər düymənin altında müvafiq obyekt dəyər kimi əvəz olunur.

5.2 işçi

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

Bu dəfə qeyd edirik BuildMaster-y siyahısı Işçi-ov. Özüm Işçi yaratdıq yuxarıda, göstərir sən işçinin adı и parol. İndi əvəzinə onlar dəqiqləşdirilməlidir nümunə işçi и keçmək .

5.3 Dəyişiklik_mənbəsi

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

Açarla mənbəni dəyişdirin lüğət c biz layihənin mənbə kodu ilə depoya sorğu verən obyekti qoymaq istədiyiniz siyahıya daxil oluruq. Nümunədə müntəzəm olaraq sorğulanan Git deposundan istifadə olunur.

Birinci arqument deponuza gedən yoldur.

işdir yan tərəfdə olan qovluğa gedən yolu göstərir Işçi-yola yaxın /home/habr/worker/yourProject/build git deponun yerli versiyasını saxlayacaq.

filial izləmək üçün depoda xüsusi filialı ehtiva edir.

sorğu intervalı ondan sonrakı saniyələrin sayını ehtiva edir BuildMaster dəyişikliklər üçün depoda sorğu keçirəcək.

Layihə deposunda dəyişiklikləri izləmək üçün bir neçə üsul var.

Ən sadə üsuldur Polling, bunu nəzərdə tutur BuildMaster vaxtaşırı serveri depo ilə sorğulayır. Əgər törətmək anbardakı dəyişiklikləri əks etdirdi, sonra BuildMaster müəyyən gecikmə ilə daxili obyekti yaradacaq Dəyişdirmək və hadisə idarəçisinə göndərin Planlaşdırma, layihənin qurulması və sınaqdan keçirilməsi üçün addımları başlayacaq Işçi-e. Bu addımlar daxildir yeniləmə anbar. Tam olaraq Işçi-e deponun yerli surətini yaradacaq. Bu prosesin təfərrüatları aşağıda növbəti iki hissədə əhatə olunacaq. (5.4 и 5.5).

Anbarda dəyişiklikləri izləməyin daha zərif üsulu, onu yerləşdirən serverdən birbaşa mesaj göndərməkdir. BuildMaster-y layihənin mənbə kodlarının dəyişdirilməsi haqqında. Bu halda, geliştirici edir kimi törətmək, layihə deposu olan server mesaj göndərəcək BuildMaster-y. Və bu, öz növbəsində, bir obyekt yaratmaqla onu kəsəcəkdir PBCchangeSource. Bu obyekt daha sonra ötürüləcək Planlaşdırma, layihənin qurulması və sınaqdan keçirilməsi üçün addımları aktivləşdirir. Bu metodun əhəmiyyətli bir hissəsi bu işdir çəngəl-depoda olan server skriptləri. Skriptdə çəngəl-a, emal hərəkətləri üçün məsul olduqda törətmək-e, kommunal xidmətə zəng etməlisiniz göndərmə və şəbəkə ünvanını göstərin BuildMaster-Ə. Dinləyəcək şəbəkə portunu təyin etməlisiniz PBCchangeSource. PBCchangeSource, yeri gəlmişkən, hissəsidir BuildMaster-Ə. Bu üsul hüququ tələb edəcək admin-a layihə deposunun yerləşdiyi serverdə. Əvvəlcə deponun ehtiyat nüsxəsini yaratmalısınız.

5.4 planlaşdırıcılar


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

planlaşdırıcılar - bu, layihənin bütün montaj və sınaq zəncirini başlatan bir tetikleyici rolunu oynayan bir elementdir.
BuildBot ilə Davamlı İnteqrasiya nümunəsi

Edilən dəyişikliklər mənbəni dəyişdirin, işin gedişində çevrildi BuildBot- etiraz etmək Dəyişdirmək və indi hər Şeduler onlara əsaslanaraq, layihənin qurulması prosesinə başlamaq üçün sorğular qurur. Bununla belə, bu sorğuların növbəyə nə vaxt ötürüldüyünü də müəyyən edir. Bir obyekt Inşaatçı sorğuların növbəsini saxlayır və cari məclisin vəziyyətini ayrıca izləyir Işçi-e. Inşaatçı üzərində də mövcuddur BuildMaster-e və sonra Işçi-e. dan göndərir BuildMaster-və davam Işçi- və artıq konkret qurmaq - izləniləcək bir sıra addımlar.
Biz bunu indiki nümunədə görürük planlaşdırıcılar 2 yaradılmışdır. Üstəlik, hər birinin öz növü var.

SingleBranchScheduler ən məşhur planlaşdırma dərslərindən biridir. O, bir filialı izləyir və onda müəyyən edilmiş dəyişikliyi işə salır. Dəyişiklikləri gördükdə, quraşdırma sorğusunun göndərilməsini təxirə sala bilər (xüsusi parametrdə göstərilən müddətə təxirə salın treeStableTimer). IN ad göstəriləcək cədvəlin adını müəyyən edir BuildBot-veb interfeysi. IN Filtr dəyişdirin Filtr qurulur, onun vasitəsilə filialdakı dəyişikliklər quraşdırma sorğusu göndərmək üçün cədvələ səbəb olur. IN inşaatçı adları adı göstərilir qurucu-a, bir az sonra təyin edəcəyik. Bizim vəziyyətimizdəki ad layihənin adı ilə eyni olacaq: Sizin Layihəniz.

ForceScheduler çox sadə bir şey. Bu cür cədvəl siçan vasitəsilə kliklənməsi ilə işə salınır BuildBot-veb interfeysi. Parametrlər ilə eynidir SingleBranchScheduler.

PS # 3. Birdən işə yarayır
Dövri - bu, müəyyən sabit vaxt intervalı ilə işləyən cədvəldir. Zəng belə görünür


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

5.5 Build Factory


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 bu dövriliyin vaxtını saniyələrlə müəyyən edir.

Build Factory spesifik yaradır qurmaq, o zaman qurucu istinad edir Işçi. Ilə Build Factory atılacaq addımları göstərir Işçi-y. Addımlar metodu çağırmaqla əlavə edilir əlavə et

Bu nümunədə ilk əlavə addımdır git clean -d -f -f –xsonra git ödəmə. Bu hərəkətlər parametrə daxildir üsul, bu açıq şəkildə göstərilməyib, lakin standart dəyəri nəzərdə tutur təzə. Parametr rejim = 'artan' faylların olduğu qovluqdan olduğunu söyləyir chechout, anbarda itkin düşənlərə toxunulmaz qalır.

İkinci əlavə addım skript çağırışıdır sınaq parametri ilə salam tərəfdən Işçi- kataloqdan /home/habr/worker/yourProject/build mühit dəyişəni ilə PATHONPATH=... Beləliklə, siz öz skriptlərinizi yaza və onları yan tərəfdə icra edə bilərsiniz. Işçi- bir addım util.ShellCommand. Bu skriptlər birbaşa depoya yerləşdirilə bilər. Sonra saat chechout-e düşəcəklər /home/habr/worker/yourProject/build. Bununla belə, iki "amma" var:

  1. Işçi açarla yaradılmalıdır --umask sonra icra hüquqlarını bloklamaması üçün checkout-The.
  2. Hazırda git basmaqBu skriptlərin -e xüsusiyyəti göstərməlidir icra edilə bilənbelə ki, sonra chechout-e Git skriptini icra etmək icazəsini itirmədi.

5.6 inşaatçı


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

Nə olduğu haqqında Inşaatçı deyildi burada. İndi onu necə yaratmaq barədə sizə daha ətraflı məlumat verəcəyəm. BuilderConfig konstruktordur qurucu. Bu cür konstruktorlar c['inşaatçılar'] birdən çox müəyyən edilə bilər, çünki bu, obyektlərin siyahısıdır qurucu növü. İndi nümunəni yenidən yazaq BuildBotproblemimizə yaxınlaşdırır.


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

İndi parametrlər haqqında danışaq. BuilderConfig.

ad adını təyin edir qurucu-a. Burada onun adını verdik Sizin Layihəniz... Bu o deməkdir ki, açıqdır Işçi-e bu yol yaradılacaq /home/habr/worker/yourProject/build. Şeduler axtarır qurucu sadəcə bu adla.

işçi adları vərəqdən ibarətdir Işçi-ov. Onların hər birinə əlavə edilməlidir c['işçilər'].

zavod - konkret qurmaqhansı ilə bağlıdır qurucu. Obyekt göndərəcək qurmaq haqqında Işçi buna daxil olan bütün addımları tamamlamaq üçün qurmaq-The.

6. Öz konfiqurasiya nümunəsi

Budur, həyata keçirməyi təklif etdiyim nümunə layihə arxitekturası BuildBot
.

Versiyaya nəzarət sistemi kimi istifadə edəcəyik svn. Anbarın özü bəzi buludda yerləşəcək. Budur bu buludun ünvanı svn.host/svn/yourProject/trunk. Buludun altında svn bir hesab istifadəçi adı var: istifadəçi, passwd: parol. Addımlar olan skriptlər qurmaq-a da filialda olacaq svn, ayrıca qovluqda buildbot/worker_linux. Bu skriptlər saxlanmış xassə ilə depodadır yürütülebilir.

BuildMaster и Işçi eyni hostda işləyin layihə.host .BuildMaster fayllarını qovluqda saxlayır /ev/habr/usta. Işçi eyni mağazalar aşağıdakı yolda /ev/habr/işçi. Rabitə prosesi BuildMaster-a və Işçi-a protokola uyğun olaraq 4000 portu vasitəsilə aparılır BuildBot-a, yəni 'pb' protokol.

Hədəf layihə tamamilə python dilində yazılmışdır. Vəzifə onun dəyişikliklərini izləmək, icra edilə bilən fayl yaratmaq, sənədlər yaratmaq və sınaqdan keçirməkdir. Uğursuzluq halında, bütün tərtibatçılar uğursuz bir hərəkət olduğu barədə poçta bir mesaj göndərməlidirlər.

veb ekranı BuildBot üçün 80 portuna qoşulacağıq layihə.host. Apatch tələb olunmur. Kitabxananın bir hissəsi kimi qıvrım artıq veb server var, BuildBot istifadə edir.

Daxili məlumatları saxlamaq üçün BuildBot использовать kvlit.

E-poçt siyahısına host lazımdır smtp.your.domain - poçtdan məktublar göndərməyə imkan verir [e-poçt qorunur] autentifikasiya olmadan. Həmçinin aparıcıda'smtp 1025-ci postda protokol dinlənilir.

Prosesdə iki nəfər iştirak edir: admin и istifadəçi. admin idarə edir BuildBot. istifadəçi edən şəxsdir törətmək-s.

Exacutable fayl vasitəsilə yaradılır pyinstaller. Sənədlər vasitəsilə yaradılır doksigen.

Bu memarlıq üçün bunu yazdım 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"
}

Əvvəlcə ehtiyacınız var yaratmaq BuildMaster-a və Işçi-a. Sonra bu faylı yapışdırın master.cfg в /ev/habr/usta.

Növbəti addım xidmətə başlamaqdır BuildMasteraa


sudo buildbot start /home/habr/master

Sonra xidmətə başlayın Işçi-a


buildbot-worker start /home/habr/worker

Hazır! İndi buildbot dəyişiklikləri izləyəcək və hərəkət edəcək törətmək-y in svnyuxarıda göstərilən arxitektura ilə layihənin qurma və sınaq addımlarını izləməklə.

Aşağıda yuxarıdakıların bəzi xüsusiyyətlərini təsvir edəcəyəm master.cfg.

6.1 Ustanıza gedən yolda.cfg


Mənim yazarkən master.cfg çoxlu səhvlər ediləcək, ona görə də log faylını oxumaq tələb olunacaq. kimi saxlanılır BuildMaster-ec mütləq yol /home/habr/master/twistd.log, və yan tərəfdə Işçi- mütləq yol ilə /home/habr/worker/twistd.log. Xətanı oxuduqca və onu düzəldən kimi, xidməti yenidən başlatmalı olacaqsınız BuildMaster-a. Bunun necə edildiyi belədir:


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

6.2 svn ilə işləmək


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)

Başlamaq üçün gəlin nəzər salaq svn_poller. Bu, hələ də eyni interfeysdir, müntəzəm olaraq dəqiqədə bir dəfə anbarda sorğu keçirir. Bu halda svn_poller yalnız filiala aiddir sandıq. Sirli parametr split_file=util.svn.split_file_alwaystrunk qaydaları təyin edir: qovluq strukturunu necə bölmək olar svn budaqlarda. Onlara nisbi yollar da təklif edir. Öz növbəsində split_file_alwaystrunk Yalnız depo olduğunu söyləyərək prosesi asanlaşdırır sandıq.

В Planlaşdırıcılar Göstərilmiş Filtr dəyişdirinkim görür heç kim və bir filialı onunla əlaqələndirir sandıq vasitəsilə müəyyən bir assosiasiya tərəfindən split_file_alwaystrunk. Dəyişikliklərə cavab verir sandıq, Başlayır qurucu adı ilə Sizin Layihəniz.

xassələri admin prosesin sahibi olaraq qurulma və sınaq nəticələrindən məktublar alması üçün burada lazımdır.

Addım qurmaq-a checkout repozitoriyanın yerli versiyasında olan istənilən faylı tam silə bilir Işçi-Ə. Və sonra tam edin svn yeniləmə. Parametr vasitəsilə rejim təyin olunur rejim = dolu, metod = təzə. Parametr haltOnTailure deyir ki, əgər svn yeniləmə xəta ilə yerinə yetiriləcək, sonra bütün quraşdırma və sınaq prosesi dayandırılmalıdır, çünki sonrakı hərəkətlərin mənası yoxdur.

6.3 Sizə məktub: reportyorlar xəbər vermək səlahiyyətinə malikdirlər


jurnalistlərə e-poçt bildiriş xidmətidir.


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]

Mesaj göndərə bilər fərqli yollar.

MailNotifier bildirişlər göndərmək üçün poçtdan istifadə edir.

şablon_html poçt üçün mətn şablonunu təyin edir. İşarələmə yaratmaq üçün HTML istifadə olunur. Motoru modifikasiya olunub jinja2 ( ilə müqayisə etmək olar django). BuildBot mesaj mətninin formalaşması zamanı dəyərləri şablonda əvəz olunan dəyişənlər dəstinə malikdir. Bu dəyişənlər {{ cüt qıvrımlı mötərizələr }} içərisindədir. Misal üçün, xülasə tamamlanmış əməliyyatların vəziyyətini, yəni müvəffəqiyyət və ya uğursuzluğu göstərir. A layihələr çıxaracaq Sizin Layihəniz. Beləliklə, idarəetmə əmrlərinin köməyi ilə jinja2, dəyişənlər BuildBot-a və python string formatlaşdırma alətləri ilə kifayət qədər məlumatlandırıcı mesaj yarada bilərsiniz.

MailNotifier aşağıdakı arqumentləri ehtiva edir.

fromaddr - poçtun hər kəsə göndəriləcəyi ünvan.

sendToInterestedUsers=True, sahibinə və istifadəçiyə mesaj göndərir törətmək.

Sistemi — poçt siyahısını qəbul edən istifadəçi adlarına əlavə ediləcək şəkilçi. Belə ki admin istifadəçinin ünvana göndərişi necə alacağı [e-poçt qorunur].

relayhost serverin açıq olduğu hostun adını müəyyən edir smtp, Bir smptPort dinləyən port nömrəsini təyin edir smtp server.

rejim = "xəbərdarlıq" deyir ki, poçt göndərişi yalnız ən azı bir addım olduqda edilməlidir qurmaq-a, statusun uğursuzluğu və ya xəbərdarlığı ilə başa çatdı. Müvəffəqiyyət halında, xəbər bülleteni göndərməyə ehtiyac yoxdur.

əlavə alıcılar sahibinə və poçt göndərişini həyata keçirən şəxsə əlavə olaraq göndərilməli olan şəxslərin siyahısını ehtiva edir. törətmək.

mesaj formatlayıcısı mesaj formatını, onun şablonunu və əldə edilə bilən dəyişənlər toplusunu təyin edən obyektdir jinja2. kimi seçimlər wantProperties=Doğrudur и wantSteps=Doğrudur mövcud dəyişənlərin bu dəstini təyin edin.

ilə['xidmətlər']=[sendMessageToAll] xidmətlərin siyahısını təqdim edir, onların arasında bizim də olacaq reportyor.

Biz bunu etdik! Təbrik edirik

Biz öz konfiqurasiyamızı yaratdıq və bunun funksionallığını gördük BuildBot. Bu, məncə, layihənizi yaratmaq üçün bu alətə ehtiyac olub olmadığını başa düşmək üçün kifayətdir. O səninlə maraqlanır? Sizin üçün faydalı olacaqmı? Onunla işləmək rahatdırmı? Onda bu yazını boşuna yazıram.

Və daha da. Peşəkar cəmiyyətin istifadə etməsini istərdim BuildBot, genişləndi, dərsliklər tərcümə edildi və daha çox nümunələr var idi.

Diqqətiniz üçün hamınıza təşəkkür edirəm. Uğurlar.

Mənbə: www.habr.com

Добавить комментарий