BuildBot kullanarak Sürekli Entegrasyonun uygulanmasına bir örnek

BuildBot kullanarak Sürekli Entegrasyonun uygulanmasına bir örnek
(Resim Bilgisayarlaştırıcı itibaren Pixabay)

Merhaba!

Benim adım Evgeniy Çerkin, Bir madencilik şirketinde geliştirme ekibinde programcıyım Polimetal.

Büyük bir projeye başladığınızda şunu düşünmeye başlarsınız: "Bunu sürdürmek için hangi yazılımı kullanmak en iyisidir?" Bir BT projesi bir sonraki sürümü yayınlamadan önce birkaç aşamadan geçer. Bu aşamaların zincirinin otomatikleştirilmesi iyidir. Bir BT projesinin yeni bir versiyonunun otomatik olarak yayınlanması sürecine denir. Sürekli Entegrasyon. Yapı Robotu bu sürecin uygulanmasında bize iyi bir yardımcı oldu.

Bu makalede olasılıklara genel bir bakış sunmaya karar verdim Yapı Robotu. Bu yazılım neler yapabilir? Ona nasıl yaklaşmalı ve onunla normal, ETKİLİ BİR ÇALIŞMA İLİŞKİSİ nasıl kurulmalı? Projenizi makinenizde oluşturmak ve test etmek için çalışan bir hizmet oluşturarak deneyimlerimizi kendiniz uygulayabilirsiniz.

Içerik

Içerik

1. Neden BuildBot?
2. BuildMaster liderliğindeki konsept
3. Kurulum
4. İlk adımlar

5. Yapılandırma. Adım adım tarif

5.1 BuildmasterConfig'i
5.2 işçiler
5.3 change_source
5.4 zamanlayıcılar

5.5 BuildFactory
5.6 inşaatçı

6. Kendi konfigürasyonunuzun örneği

6.1 master.cfg dosyanıza giderken
6.2 svn ile çalışma
6.3 Size mektup: muhabirler şunları beyan etmeye yetkilidir:

Yaptık! Tebrikler

1. Neden BuildBot?

Habr-e'de daha önce uygulamayla ilgili makalelere rastlamıştım Sürekli Entegrasyon ile Yapı Robotu. Örneğin, Bu En bilgilendirici olanı buldum. Başka bir örnek daha var - daha kolay. Bu makaleler baharatlanabilir kılavuzdan örnekVe bu bundan sonra İngilizce. Coupe iyi bir başlangıç ​​noktasıdır. Bu makaleleri okuduktan sonra muhtemelen hemen bir şeyler isteyeceksiniz. Yapı Robotu yapmak için.

Durmak! Bunu gerçekten projelerinde kullanan var mı? Evet çıkıyor çok görevlerinde uyguladılar. Bulunabilir Örnekler kullanmak Yapı Robotu ve Google kod arşivlerinde.

Peki insanların bunu kullanmasındaki mantık nedir? yapı robotu? Sonuçta başka araçlar da var: Seyir kontrolü и Jenkins. Bu şekilde cevap vereceğim. Çoğu görev için Jenkins ve gerçek yeterli olacaktır. Sırasıyla, Yapı Robotu - daha uyarlanabilir, problemler orada olduğu kadar basit bir şekilde çözülürken Jenkins. Seçim senin. Ancak gelişmekte olan bir hedef proje için bir araç aradığımıza göre, neden basit adımlardan başlayarak etkileşimli ve benzersiz bir arayüze sahip bir yapı sistemi elde etmeye izin verecek bir araç seçmiyoruz?

Hedef projesi python ile yazılanlar için şu soru ortaya çıkıyor: “Neden projede kullanılan dil açısından net bir arayüze sahip bir entegrasyon sistemi seçmiyorsunuz?” Şimdi faydaları sunmanın zamanı geldi Yapı Robotu.

Yani bizim “enstrümantal dörtlümüz”. Kendim için dört özellik belirledim Yapı Robotu:

  1. GPL lisansı altında açık kaynaklı bir çerçevedir
  2. Bu, Python'un bir yapılandırma aracı olarak kullanılması ve gerekli eylemlerin açıklamasıdır.
  3. Bu, montajın yapıldığı makineden yanıt alma fırsatıdır
  4. Son olarak bunlar bir Sunucu için minimum gereksinimlerdir. Dağıtım python ve bükülmüş gerektirir ve bir sanal makine ve Java makinesi gerektirmez.

2. BuildMaster liderliğindeki konsept

BuildBot kullanarak Sürekli Entegrasyonun uygulanmasına bir örnek

Görev dağıtım mimarisinin merkezinde Yapı Ustası. Bu bir hizmettir:

  • izini sürer proje kaynak ağacındaki değişiklikler
  • gönderir Projeyi oluşturmak ve test etmek için Worker hizmeti tarafından yürütülmesi gereken komutlar
  • bildirmek Kullanıcılar gerçekleştirilen eylemlerin sonuçları hakkında

Yapı Ustası dosya aracılığıyla yapılandırılmış master.cfg. Bu dosya kökte Yapı Ustası. Daha sonra bu kökün nasıl oluşturulduğunu göstereceğim. Dosyanın kendisi master.cfg çağrıları kullanan bir python betiği içerir Yapı Robotu.

Sonraki en önemli nesne Yapı Robotu Bir adı var Işçi. Bu hizmet, farklı bir işletim sistemine sahip başka bir ana bilgisayarda veya belki de Yapı Ustası. Ayrıca kendi paketleri ve değişkenleri ile özel olarak hazırlanmış bir sanal ortamda da var olabilir. Bu sanal ortamlar aşağıdaki gibi python yardımcı programları kullanılarak hazırlanabilir: sanalenv, venv.

Yapı Ustası komutları herkese yayınlar Işçi-y ve o da onları yerine getiriyor. Yani, bir projeyi oluşturma ve test etme sürecinin devam edebileceği ortaya çıktı Işçi-e Windows çalıştırıyor ve Linux çalıştıran başka bir Çalışanda.

Çıkış yapmak proje kaynak kodları her birinde oluşur Işçi-e.

3. Kurulum

O zaman hadi gidelim. Sunucu olarak Ubuntu 18.04 kullanacağım. Üzerine bir tane yerleştireceğim Yapı Ustası-a ve bir Işçi-A. Ama önce python3.7'yi kurmanız gerekiyor:

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

3.7.2 yerine python3.7.1'ye ihtiyaç duyanlar için aşağıdakileri yapabilirsiniz:


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

Bir sonraki adım yüklemektir Tweetlendi и Yapı Robotuve ek işlevler kullanmanıza olanak tanıyan paketler Yapı Robotu-a.


/*Все что под sudo будет установленно для всех пользователей в директорию /usr/local/lib/python3.7/dist-packages*/

#На хосте который производит мониторинг Worker-ов 
sudo pip install twisted #Библиотека twisted
sudo pip install buildbot #BuildMaster
#Дополнительный функционал
pip install pysqlite3 #Устанавливаем базу sqllite в учебных целях
pip install jinja2 #framework наподобие django, для web и для почтовых рассыллок
pip install autobahn #Web cокеты для связи BuildMaster->Worker
pip install sqlalchemy sqlalchemy-migrate #Для отображения схемы базы данных
#Для Web отображения BuildBot-a
pip install buildbot-www buildbot-grid-view buildbot-console-view buildbot-waterfall-view
pip install python-dateutil #Отображение дат в web
#На стороне хоста который непосредственно осуществляет сборку и тестирование 
pip install buildbot-worker #Worker
#Дополнительный функционал
sudo pip install virtualenv #Виртуальная среда 

4. İlk adımlar

Yaratma zamanı Yapı Ustası. Klasörümüzde olacak /ana sayfa/habr/usta.

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

Sonraki adım. Haydi yaratalım Işçi. Klasörümüzde olacak /ev/habr/işçi.

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

Koşarken Işçi, o zaman varsayılan olarak içinde oluşturulacaktır /ev/habr/işçi belirtilen projenin adını taşıyan klasör master.cfg. Ve projenin adını taşıyan klasörde bir dizin oluşturacaktır. inşa etmekve bunu yapmaya devam edeceğiz çıkış. Şunun için çalışma dizini: Işçi-ve bir dizin olacak /ana sayfa/habr/projeniz/derleme.

"Altın Anahtar
Ve şimdi önceki paragrafı ne için yazdım: bir senaryo usta 'dan talep edecek Işçi-ve bu dizinde uzaktan yapılan komut dosyası çalıştırılma haklarına sahip olmadığından yürütülmeyecektir. Durumu düzeltmek için bir anahtara ihtiyacınız olacak --umask=0o22, bu dizine yazmayı yasaklar ancak başlatma haklarını korur. Ve ihtiyacımız olan tek şey bu.

Yapı Ustası и Işçi birbirleriyle bağlantı kurarlar. Öyle olur ki kırılır ve Işçi bir süre cevap bekliyorum Yapı Ustası-A. Yanıt yoksa bağlantı yeniden başlatılır. Anahtar --keepalive=60 sadece bundan sonraki zamanı belirtmem gerekiyordu bağlamak yeniden başlatılır.

5. Yapılandırma. Adım adım tarif

Yapılandırma Yapı Ustası makinenin komutu uyguladığımız tarafında gerçekleştirilir yaratıcı-usta. Bizim durumumuzda bu bir dizindir /ana sayfa/habr/usta. Yapılandırma dosyası master.cfg henüz mevcut değil, ancak komutun kendisi dosyayı zaten oluşturdu master.cmg.sample. Bunu yeniden adlandırmanız gerekir master.cfg.sample в master.cfg

mv master.cfg.sample master.cfg

Hadi şunu açalım master.cfg. Ve nelerden oluştuğuna bakalım. Daha sonra kendi konfigürasyon dosyamızı oluşturmaya çalışalım.

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'i

c = BuildmasterConfig = {} 

BuildmasterConfig — yapılandırma dosyasının temel sözlüğü. Yapılandırma dosyasına dahil edilmelidir. Kullanım kolaylığı için konfigürasyon koduna bir takma ad eklenmiştir "c". Türkçe Anahtarların в c["keyFromDist"] ile etkileşim için sabit unsurlardır Yapı Ustası. Her anahtar için karşılık gelen nesne bir değer olarak değiştirilir.

5.2 işçiler

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

Bu sefer belirtiyoruz Yapı Ustası-y listesi Işçi-S. Kendim Işçi Biz yarattık yukarıda, belirten sen-işçi-adı и şifre. Şimdi bunun yerine belirtilmeleri gerekiyor örnek çalışan и geçmek .

5.3 change_source

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

Anahtara göre change_source sözlük c'de, projenin kaynak koduyla depoyu yoklayan bir nesneyi koymak istediğimiz listeye erişebiliyoruz. Örnek, belirli aralıklarla yoklanan bir Git deposunu kullanıyor.

İlk argüman deponuzun yoludur.

işdir yandaki klasörün yolunu temsil eder Işçi- yola göreli /ev/habr/işçi/projeniz/derleme git, deponun yerel sürümünü saklayacak.

şube depoda takip edilmesi gereken belirli bir dal içerir.

anketAralığı sonrasındaki saniye sayısını içerir Yapı Ustası değişiklikler için depoyu yoklayacak.

Bir projenin deposundaki değişiklikleri izlemenin çeşitli yöntemleri vardır.

En basit yöntem Seçim, bu da şunu ima ediyor Yapı Ustası düzenli aralıklarla sunucuyu depoyla yoklar. Eğer işlemek depodaki değişiklikleri yansıttı, ardından Yapı Ustası biraz gecikmeyle dahili bir nesne yaratacak değişim ve bunu olay işleyicisine gönder Zamanlayıcıprojeyi oluşturma ve test etme adımlarını başlatacak Işçi-e. Bu adımlar arasında belirtilecektir güncelleştirme depo. Tam olarak açık IşçiBu, havuzun yerel bir kopyasını oluşturacaktır. Bu sürecin ayrıntıları sonraki iki bölümde ele alınacaktır. (5.4 и 5.5).

Bir veri havuzundaki değişiklikleri izlemenin daha da zarif bir yöntemi, mesajları doğrudan onu barındıran sunucuya göndermektir. Yapı Ustası- proje kaynak kodlarının değiştirilmesi hakkında. Bu durumda, geliştirici bunu yapar yapmaz işlemekproje deposunun bulunduğu sunucu bir mesaj gönderecek Yapı Ustası-y. Ve o da bir nesne yaratarak onu engelleyecek PBC Değişim Kaynağı. Daha sonra bu nesne şuraya aktarılacak: ZamanlayıcıProjeyi oluşturma ve test etme adımlarını etkinleştiren. Bu yöntemin önemli bir kısmı kanca-depodaki sunucu komut dosyaları. Senaryoda kanca-a, eylemlerin işlenmesinden sorumludur işlemek-e, yardımcı programı aramanız gerekir değişim göndermek ve ağ adresini belirtin Yapı Ustası-A. Ayrıca dinleyecek ağ bağlantı noktasını da belirtmeniz gerekir. PBC Değişim Kaynağı. PBC Değişim Kaynağıbu arada, bir parçası Yapı Ustası-A. Bu yöntem izin gerektirecek Gizem-a proje deposunun bulunduğu sunucuda. Öncelikle deponun yedeğini almanız gerekecektir.

5.4 zamanlayı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"]))

zamanlayıcılar – bu, projenin tüm montaj ve test zincirini başlatan tetikleyici görevi gören bir unsurdur.
BuildBot kullanarak Sürekli Entegrasyonun uygulanmasına bir örnek

Kaydedilen bu değişiklikler change_sourceçalışma sürecinde dönüştü Yapı Robotu-a itiraz etmek değişim ve şimdi her Planlayıcı bunlara dayanarak proje oluşturma sürecini başlatmak için istekler oluşturur. Ancak bu isteklerin kuyruğa ne zaman aktarılacağını da belirler. Bir obje inşaatçı bir istek kuyruğunu saklar ve mevcut derlemenin durumunu ayrı bir yerde izler Işçi-e. inşaatçı üzerinde mevcut Yapı Ustası-e ve benzeri Işçi-e. İle gönderir Yapı Ustası-bir açık Işçi-ve zaten spesifik inşa etmek - takip edilmesi gereken bir dizi adım.
Şu anki örnekte şunu görüyoruz: zamanlayıcılar 2 adet oluşturuldu. Üstelik her birinin kendine has türü var.

TekŞubeZamanlayıcı – programdaki en popüler derslerden biri. Bir dalı izler ve onda kaydedilen bir değişiklikle tetiklenir. Değişiklikleri gördüğünde derleme isteğinin gönderilmesini geciktirebilir (özel parametrede belirtilen süre kadar erteleyebilir) ağaçKararlıZamanlayıcı). isim görüntülenecek programın adını ayarlar. Yapı Robotu-web arayüzü. İÇİNDE Filtreyi Değiştir Daldaki hangi değişiklikleri geçtikten sonra programın inşaat için bir istek göndermesini isteyen bir filtre ayarlanır. İÇİNDE inşaatçı İsimleri isim belirtildi oluşturucu-a, bunu biraz sonra ayarlayacağız. Bizim durumumuzdaki ad, proje adıyla aynı olacaktır: senin projen.

ForceScheduler çok basit bir şey. Bu tür bir zamanlama fare tıklamasıyla tetiklenir Yapı Robotu-web arayüzü. Parametreler aşağıdakilerle aynı öze sahiptir: TekŞubeZamanlayıcı.

Not: 3. Belki işine yarar
Periyodik belirli bir zaman sabit frekansında çalışan bir programdır. Çağrı buna benzer bir şeye benziyor


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

periyodikBuildTimer bu periyodikliğin süresini saniye cinsinden belirtir.

İnşaat Fabrikası belirli bir oluşturur inşa etmek, o zaman oluşturucu gönderir Işçi. İnşaat Fabrikası izlenecek adımları belirtir Işçi-y. Yöntem çağrılarak adımlar eklenir addStep

Bu örnekte eklenen ilk adım git temiz -d -f -f –xO zaman git ödeme. Bu eylemler parametreye dahil edilmiştir yöntem, açıkça belirtilmemiş ancak varsayılan bir değere işaret etmektedir taze... Parametre mod='artımlı' dosyaların bulunduğu dizinden olduğunu gösterir ödeme, depoda eksik olmasına rağmen dokunulmadan kalır.

Eklenen ikinci adım betiği çağırmak deneme parametreli merhaba tarafında Işçi-a dizinden /ev/habr/işçi/projeniz/derleme PATHONPATH=... ortam değişkeni ile kendi komut dosyalarınızı yazabilir ve bunları yan tarafta çalıştırabilirsiniz. Işçi-her adımda util.ShellCommand. Bu komut dosyaları doğrudan depoya yerleştirilebilir. sonra ödeme-e içine düşecekler /ev/habr/işçi/projeniz/derleme. Ancak iki "ama" var:

  1. Işçi bir anahtarla oluşturulmalıdır --umask bundan sonra yürütme haklarını engellememesi için çıkış-a.
  2. at git basma-e bu komut dosyalarının özelliğini belirtmeniz gerekir çalıştırılabilirböylece daha sonra ödeme-e Git betiğini çalıştırma hakkını kaybetmedi.

5.6 inşaatçı


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

ne olduğu hakkında inşaatçı söylendi burada. Şimdi size nasıl oluşturulacağını daha ayrıntılı olarak anlatacağım. Oluşturucu Yapılandırması bir yapıcıdır oluşturucu. Bu tür tasarımcılar c['inşaatçılar'] bu bir nesne sayfası olduğundan birkaç tane belirleyebilirsiniz oluşturucu tip. Şimdi örneği yeniden yazalım Yapı Robotu, görevimize daha da yaklaştırıyor.


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

Şimdi size parametrelerden bahsedeceğim Oluşturucu Yapılandırması.

isim adı belirtir oluşturucu-A. İşte adını verdik senin projen... Bu demektir ki üzerinde Işçi- tam da bu yol yaratılacak /ev/habr/işçi/projeniz/derleme. Planlayıcı arıyor oluşturucu sadece bu isimle.

işçi isimleri sayfa içerir Işçi-S. Her birinin eklenmesi gerekir c['işçiler'].

fabrika - özel inşa etmek, ilişkili olduğu oluşturucu. Nesneyi gönderecek inşa etmek üzerinde Işçi Bu belgede yer alan tüm adımları tamamlamak için inşa etmek-a.

6. Kendi konfigürasyonunuzun örneği

İşte uygulamayı önerdiğim örnek proje mimarisi Yapı Robotu
.

Versiyon kontrol sistemi olarak kullanacağız svn. Deponun kendisi bir tür bulutta yer alacak. İşte bu bulutun adresi svn.host/svn/projeniz/trunk. Altındaki bulutta svn bir hesap kullanıcı adı var: kullanıcı, şifre: şifre. Adımları temsil eden komut dosyaları inşa etmek-a da şubede olacak svn, ayrı bir klasörde buildbot/worker_linux. Bu komut dosyaları, kaydedilen özelliğin bulunduğu depoda bulunur çalıştırılabilir.

Yapı Ustası и Işçi aynı ana bilgisayarda çalıştır proje.ana bilgisayar .Yapı Ustası dosyalarını bir klasörde saklar /ana sayfa/habr/usta. Işçi aşağıdaki yolda saklanır /ev/habr/işçi. Süreç iletişimi Yapı Ustası-a ve Işçi-a protokole göre 4000 numaralı bağlantı noktası üzerinden gerçekleştirilir Yapı Robotu-a, yani 'pb' protokol.

Hedef proje tamamen Python'da yazılmıştır. Görev, değişiklikleri izlemek, yürütülebilir bir dosya oluşturmak, belgeler oluşturmak ve test yapmaktır. Başarısızlık durumunda, tüm geliştiricilerin e-posta yoluyla başarısız bir eylemin olduğunu belirten bir mesaj göndermeleri gerekir.

Web ekranı Yapı Robotu 80 numaralı bağlantı noktasına bağlanacağız proje.ana bilgisayar. Apatch'i kurmanıza gerek yok. Kütüphanenin bir parçası olarak bükülmüş zaten bir web sunucusu var, Yapı Robotu onu kullanıyor.

Dahili bilgileri saklamak için Yapı Robotu kullanacağız sqlite.

Posta göndermek için bir toplantı sahibi gereklidir smtp.alaniniz. - postadan mektup göndermeye izin verir [e-posta korumalı] kimlik doğrulaması olmadan. Ayrıca ev sahibinde 'smtp Tutanaklar 1025'te duyuluyor.

Bu süreçte yer alan iki kişi var: Gizem и kullanıcı. yönetici yönetir Yapı Robotu. kullanıcı taahhütte bulunan kişidir işlemek-S.

Çalıştırılabilir dosya aracılığıyla oluşturulur pyinstaller. Dokümantasyon aracılığıyla oluşturulur doksijen.

Bu mimari için şunu 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"
}

İlk önce ihtiyacın var создать Yapı Ustası-a ve Işçi-A. Daha sonra bu dosyayı yapıştırın master.cfg в /ana sayfa/habr/usta.

Bir sonraki adım hizmeti başlatmaktır Yapı UstasıS


sudo buildbot start /home/habr/master

Daha sonra hizmeti başlatın Işçi-a


buildbot-worker start /home/habr/worker

Hazır! Şimdi yapı robotu değişiklikleri izleyecek ve tetikleyecek işlemek-y içeride svn, yukarıdaki mimariyle bir proje oluşturma ve test etme adımlarını gerçekleştirme.

Aşağıda yukarıdakilerin bazı özelliklerini açıklayacağım usta.cfg.

6.1 master.cfg dosyanıza giderken


Benim yazarken master.cfg Birçok hata yapılacağından günlük dosyasının okunması gerekecektir. Olarak saklanır Yapı Ustası-ec mutlak yol /home/habr/master/twistd.logve yanda Işçi-a mutlak yol ile /home/habr/işçi/twistd.log. Hatayı okuyup düzelttikçe hizmeti yeniden başlatmanız gerekecek Yapı Ustası-A. İşte nasıl yapıldığı:


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

6.2 svn ile çalışma


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şlamak için, bir göz atalım svn_poller. Bu hala aynı arayüzdür ve düzenli olarak dakikada bir depoyu yoklar. Bu durumda svn_poller sadece şubeye ulaşıyor gövde. Gizemli parametre split_file=util.svn.split_file_alwaystrunk kuralları belirler: klasör yapısının nasıl bölüneceği svn dallarda. Ayrıca onlara göreceli yollar da sunuyor. Sırasıyla split_file_alwaystrunk havuzun yalnızca şunları içerdiğini söyleyerek süreci basitleştirir gövde.

В zamanlayıcılar gösterilir Filtreyi Değiştirkim görüyor Hayır ve onunla bir şubeyi ilişkilendirir gövde belirli bir ilişkiye göre split_file_alwaystrunk. Değişikliklere yanıt verme gövde, Lansmanlar oluşturucu isimli senin projen.

özellikleri burada yöneticinin, sürecin sahibi olarak derleme ve test sonuçlarının posta listelerini alması için gereklidir.

Adım inşa etmek-a çıkış Deponun yerel sürümünde bulunan tüm dosyaları tamamen silebilir Işçi-A. Ve sonra tam olarak yap svn güncellemesi. Mod parametre aracılığıyla yapılandırılır mod=dolu, yöntem=taze... Parametre haltOnTailure eğer diyor ki svn güncellemesi bir hatayla gerçekleştirilecekse, daha fazla eylemin bir anlamı olmayacağından tüm inşa ve test süreci askıya alınmalıdır.

6.3 Size mektup: muhabirler şunları beyan etmeye yetkilidir:


gazetecilere e-postayla bildirim göndermeye yönelik bir hizmettir.


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önderebilir Farklı yollar.

Posta Bildiricisi bildirim göndermek için e-postayı kullanır.

şablon_html Bülten için metin şablonunu ayarlar. HTML, işaretleme oluşturmak için kullanılır. Motor tarafından değiştirilir Jinja2 (şununla karşılaştırılabilir Django). Yapı Robotu mesaj metninin oluşturulması işlemi sırasında değerleri şablona yerleştirilen bir dizi değişkene sahiptir. Bu değişkenler {{ çift süslü parantez }} içine alınır. Örneğin, özet tamamlanan işlemlerin durumunu (başarılı veya başarısız) görüntüler. A Projeler çıktı olacak senin projen. Yani, kontrol komutlarını kullanarak Jinja2, değişkenler Yapı Robotu-a ve python string biçimlendirme araçlarını kullanarak oldukça bilgilendirici bir mesaj oluşturabilirsiniz.

Posta Bildiricisi aşağıdaki argümanları içerir.

fromaddr – herkesin haber bültenini alacağı adres.

İlgilenen Kullanıcılara gönder=True, işlemi yapan sahibine ve kullanıcıya bir mesaj gönderir. işlemek.

arama — bülteni alan kullanıcıların adlarına eklenmesi gereken bir son ek. Bu yüzden Gizem kullanıcının bülteni adresine nasıl alacağı [e-posta korumalı].

aktarma sunucusu sunucunun açıldığı ana bilgisayar adını belirtir smtp, smptPort dinleyen port numarasını belirtir smtp sunucu.

mod = "uyarı" postalamanın yalnızca en az bir adım olması durumunda yapılması gerektiğini söylüyor inşa etmek-a, durum hatası veya uyarıyla sona erdi. Başarı durumunda bülten göndermeye gerek yoktur.

ekstraAlıcılar Postanın sahibi ve işlemi gerçekleştiren kişinin yanı sıra, postanın gönderilmesi gereken kişilerin bir listesini içerir. işlemek.

mesajBiçimlendirici mesaj formatını, şablonunu ve erişilebilen bir dizi değişkeni belirten bir nesnedir. Jinja2. Gibi seçenekler wantProperties=Doğru и wantSteps=Doğru bu kullanılabilir değişkenler kümesini tanımlayın.

with['services']=[sendMessageToAll] bizimkilerin de yer alacağı hizmetlerin bir listesini sağlar muhabir.

Yaptık! Tebrikler

Kendi konfigürasyonumuzu oluşturduk ve yapabileceği işlevselliği gördük. Yapı Robotu. Bu, projenizi oluşturmak için bu araca ihtiyaç olup olmadığını anlamak için yeterli olduğunu düşünüyorum. Onunla ilgileniyor musun? Sizin için yararlı olacak mı? Onunla çalışmak rahat mı? O halde bu yazıyı boşuna yazmıyorum.

Ve ilerisi. Profesyonel topluluğun kullanmasını isterim Yapı Robotu, daha da genişledi, kılavuzlar çevrildi ve daha da fazla örnek ortaya çıktı.

İlginiz için hepinize teşekkür ederim. İyi şanlar.

Kaynak: habr.com

Yorum ekle