Contoh pelaksanaan Integrasi Berterusan menggunakan BuildBot

Contoh pelaksanaan Integrasi Berterusan menggunakan BuildBot
(Gambar oleh Komputerisasi dari Pixabay)

Hello!

Nama saya Evgeniy Cherkin, saya seorang pengaturcara dalam pasukan pembangunan di sebuah syarikat perlombongan Polimetri.

Apabila memulakan sebarang projek besar, anda mula berfikir: "Perisian apakah yang terbaik untuk digunakan untuk mengekalkannya?" Projek IT melalui beberapa peringkat sebelum mengeluarkan versi seterusnya. Ia bagus apabila rantaian peringkat ini diautomatikkan. Proses automatik untuk mengeluarkan versi baharu projek IT itu sendiri dipanggil Integrasi Berterusan. BuildBot ternyata menjadi pembantu yang baik kepada kami dalam melaksanakan proses ini.

Dalam artikel ini saya memutuskan untuk memberikan gambaran keseluruhan kemungkinan BuildBot. Apakah kemampuan perisian ini? Bagaimana untuk mendekatinya dan bagaimana untuk membina HUBUNGAN KERJA BERKESAN biasa dengannya? Anda boleh menggunakan pengalaman kami sendiri dengan mencipta perkhidmatan yang berfungsi untuk membina dan menguji projek anda pada mesin anda.

Содержание

Содержание

1. Mengapa BuildBot?
2. Konsep yang diketuai oleh BuildMaster
3. Pemasangan
4. Langkah pertama

5. Konfigurasi. Resipi langkah demi langkah

5.1 BuildmasterConfig
pekerja 5.2
5.3 tukar_sumber
5.4 penjadual

5.5 BuildFactory
5.6 pembina

6. Contoh konfigurasi anda sendiri

6.1 Dalam perjalanan ke tuan anda.cfg
6.2 Bekerjasama dengan svn
6.3 Surat kepada anda: pemberita diberi kuasa untuk mengisytiharkan

Kita berjaya! tahniah

1. Mengapa BuildBot?

Sebelum ini mengenai habr-e saya terjumpa artikel tentang pelaksanaan Integrasi Berterusan menggunakan BuildBot. Cth, Yang ini Saya mendapati ia paling bermaklumat. Terdapat satu lagi contoh - lebih mudah. Artikel-artikel ini boleh dibumbui contoh dari manualDan это selepas itu, dalam bahasa Inggeris. Coupe membuat titik permulaan yang baik. Selepas membaca artikel ini, anda mungkin akan segera mahukan sesuatu BuildBot untuk dilakukan.

Berhenti! Adakah sesiapa yang benar-benar menggunakannya dalam projek mereka? Ternyata ya banyak menerapkannya dalam tugas mereka. Boleh ditemui contoh menggunakan BuildBot dan dalam arkib kod Google.

Jadi apa logik orang menggunakan Buildbot? Lagipun, terdapat alat lain: CruiseControl и Jenkins. Saya akan jawab begini. Untuk kebanyakan tugas Jenkins dan kebenaran akan cukup. Pada gilirannya, BuildBot - lebih menyesuaikan diri, manakala masalah diselesaikan di sana semudah dalam Jenkins. Pilihan adalah milik anda. Tetapi memandangkan kami sedang mencari alat untuk membangunkan projek sasaran, mengapa tidak memilih satu yang akan membolehkan, bermula dari langkah mudah, untuk mendapatkan sistem binaan yang mempunyai interaktiviti dan antara muka yang unik.

Bagi mereka yang projek sasarannya ditulis dalam python, persoalan timbul: "Mengapa tidak memilih sistem integrasi yang mempunyai antara muka yang jelas dari segi bahasa yang digunakan dalam projek?" Dan kini tiba masanya untuk membentangkan faedah BuildBot.

Jadi, "kuartet instrumental" kami. Bagi saya sendiri, saya telah mengenal pasti empat ciri BuildBot:

  1. Ia adalah rangka kerja sumber terbuka di bawah lesen GPL
  2. Ini ialah penggunaan python sebagai alat konfigurasi dan perihalan tindakan yang diperlukan
  3. Ini adalah peluang untuk menerima maklum balas daripada mesin tempat pemasangan berlaku
  4. Ini, akhirnya, keperluan minimum untuk Hos. Deployment memerlukan python dan twisted, dan tidak memerlukan mesin maya dan mesin java.

2. Konsep yang diketuai oleh BuildMaster

Contoh pelaksanaan Integrasi Berterusan menggunakan BuildBot

Pusat kepada seni bina pengagihan tugas ialah BuildMaster. Ia adalah perkhidmatan yang:

  • menjejaki perubahan dalam pokok sumber projek
  • menghantar arahan yang harus dilaksanakan oleh perkhidmatan Pekerja untuk membina projek dan mengujinya
  • memberitahu pengguna tentang hasil tindakan yang diambil

BuildMaster dikonfigurasikan melalui fail tuan.cfg. Fail ini berada dalam akar BuildMaster. Nanti saya akan tunjukkan bagaimana root ini dicipta. Fail itu sendiri tuan.cfg mengandungi skrip python yang menggunakan panggilan BuildBot.

Objek paling penting seterusnya BuildBot Ia mempunyai nama yang pekerja. Perkhidmatan ini boleh dilancarkan pada hos lain dengan OS yang berbeza, atau mungkin pada satu di mana BuildMaster. Ia juga boleh wujud dalam persekitaran maya yang disediakan khas dengan pakej dan pembolehubahnya sendiri. Persekitaran maya ini boleh disediakan menggunakan utiliti python seperti virtualenv, venv.

BuildMaster menyiarkan arahan kepada semua orang pekerja-y, dan dia pula memenuhinya. Iaitu, ternyata proses membina dan menguji projek boleh diteruskan pekerja-e menjalankan Windows dan pada Pekerja lain yang menjalankan Linux.

Checkout kod sumber projek berlaku pada setiap pekerja-e.

3. Pemasangan

Jadi, mari kita pergi. Saya akan menggunakan Ubuntu 18.04 sebagai hos. Saya akan meletakkan satu di atasnya BuildMaster-a dan satu pekerja-a. Tetapi pertama-tama anda perlu memasang python3.7:

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

Bagi mereka yang memerlukan python3.7.2 dan bukannya 3.7.1, anda boleh melakukan perkara berikut:


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

Langkah seterusnya ialah memasang ditweet и BuildBot, serta pakej yang membolehkan anda menggunakan fungsi tambahan 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. Langkah pertama

Masa untuk mencipta BuildMaster. Ia akan berada dalam folder kami /home/habr/master.

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

Langkah seterusnya. Jom buat pekerja. Ia akan berada dalam folder kami /rumah/habr/pekerja.

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

Apabila anda berlari pekerja, maka secara lalai ia akan mencipta masuk /rumah/habr/pekerja folder dengan nama projek, yang dinyatakan dalam tuan.cfg. Dan dalam folder dengan nama projek ia akan membuat direktori membina, dan akan terus melakukannya checkout. Direktori kerja untuk pekerja-dan ia akan menjadi direktori /home/habr/yourProject/build.

"Kunci Emas
Dan sekarang apa yang saya tulis perenggan sebelumnya untuk: skrip yang Master akan menuntut daripada pekerja-dan dilakukan dari jauh dalam direktori ini tidak akan dilaksanakan kerana skrip tidak mempunyai kebenaran untuk dijalankan. Untuk membetulkan keadaan, anda memerlukan kunci --umask=0o22, yang melarang menulis ke direktori ini, tetapi akan mengekalkan hak pelancaran. Dan itu sahaja yang kita perlukan.

BuildMaster и pekerja mewujudkan hubungan antara satu sama lain. Ia berlaku bahawa ia terputus dan pekerja menunggu sedikit masa untuk maklum balas daripada BuildMaster-A. Jika tiada tindak balas, sambungan dimulakan semula. kunci --keepalive=60 hanya perlu menunjukkan masa selepas itu menyambung but semula.

5. Konfigurasi. Resipi langkah demi langkah

Konfigurasi BuildMaster dijalankan pada sisi mesin di mana kita melaksanakan arahan cipta-tuan. Dalam kes kami, ini ialah direktori /home/habr/master. Fail konfigurasi tuan.cfg belum wujud lagi, tetapi arahan itu sendiri telah mencipta fail master.cmg.sample. Anda perlu menamakan semula kepada master.cfg.sample в tuan.cfg

mv master.cfg.sample master.cfg

Jom buka yang ini tuan.cfg. Dan mari kita lihat apa yang terdiri daripadanya. Dan selepas itu, mari kita cuba membuat fail konfigurasi kita sendiri.

tuan.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 — kamus asas fail konfigurasi. Ia mesti disertakan dalam fail konfigurasi. Untuk kemudahan penggunaan, alias diperkenalkan dalam kod konfigurasi "c". Tajuk kunci в c["keyFromDist"] adalah elemen tetap untuk interaksi dengan BuildMaster. Untuk setiap kunci, objek yang sepadan digantikan sebagai nilai.

pekerja 5.2

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

Kali ini kami menunjukkan BuildMaster-y senarai pekerja-s. saya sendiri pekerja kita cipta atas, menunjukkan nama-pekerja anda и kata laluan. Sekarang mereka perlu dinyatakan sebaliknya pekerja contoh и lulus .

5.3 tukar_sumber

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

Dengan kunci tukar_sumber kamus c kami mendapat akses kepada senarai di mana kami ingin meletakkan objek yang mengundi repositori dengan kod sumber projek. Contoh menggunakan repositori Git yang ditinjau pada selang waktu tertentu.

Hujah pertama ialah laluan ke repositori anda.

workdir mewakili laluan ke folder di mana di sebelah pekerja-a relatif kepada laluan /home/habr/worker/yourProject/build git akan menyimpan versi tempatan repositori.

cawangan mengandungi cawangan tertentu dalam repositori yang harus diikuti.

pollInterval mengandungi bilangan saat selepas itu BuildMaster akan meninjau repositori untuk perubahan.

Terdapat beberapa kaedah untuk menjejaki perubahan pada repositori projek.

Kaedah yang paling mudah ialah Polling, yang membayangkan bahawa BuildMaster secara berkala mengundi pelayan dengan repositori. Jika melakukan mencerminkan perubahan dalam repositori, kemudian BuildMaster akan mencipta objek dalaman dengan sedikit kelewatan Tukar dan hantar kepada pengendali acara Berjadual, yang akan melancarkan langkah untuk membina dan menguji projek pada pekerja-e. Antara langkah-langkah ini akan ditunjukkan maklumat repositori. Tepat pada pekerjaIni akan membuat salinan tempatan repositori. Butiran proses ini akan dibincangkan di bawah dalam dua bahagian seterusnya. (5.4 и 5.5).

Kaedah yang lebih elegan untuk menjejaki perubahan kepada repositori ialah menghantar mesej terus daripada pelayan yang mengehosnya BuildMaster- tentang menukar kod sumber projek. Dalam kes ini, sebaik sahaja pemaju membuat melakukan, pelayan dengan repositori projek akan menghantar mesej BuildMaster-y. Dan dia pula akan memintasnya dengan mencipta objek PBCchangeSource. Seterusnya, objek ini akan dipindahkan ke Berjadual, yang mengaktifkan langkah-langkah untuk membina projek dan mengujinya. Bahagian penting kaedah ini adalah bekerja dengan cangkuk-skrip pelayan dalam repositori. Dalam skrip cangkuk-a, bertanggungjawab untuk memproses tindakan apabila melakukan-e, anda perlu menghubungi utiliti hantar tukar dan nyatakan alamat rangkaian BuildMaster-A. Anda juga perlu menentukan port rangkaian yang akan mendengar PBCchangeSource. PBCchangeSource, by the way, adalah sebahagian BuildMaster-A. Kaedah ini memerlukan kebenaran admin-a pada pelayan tempat repositori projek terletak. Anda perlu membuat sandaran repositori terlebih dahulu.

5.4 penjadual


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

penjadual – ini adalah elemen yang bertindak sebagai pencetus yang memulakan keseluruhan rantaian pemasangan dan ujian projek.
Contoh pelaksanaan Integrasi Berterusan menggunakan BuildBot

Perubahan itu yang direkodkan tukar_sumber, berubah dalam proses kerja BuildBot-a untuk membantah Tukar dan kini setiap Sheduler berdasarkan mereka, ia membina permintaan untuk memulakan proses pembinaan projek. Walau bagaimanapun, ia juga menentukan apabila permintaan ini dipindahkan lebih jauh ke baris gilir. Sebuah objek Pembina menyimpan baris gilir permintaan dan menjejaki keadaan pemasangan semasa secara berasingan pekerja-e. Pembina wujud pada BuildMaster-e dan seterusnya pekerja-e. Dia menghantar dengan BuildMaster-a pada pekerja-dan sudah spesifik membina - satu siri langkah yang mesti diikuti.
Kami melihat bahawa dalam contoh semasa seperti itu penjadual 2 keping dicipta. Lebih-lebih lagi, masing-masing mempunyai jenisnya sendiri.

Penjadual Cawangan Tunggal – salah satu kelas yang paling popular dalam jadual. Ia menonton satu cawangan dan dicetuskan oleh perubahan yang direkodkan di dalamnya. Apabila dia melihat perubahan, dia boleh menangguhkan penghantaran permintaan binaan (menangguhkan tempoh yang dinyatakan dalam parameter khas treeStableTimer) In nama menetapkan nama jadual yang akan dipaparkan dalam BuildBot-antara muka web. DALAM ChangeFilter penapis ditetapkan, selepas lulus perubahan mana dalam cawangan menggesa jadual untuk menghantar permintaan untuk pembinaan. DALAM Nama pembina nama ditunjukkan pembina-a, yang akan kita tetapkan sedikit kemudian. Nama dalam kes kami akan sama dengan nama projek: Projek anda.

ForceScheduler satu perkara yang sangat mudah. Jadual jenis ini dicetuskan oleh klik tetikus BuildBot-antara muka web. Parameter mempunyai intipati yang sama seperti dalam Penjadual Cawangan Tunggal.

PS No. 3. Mungkin ia akan berguna
Berkala ialah jadual yang berjalan pada frekuensi tetap masa tertentu. Panggilan kelihatan seperti ini


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

5.5 BuildFactory


factory = util.BuildFactory()
                        
factory.addStep(steps.Git(repourl='git://github.com/buildbot/hello-world.git', mode='incremental'))
factory.addStep(steps.ShellCommand(command=["trial", "hello"],
                                   env={"PYTHONPATH": "."}))

periodicBuildTimer menentukan masa berkala ini dalam saat.

BuildFactory mencipta sesuatu yang khusus membina, yang kemudiannya pembina menghantar kepada pekerja. В BuildFactory menunjukkan langkah-langkah yang perlu diikuti pekerja-y. Langkah ditambah dengan memanggil kaedah addStep

Langkah tambahan pertama dalam contoh ini ialah git clean -d -f -f –xkemudian git checkout. Tindakan ini termasuk dalam parameter kaedah, yang tidak dinyatakan dengan jelas tetapi membayangkan nilai lalai segar. Parameter mod='incremental' menunjukkan bahawa fail adalah dari direktori di mana fail chechout, semasa hilang dari repositori, kekal tidak disentuh.

Langkah tambahan kedua ialah memanggil skrip percubaan dengan parameter hello di sebelah pekerja-a daripada direktori /home/habr/worker/yourProject/build dengan pembolehubah persekitaran PATHONPATH=... Oleh itu, anda boleh menulis skrip anda sendiri dan melaksanakannya di sebelah pekerja-setiap langkah util.ShellCommand. Skrip ini boleh diletakkan terus ke dalam repositori. Kemudian pada chechout-e mereka akan jatuh ke dalam /home/habr/worker/yourProject/build. Walau bagaimanapun, terdapat dua "tetapi":

  1. pekerja mesti dibuat dengan kunci --umask supaya ia tidak menyekat hak pelaksanaan selepas checkout-The.
  2. pada tolak git-e daripada skrip ini anda perlu menentukan harta boleh dilaksanakansupaya nanti chechout-e tidak kehilangan hak untuk melaksanakan skrip Git.

5.6 pembina


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

Tentang apa Pembina telah diberitahu di sini. Sekarang saya akan memberitahu anda dengan lebih terperinci tentang cara menciptanya. BuilderConfig ialah pembina pembina. Pereka sedemikian dalam c['pembina'] anda boleh menentukan beberapa, kerana ini adalah helaian objek pembina taip. Sekarang mari kita tulis semula contoh dari BuildBot, membawanya lebih dekat dengan tugas kita.


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

Sekarang saya akan memberitahu anda tentang parameter BuilderConfig.

nama menyatakan nama pembina-a. Di sini kami menamakannya Projek anda... Ini bermakna bahawa pada pekerja- laluan ini akan dibuat /home/habr/worker/yourProject/build. Sheduler mencari pembina hanya dengan nama ini.

nama pekerja mengandungi lembaran pekerja-s. Setiap satunya mesti ditambah c['pekerja'].

kilang - khusus membina, yang dikaitkan dengannya pembina. Dia akan menghantar objek itu membina pada pekerja untuk melengkapkan semua langkah yang disertakan dalam ini membina-The.

6. Contoh konfigurasi anda sendiri

Berikut adalah contoh seni bina projek yang saya cadangkan untuk dilaksanakan melalui BuildBot
.

Kami akan gunakan sebagai sistem kawalan versi svn. Repositori itu sendiri akan terletak dalam beberapa jenis awan. Berikut ialah alamat awan ini svn.host/svn/yourProject/trunk. Dalam awan di bawah svn terdapat nama pengguna akaun: pengguna, passwd: kata laluan. Skrip yang mewakili langkah membina-a juga akan berada di cawangan svn, dalam folder berasingan buildbot/worker_linux. Skrip ini terletak dalam repositori dengan harta yang disimpan boleh dilaksanakan.

BuildMaster и pekerja dijalankan pada hos yang sama projek.tuan rumah .BuildMaster menyimpan failnya dalam folder /home/habr/master. pekerja ia disimpan dalam laluan berikut /rumah/habr/pekerja. Proses komunikasi BuildMaster-a dan pekerja-a dijalankan melalui port 4000 mengikut protokol BuildBot-a, iaitu 'pb' protokol.

Projek sasaran ditulis sepenuhnya dalam Python. Tugasnya adalah untuk menjejaki perubahannya, mencipta fail boleh laku, menjana dokumentasi dan menjalankan ujian. Sekiranya berlaku kegagalan, semua pembangun perlu menghantar mesej melalui e-mel yang menyatakan bahawa terdapat tindakan yang tidak berjaya.

Paparan web BuildBot kami akan menyambung ke port 80 untuk projek.tuan rumah. Ia tidak perlu memasang Apatch. Sebagai sebahagian daripada perpustakaan berpintal sudah ada pelayan web, BuildBot menggunakannya.

Untuk menyimpan maklumat dalaman untuk BuildBot kami akan gunakan sqlite.

Hos diperlukan untuk mel smtp.domain.anda - ia membenarkan penghantaran surat dari mel [e-mel dilindungi] tanpa pengesahan. Juga pada tuan rumah 'smtp ' Minit sedang didengar di pos 1025.

Terdapat dua orang yang terlibat dalam proses ini: admin и pengguna. pentadbir mentadbir BuildBot. pengguna adalah orang yang melakukan melakukan-s.

Fail boleh laksana dijana melalui pemasang py. Dokumentasi dijana melalui doksigen.

Untuk seni bina ini saya menulis ini: tuan.cfg:

tuan.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"
}

Mula-mula anda perlukan untuk mencipta BuildMaster-a dan pekerja-a. Kemudian tampal fail ini tuan.cfg в /home/habr/master.

Langkah seterusnya ialah memulakan perkhidmatan BuildMaster-a


sudo buildbot start /home/habr/master

Kemudian mulakan perkhidmatan pekerja-a


buildbot-worker start /home/habr/worker

sedia! Sekarang Buildbot akan menjejaki perubahan dan mencetuskan melakukan-y masuk svn, melaksanakan langkah membina dan menguji projek dengan seni bina di atas.

Di bawah saya akan menerangkan beberapa ciri di atas tuan.cfg.

6.1 Dalam perjalanan ke tuan anda.cfg


Semasa menulis saya tuan.cfg Banyak ralat akan dibuat, jadi membaca fail log akan diperlukan. Ia disimpan sebagai BuildMaster-ec laluan mutlak /home/habr/master/twistd.log, dan di sebelah pekerja-a dengan laluan mutlak /home/habr/worker/twistd.log. Semasa anda membaca ralat dan membetulkannya, anda perlu memulakan semula perkhidmatan BuildMaster-a. Begini caranya:


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

6.2 Bekerjasama dengan 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)

Pertama, mari kita lihat svn_poller. Ini masih antara muka yang sama, selalu mengundi repositori sekali seminit. Dalam kes ini svn_poller hanya mengakses cawangan batang. Parameter misteri split_file=util.svn.split_file_alwaystrunk menetapkan peraturan: bagaimana untuk memecahkan struktur folder svn pada dahan. Dia juga menawarkan mereka laluan relatif. Pada gilirannya split_file_alwaystrunk memudahkan proses dengan mengatakan bahawa repositori hanya mengandungi batang.

В Penjadual ditunjukkan ChangeFiltersiapa nampak Tiada dan mengaitkan cawangan dengannya batang mengikut persatuan yang diberikan melalui split_file_alwaystrunk. Bertindak balas terhadap perubahan dalam batang, Dilancarkan pembina dengan nama Projek anda.

hartanah di sini ia diperlukan supaya pentadbir menerima senarai mel hasil binaan dan ujian sebagai pemilik proses.

Langkah membina-a checkout mampu memadam sepenuhnya mana-mana fail yang terdapat dalam versi tempatan repositori pekerja-A. Dan kemudian lakukan sepenuhnya kemas kini svn. Mod dikonfigurasikan melalui parameter mod=penuh, kaedah=segar. Parameter haltOnTailure mengatakan bahawa jika kemas kini svn akan dilaksanakan dengan ralat, maka keseluruhan proses pembinaan dan ujian harus digantung, kerana tindakan selanjutnya tidak masuk akal.

6.3 Surat kepada anda: pemberita diberi kuasa untuk mengisytiharkan


pemberita ialah perkhidmatan untuk menghantar pemberitahuan melalui e-mel.


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]

Dia boleh menghantar mesej cara yang berbeza.

MailNotifier menggunakan e-mel untuk menghantar pemberitahuan.

template_html menetapkan templat teks untuk surat berita. HTML digunakan untuk membuat markup. Ia diubah suai oleh enjin jinja2 (boleh dibandingkan dengan django). BuildBot mempunyai satu set pembolehubah yang nilainya digantikan ke dalam templat semasa proses menjana teks mesej. Pembolehubah ini disertakan dalam {{ pendakap kerinting berganda }}. Sebagai contoh, ringkasan memaparkan status operasi selesai, iaitu kejayaan atau kegagalan. A projek-projek akan keluaran Projek anda. Jadi, menggunakan arahan kawalan dalam jinja2, pembolehubah BuildBot-a dan alat pemformatan rentetan python, anda boleh mencipta mesej yang cukup bermaklumat.

MailNotifier mengandungi hujah-hujah berikut.

fromaddr – alamat dari mana semua orang akan menerima surat berita.

sendToInterestedUsers=True menghantar mesej kepada pemilik dan pengguna yang membuat melakukan.

pencarian — akhiran yang mesti ditambahkan pada nama pengguna yang menerima surat berita. Jadi admin bagaimana pengguna akan menerima surat berita di alamat [e-mel dilindungi].

relayhost menentukan nama hos di mana pelayan dibuka smtp, smtPort menentukan nombor port yang mendengar smtp pelayan.

mod="amaran" mengatakan bahawa penghantaran mel hanya perlu dilakukan jika terdapat sekurang-kurangnya satu langkah membina-a, yang berakhir dengan kegagalan status atau amaran. Dalam kes kejayaan, tidak perlu menghantar surat berita.

Penerima tambahan mengandungi senarai orang yang kepadanya surat itu harus dihantar sebagai tambahan kepada pemilik dan orang yang menjalankan melakukan.

messageFormatter ialah objek yang menentukan format mesej, templatnya dan satu set pembolehubah yang tersedia daripada jinja2. Pilihan seperti wantProperties=Benar и wantSteps=Benar tentukan set pembolehubah yang tersedia ini.

dengan['services']=[sendMessageToAll] menyediakan senarai perkhidmatan, antaranya perkhidmatan kami wartawan.

Kita berjaya! tahniah

Kami mencipta konfigurasi kami sendiri dan melihat kefungsian yang mampu dilakukannya. BuildBot. Ini, saya fikir, sudah cukup untuk memahami sama ada alat ini diperlukan untuk mencipta projek anda. Adakah anda berminat dengannya? Adakah ia berguna kepada anda? Adakah dia selesa untuk bekerja? Maka saya tidak menulis artikel ini dengan sia-sia.

Dan seterusnya. Saya ingin komuniti profesional menggunakan BuildBot, menjadi lebih luas, manual telah diterjemahkan, dan terdapat lebih banyak contoh.

Terima kasih atas perhatian anda semua. Semoga berjaya.

Sumber: www.habr.com

Tambah komen