Contoh implementasi Continuous Integration dengan BuildBot

Contoh implementasi Continuous Integration dengan BuildBot
(Gambar oleh Komputerisasi dari pixabay)

Hi!

Nama saya adalah Evgeniy Cherkin, Saya seorang programmer di tim pengembangan di sebuah perusahaan pertambangan Polimetal.

Saat memulai proyek besar apa pun, Anda mulai berpikir: “Perangkat lunak apa yang terbaik untuk digunakan untuk melayaninya?” Sebuah proyek TI melewati sejumlah tahapan sebelum merilis versi berikutnya. Ada baiknya bila rangkaian tahapan ini diotomatisasi. Proses otomatis untuk merilis versi baru dari proyek TI itu sendiri disebut Integrasi berkelanjutan. MembangunBot ternyata menjadi asisten yang baik bagi kami dalam mengimplementasikan proses ini.

Pada artikel ini saya memutuskan untuk memberikan gambaran umum tentang kemungkinannya MembangunBot. Apa kemampuan perangkat lunak ini? Bagaimana cara mendekatinya dan bagaimana membangun HUBUNGAN KERJA EFEKTIF yang normal dengannya? Anda dapat menerapkan sendiri pengalaman kami dengan membuat layanan yang berfungsi untuk membangun dan menguji proyek Anda di mesin Anda.

kadar

kadar

1. Mengapa BuildBot?
2. Konsep dipimpin oleh BuildMaster
3. Instalasi
4. Langkah pertama

5. Konfigurasi. Resep langkah demi langkah

5.1 Konfigurasi Buildmaster
Pekerja 5.2
5.3 ubah_sumber
5.4 penjadwal

5.5 Pabrik Pembuatan
5.6 pembangun

6. Contoh konfigurasi Anda sendiri

6.1 Dalam perjalanan ke master.cfg Anda
6.2 Bekerja dengan svn
6.3 Surat kepada Anda: wartawan berwenang menyatakan

Kita berhasil! Selamat

1. Mengapa BuildBot?

Sebelumnya di habr-e saya menemukan artikel tentang implementasi Integrasi berkelanjutan menggunakan MembangunBot. Misalnya, Yang ini Menurut saya ini yang paling informatif. Ada contoh lain - lebih sederhana. Artikel-artikel ini bisa dibumbui contoh dari manualDan ini setelah itu, dalam bahasa Inggris. Mobil coupe ini menjadi titik awal yang baik. Setelah membaca artikel ini, Anda mungkin langsung menginginkan sesuatu MembangunBot melakukan.

Berhenti! Adakah yang benar-benar menggunakannya dalam proyek mereka? Ternyata ya banyak menerapkannya dalam tugas mereka. Dapat ditemukan contoh menggunakan MembangunBot dan di arsip kode Google.

Lalu apa logika orang yang menggunakannya membangunbot? Lagi pula, ada alat lain: Kontrol Pelayaran и Jenkins. Saya akan menjawab seperti ini. Untuk sebagian besar tugas Jenkins dan kebenaran saja sudah cukup. Pada gilirannya, MembangunBot - lebih adaptif, sementara masalah diselesaikan di sana sesederhana di Jenkins. Pilihan ada padamu. Namun karena kita sedang mencari alat untuk proyek target yang sedang berkembang, mengapa tidak memilih alat yang memungkinkan, mulai dari langkah sederhana, untuk mendapatkan sistem pembangunan yang memiliki interaktivitas dan antarmuka yang unik.

Bagi mereka yang proyek targetnya ditulis dengan python, muncul pertanyaan: “Mengapa tidak memilih sistem integrasi yang memiliki antarmuka yang jelas dalam hal bahasa yang digunakan dalam proyek?” Dan sekarang saatnya menyajikan manfaatnya MembangunBot.

Jadi, “kuartet instrumental” kami. Bagi saya sendiri, saya telah mengidentifikasi empat fitur MembangunBot:

  1. Ini adalah kerangka kerja sumber terbuka di bawah lisensi GPL
  2. Ini adalah penggunaan python sebagai alat konfigurasi dan deskripsi tindakan yang diperlukan
  3. Ini adalah kesempatan untuk menerima respons dari mesin tempat perakitan dilakukan
  4. Ini, yang terakhir, adalah persyaratan minimum untuk seorang Host. Penerapan memerlukan python dan twisted, dan tidak memerlukan mesin virtual dan mesin java.

2. Konsep dipimpin oleh BuildMaster

Contoh implementasi Continuous Integration dengan BuildBot

Inti dari arsitektur distribusi tugas adalah BuildMaster. Ini adalah layanan yang:

  • melacak perubahan pada pohon sumber proyek
  • mengirim perintah yang harus dijalankan oleh layanan Pekerja untuk membangun proyek dan mengujinya
  • memberitahu pengguna tentang hasil tindakan yang diambil

BuildMaster dikonfigurasi melalui file master.cfg. File ini ada di root BuildMaster. Nanti saya akan menunjukkan bagaimana root ini dibuat. File itu sendiri master.cfg berisi skrip python yang menggunakan panggilan MembangunBot.

Objek terpenting berikutnya MembangunBot Memiliki nama Pekerja. Layanan ini dapat diluncurkan di host lain dengan OS berbeda, atau mungkin di host lain BuildMaster. Itu juga bisa ada di lingkungan virtual yang disiapkan khusus dengan paket dan variabelnya sendiri. Lingkungan virtual ini dapat disiapkan menggunakan utilitas python seperti virtualenv, venv.

BuildMaster menyiarkan perintah kepada semua orang Pekerja-y, dan dia, pada gilirannya, memenuhinya. Artinya, ternyata proses pembangunan dan pengujian suatu proyek bisa berjalan Pekerja-e menjalankan Windows dan Pekerja lain yang menjalankan Linux.

Periksa kode sumber proyek terjadi pada masing-masing Pekerja-e.

3. Instalasi

Jadi ayo pergi. Saya akan menggunakan Ubuntu 18.04 sebagai hostnya. Saya akan menempatkan satu di atasnya BuildMaster-a dan satu Pekerja-A. Tapi pertama-tama Anda perlu menginstal python3.7:

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

Bagi yang membutuhkan python3.7.2 daripada 3.7.1, Anda dapat melakukan hal 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 selanjutnya adalah menginstal menge-tweet и MembangunBot, serta paket yang memungkinkan Anda menggunakan fungsionalitas tambahan MembangunBot-Sebuah.


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

Saatnya berkreasi BuildMaster. Itu akan ada di folder kami /home/habr/master.

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

Langkah berikutnya. Ayo berkreasi Pekerja. Itu akan ada di folder kami /home/habr/worker.

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

Saat kamu berlari Pekerja, maka secara default akan dibuat /home/habr/worker folder dengan nama proyek, yang ditentukan dalam master.cfg. Dan di folder dengan nama proyek itu akan dibuat direktori membangun, dan akan terus melakukannya pemeriksaan. Direktori kerja untuk Pekerja-dan itu akan menjadi direktori /home/habr/Proyek Anda/build.

"Kunci emas
Dan sekarang untuk apa saya menulis paragraf sebelumnya: skrip itu Menguasai akan menuntut dari Pekerja-dan dilakukan secara jarak jauh di direktori ini tidak akan dieksekusi karena skrip tidak memiliki hak untuk dijalankan. Untuk memperbaiki situasi ini, Anda memerlukan kunci --umask=0o22, yang melarang penulisan ke direktori ini, tetapi akan tetap mempertahankan hak peluncuran. Dan hanya itu yang kami butuhkan.

BuildMaster и Pekerja menjalin hubungan satu sama lain. Kebetulan itu putus dan Pekerja menunggu beberapa saat untuk mendapat jawaban dari BuildMaster-A. Jika tidak ada respons, koneksi dimulai ulang. Kunci --keepalive=60 hanya perlu menunjukkan waktu setelahnya menghubungkan reboot.

5. Konfigurasi. Resep langkah demi langkah

Konfigurasi BuildMaster dilakukan di sisi mesin tempat kami menjalankan perintah buat-master. Dalam kasus kami, ini adalah direktori /home/habr/master. Berkas konfigurasi master.cfg belum ada, tetapi perintahnya sendiri sudah membuat file master.cmg.sampel. Anda perlu mengganti namanya menjadi master.cfg.sampel в master.cfg

mv master.cfg.sample master.cfg

Mari kita buka yang ini master.cfg. Dan mari kita lihat apa isinya. Dan setelah itu mari kita coba membuat file konfigurasi kita sendiri.

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

c = BuildmasterConfig = {} 

Konfigurasi Buildmaster — kamus dasar file konfigurasi. Itu harus disertakan dalam file konfigurasi. Untuk kemudahan penggunaan, alias diperkenalkan dalam kode konfigurasi "c"... Nama kunci в c["kunciDariDist"] adalah elemen tetap untuk berinteraksi BuildMaster. Untuk setiap kunci, objek terkait diganti sebagai nilai.

Pekerja 5.2

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

Kali ini kami tunjukkan BuildMaster-y daftar Pekerja-S. Saya sendiri Pekerja kami membuat atas, menunjukkan kamu-nama-pekerja и kata sandi. Sekarang mereka perlu ditentukan sebagai gantinya pekerja contoh и lulus .

5.3 ubah_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 ubah_sumber kamus c kita mendapatkan akses ke daftar tempat kita ingin meletakkan objek yang melakukan polling pada repositori dengan kode sumber proyek. Contohnya menggunakan repositori Git yang disurvei pada interval tertentu.

Argumen pertama adalah jalur ke repositori Anda.

direktur kerja mewakili jalur ke folder di sampingnya Pekerja-a relatif terhadap jalan /home/habr/worker/yourProject/build git akan menyimpan versi lokal dari repositori.

cabang berisi cabang tertentu dalam repositori yang harus diikuti.

Interval jajak pendapat berisi jumlah detik setelahnya BuildMaster akan melakukan polling pada repositori untuk mengetahui perubahan.

Ada beberapa metode untuk melacak perubahan pada repositori proyek.

Cara paling sederhana adalah Polling, yang menyiratkan bahwa BuildMaster secara berkala melakukan polling server dengan repositori. Jika melakukan mencerminkan perubahan dalam repositori, lalu BuildMaster akan membuat objek internal dengan beberapa penundaan Perubahan dan mengirimkannya ke pengendali acara Penjadwal, yang akan meluncurkan langkah-langkah untuk membangun dan menguji proyek Pekerja-e. Diantara langkah-langkah ini akan ditunjukkan memperbarui gudang. Tepatnya PekerjaIni akan membuat salinan lokal dari repositori. Rincian proses ini akan dibahas di bawah dalam dua bagian berikutnya. (5.4 и 5.5).

Metode yang lebih elegan untuk melacak perubahan pada repositori adalah dengan mengirim pesan langsung dari server yang menampungnya BuildMaster- tentang mengubah kode sumber proyek. Dalam hal ini, segera setelah pengembang membuat melakukan, server dengan repositori proyek akan mengirimkan pesan BuildMaster-y. Dan dia, pada gilirannya, akan mencegatnya dengan membuat sebuah objek Sumber Perubahan PBC. Selanjutnya, objek ini akan ditransfer ke Penjadwal, yang mengaktifkan langkah-langkah untuk membangun proyek dan mengujinya. Bagian penting dari metode ini adalah bekerja dengan kait-skrip server di repositori. Dalam naskah kait-a, bertanggung jawab untuk memproses tindakan ketika melakukan-e, Anda perlu memanggil utilitas kirim perubahan dan tentukan alamat jaringan BuildMaster-A. Anda juga perlu menentukan port jaringan yang akan mendengarkan Sumber Perubahan PBC. Sumber Perubahan PBC, omong-omong, adalah bagian BuildMaster-A. Metode ini memerlukan izin admin-a di server tempat repositori proyek berada. Anda harus membuat cadangan repositori terlebih dahulu.

5.4 penjadwal


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

penjadwal – ini adalah elemen yang bertindak sebagai pemicu yang memulai seluruh rantai perakitan dan pengujian proyek.
Contoh implementasi Continuous Integration dengan BuildBot

Perubahan-perubahan yang dicatat ubah_sumber, diubah dalam proses kerja MembangunBot-a untuk menolak Perubahan dan sekarang setiap Penjadwal berdasarkan mereka, ia membuat permintaan untuk memulai proses pembangunan proyek. Namun, hal ini juga menentukan kapan permintaan ini ditransfer lebih jauh ke antrean. Sebuah Objek Pembangun menyimpan antrian permintaan dan melacak status rakitan saat ini secara terpisah Pekerja-dan. Pembangun ada pada BuildMaster-e dan seterusnya Pekerja-e. Dia mengirim dengan BuildMaster-a aktif Pekerja-dan sudah spesifik membangun - serangkaian langkah yang harus diikuti.
Kita melihat bahwa dalam contoh saat ini adalah sebagai berikut penjadwal 2 buah dibuat. Apalagi masing-masing punya tipenya masing-masing.

Penjadwal Cabang Tunggal – salah satu kelas paling populer dalam jadwal. Ia mengawasi satu cabang dan dipicu oleh perubahan yang tercatat di dalamnya. Ketika dia melihat perubahan, dia dapat menunda pengiriman permintaan build (tunda untuk jangka waktu yang ditentukan dalam parameter khusus treeStableTimer) Masuk nama mengatur nama jadwal yang akan ditampilkan MembangunBot-antarmuka web. DI DALAM UbahFilter filter disetel, setelah melewati perubahan mana di cabang yang meminta jadwal untuk mengirim permintaan konstruksi. DI DALAM nama pembangun nama ditunjukkan pembangun-a, yang akan kita atur nanti. Nama dalam kasus kami akan sama dengan nama proyek: Proyek Anda.

Penjadwal Angkatan suatu hal yang sangat sederhana. Jenis jadwal ini dipicu oleh klik mouse MembangunBot-antarmuka web. Parameternya memiliki esensi yang sama seperti pada Penjadwal Cabang Tunggal.

PS No.3. Mungkin itu akan berguna
Berkala adalah jadwal yang berjalan pada frekuensi waktu tertentu yang tetap. Panggilannya terlihat seperti ini


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

5.5 Pabrik Pembuatan


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

periodikBuildTimer menentukan waktu periodisitas ini dalam hitungan detik.

Pabrik Bangun menciptakan yang spesifik membangun, yang kemudian pembangun mengirim ke Pekerja. Di Pabrik Bangun menunjukkan langkah-langkah yang harus diikuti Pekerja-y. Langkah-langkah ditambahkan dengan memanggil metode tersebut tambahkanLangkah

Langkah tambahan pertama dalam contoh ini adalah git bersih -d -f -f –x, lalu pembayaran git. Tindakan ini termasuk dalam parameter metode, yang tidak dinyatakan dengan jelas tetapi menyiratkan nilai default segar. Parameter mode='tambahan' menunjukkan bahwa file tersebut berasal dari direktori tempat chechout, meskipun hilang dari repositori, tetap tidak tersentuh.

Langkah tambahan kedua adalah memanggil skrip percobaan dengan parameter halo di sisi Pekerja-a dari direktori /home/habr/worker/yourProject/build dengan variabel lingkungan PATHONPATH=... Jadi, Anda dapat menulis skrip Anda sendiri dan menjalankannya di samping Pekerja-a setiap langkah util.ShellCommand. Skrip ini dapat ditempatkan langsung ke dalam repositori. Lalu di chechout-e mereka akan jatuh ke dalamnya /home/habr/worker/yourProject/build. Namun, ada dua “tetapi”:

  1. Pekerja harus dibuat dengan kunci --umask sehingga tidak menghalangi hak eksekusi setelahnya pemeriksaan-Sebuah.
  2. Di git push-e dari skrip ini Anda perlu menentukan propertinya dapat dieksekusiagar nanti chechout-e tidak kehilangan hak untuk menjalankan skrip Git.

5.6 pembangun


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

Tentang apa itu Pembangun diberitahu di sini. Sekarang saya akan memberi tahu Anda lebih detail tentang cara membuatnya. Konfigurasi Pembangun adalah konstruktor pembangun. Desainer seperti itu masuk c['pembangun'] Anda dapat menentukan beberapa, karena ini adalah lembar objek pembangun jenis. Sekarang mari kita menulis ulang contoh dari MembangunBot, membawanya lebih dekat ke tugas kita.


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

Sekarang saya akan memberi tahu Anda tentang parameternya Konfigurasi Pembangun.

nama menentukan namanya pembangun-A. Di sini kami menamakannya Proyek Anda. Artinya aktif Pekerja- jalan ini akan tercipta /home/habr/worker/yourProject/build. Penjadwal mencari pembangun hanya dengan nama ini.

nama pekerja berisi lembar Pekerja-S. Masing-masing harus ditambahkan c['pekerja'].

pabrik - spesifik membangun, yang terkait dengannya pembangun. Dia akan mengirimkan benda itu membangun pada Pekerja untuk menyelesaikan semua langkah yang termasuk dalam ini membangun-Sebuah.

6. Contoh konfigurasi Anda sendiri

Berikut adalah contoh arsitektur proyek yang saya usulkan untuk diimplementasikan MembangunBot
.

Kami akan menggunakan sebagai sistem kontrol versi svn. Repositori itu sendiri akan ditempatkan di semacam cloud. Ini alamat cloud ini svn.host/svn/Proyek Anda/trunk. Di awan di bawahnya svn ada nama pengguna akun: pemakai, kata sandi: kata sandi. Skrip yang mewakili langkah-langkah membangun-a juga akan berada di cabang svn, dalam folder terpisah buildbot/worker_linux. Skrip ini terletak di repositori dengan properti tersimpan executable.

BuildMaster и Pekerja dijalankan pada host yang sama proyek.host .BuildMaster menyimpan file-filenya dalam sebuah folder /home/habr/master. Pekerja itu disimpan di jalur berikut /home/habr/worker. Proses komunikasi BuildMaster-a dan Pekerja-a dilakukan melalui port 4000 sesuai protokol MembangunBot-a, itu 'pb' protokol.

Proyek target seluruhnya ditulis dengan Python. Tugasnya adalah melacak perubahannya, membuat file yang dapat dieksekusi, menghasilkan dokumentasi, dan melakukan pengujian. Jika terjadi kegagalan, semua pengembang perlu mengirim pesan melalui email yang menyatakan bahwa ada tindakan yang gagal.

tampilan web MembangunBot kami akan terhubung ke port 80 untuk proyek.host. Tidak perlu menginstal Apache. Sebagai bagian dari perpustakaan pair sudah ada server web, MembangunBot menggunakannya.

Untuk menyimpan informasi internal untuk MembangunBot ем ользовать sqlite.

Host diperlukan untuk pengiriman surat smtp.domainmu - memungkinkan pengiriman surat dari surat [email dilindungi] tanpa otentikasi. Juga di tuan rumah 'smtp ' Berita acaranya didengarkan di pos 1025.

Ada dua orang yang terlibat dalam proses ini: admin и pemakai. admin mengelola MembangunBot. pengguna adalah orang yang melakukan melakukan-S.

File yang dapat dieksekusi dihasilkan melalui penginstal py. Dokumentasi dihasilkan melalui doksigen.

Untuk arsitektur ini saya menulis ini: 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"
}

Pertama yang kamu butuhkan untuk membuat BuildMaster-a dan Pekerja-A. Kemudian tempel file ini master.cfg в /home/habr/master.

Langkah selanjutnya adalah memulai layanan BuildMastera


sudo buildbot start /home/habr/master

Kemudian mulai layanan Pekerja-a


buildbot-worker start /home/habr/worker

Siap! Sekarang membangunbot akan melacak perubahan dan memicu melakukan-y masuk svn, melakukan langkah-langkah membangun dan menguji proyek dengan arsitektur di atas.

Di bawah ini saya akan menjelaskan beberapa fitur di atas master.cfg.

6.1 Dalam perjalanan ke master.cfg Anda


Saat menulis milikku master.cfg Banyak kesalahan yang akan terjadi, sehingga diperlukan pembacaan file log. Itu disimpan sebagai BuildMaster-ec jalur absolut /home/habr/master/twistd.log, dan di samping Pekerja-a dengan jalur absolut /home/habr/worker/twistd.log. Saat Anda membaca kesalahan dan memperbaikinya, Anda perlu memulai ulang layanan BuildMaster-A. Begini cara melakukannya:


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

6.2 Bekerja 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)

Untuk memulai, mari kita lihat svn_poller. Ini masih merupakan antarmuka yang sama, secara rutin melakukan polling pada repositori satu menit sekali. Pada kasus ini svn_poller hanya mengakses cabang batang. Parameter misterius split_file=util.svn.split_file_alwaystrunk menetapkan aturan: cara memecah struktur folder svn di cabang-cabang. Dia juga menawarkan mereka jalur relatif. Pada gilirannya split_file_alwaystrunk menyederhanakan proses dengan mengatakan bahwa repositori hanya berisi batang.

В Penjadwal ditunjukkan UbahFiltersiapa yang melihat None dan mengaitkan cabang dengannya batang menurut asosiasi tertentu melalui split_file_alwaystrunk. Menanggapi perubahan dalam batang, Diluncurkan pembangun dengan nama Proyek Anda.

properties disini diperlukan agar admin menerima milis hasil build dan pengujian sebagai pemilik proses.

Langkah membangun-a pemeriksaan mampu menghapus sepenuhnya file apa pun yang terletak di repositori versi lokal Pekerja-A. Dan kemudian lakukan secara penuh pembaruan svn. Mode dikonfigurasi melalui parameter modus=penuh, metode=segar. Parameter haltOnTailure mengatakan bahwa jika pembaruan svn akan dieksekusi dengan kesalahan, maka seluruh proses pembangunan dan pengujian harus dihentikan, karena tindakan lebih lanjut tidak masuk akal.

6.3 Surat kepada Anda: wartawan berwenang menyatakan


wartawan adalah layanan untuk mengirimkan notifikasi melalui email.


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

Dia bisa mengirim pesan cara yang berbeda.

Pemberitahu Surat menggunakan email untuk mengirim pemberitahuan.

templat_html mengatur templat teks untuk buletin. HTML digunakan untuk membuat markup. Itu dimodifikasi oleh mesin jinja2 (dapat dibandingkan dengan Django). MembangunBot memiliki sekumpulan variabel yang nilainya diganti ke dalam templat selama proses pembuatan teks pesan. Variabel-variabel ini diapit oleh {{ kurung kurawal ganda }}. Misalnya, ringkasan menampilkan status operasi yang selesai, yaitu berhasil atau gagal. A memprojeksikan akan menghasilkan Proyek Anda. Jadi, menggunakan perintah kontrol di jinja2, variabel MembangunBot-a dan alat pemformatan string python, Anda dapat membuat pesan yang cukup informatif.

Pemberitahu Surat berisi argumen berikut.

dariaddr – alamat dari mana setiap orang akan menerima buletin.

kirimKePengguna yang Tertarik=True mengirimkan pesan kepada pemilik dan pengguna yang membuat melakukan.

lookup — akhiran yang harus ditambahkan ke nama pengguna yang menerima buletin. Jadi admin bagaimana pengguna akan menerima buletin di alamat tersebut [email dilindungi].

relayhost menentukan nama host tempat server dibuka smtp, Sebuah smptPort menentukan nomor port yang mendengarkan smtp server.

mode = "peringatan" mengatakan bahwa pengiriman surat hanya boleh dilakukan jika ada minimal satu langkah membangun-a, yang diakhiri dengan status kegagalan atau peringatan. Jika berhasil, tidak perlu mengirim buletin.

ekstraPenerima berisi daftar orang-orang yang kepadanya surat itu harus dikirim selain pemilik dan orang yang melaksanakannya melakukan.

messageFormatter adalah objek yang menentukan format pesan, templatnya, dan sekumpulan variabel yang tersedia jinja2. Pilihan seperti inginProperti=Benar и inginLangkah=Benar tentukan kumpulan variabel yang tersedia ini.

dengan['layanan']=[sendMessageToAll] menyediakan daftar layanan, di antaranya adalah layanan kami reporter.

Kita berhasil! Selamat

Kami membuat konfigurasi kami sendiri dan melihat fungsionalitas yang mampu dilakukannya. MembangunBot. Ini, menurut saya, cukup untuk memahami apakah alat ini diperlukan untuk membuat proyek Anda. Apakah kamu tertarik padanya? Apakah ini akan berguna bagi Anda? Apakah dia nyaman diajak bekerja sama? Maka saya tidak menulis artikel ini dengan sia-sia.

Dan selanjutnya. Saya ingin komunitas profesional menggunakan MembangunBot, menjadi lebih luas, manual diterjemahkan, dan contohnya lebih banyak lagi.

Terima kasih atas perhatian Anda. Semoga beruntung.

Sumber: www.habr.com

Tambah komentar