Yazılım paketlerini bir Git deposundan siteye derleme ve teslim etme sürecini ayarlamam gerekiyordu. Ve kısa bir süre önce Habré'de buildbot hakkında bir makale gördüğümde (sondaki bağlantı), bunu denemeye ve uygulamaya karar verdim.
Buildbot dağıtık bir sistem olduğundan her mimari ve işletim sistemi için ayrı bir build host oluşturmak mantıklı olacaktır. Bizim durumumuzda bunlar LXC konteynerleri (Linux durumunda) ve qemu (Windows durumunda) olacaktır:
vm-srv-build1 - centos 7, bir buildbot ustası ve işçilerden biri olacak
vm-srv-build2 - DEB paketleri oluşturmak için debian 10
vm-srv-build3 - Windows 10, montaj için, ne için olduğunu biliyorsunuz
toplayacağız Rac GUI'si — bir sunucu kümesini yönetmek için 1C rac için grafiksel bir arayüz. Linux için, bir tcl betiğinden Windows için bir exe dosyası oluşturmak amacıyla her işletim sistemi için standart araçlar kullanılacaktır; serbest sarma.
Montaj
GNU / Linux
İnternette kurulum için yeterli dokümantasyon var 1,2. Evet ve herhangi bir özel soruna neden olmaz:
Usta için:
Elbette her işletim sistemi için paket toplamak daha doğru olur ancak bu yazının kapsamı dışındadır. Ayrıca iş için konteyner kurma açıklamasını da atlayacağız, yalnızca ProxMox VE kullandığımı not edeceğim. Ayrıca montaj için gereken her eksen için paketler kurmanız gerekecektir (centos: rpmdevtools, vb.; debian: build-essential, dh-make, pbuilder, vb.)
Build projeleri ve buildbot hizmetleri ayrıcalıksız bir kullanıcı olarak başlatılacağından, sürece katılan tüm ana bilgisayarlarda bir tane oluşturmanız gerekir:
adduser buildbot
Daha sonra, her bir ana bilgisayarda (konteynerlerde) hizmetlerin otomatik olarak başlatılmasını sırasıyla yapılandıracağız:
Bundan sonra “işçiler” için (tüm ana bilgisayarlarda) bir dizin altyapısı oluşturabilir, bunun için buildbot kullanıcısı altında kayıt olup aşağıdaki komutları çalıştırabilirsiniz:
İlk ana bilgisayarda vm-srv-build1:
su - buildbot
mkdir /home/buildbot/worker
cd ~
buildbot-worker create-worker --umask=0o22 --keepalive=60 worker vm-srv-build1:4000 CentOS 123456
İkinci ana makinede vm-srv-build2:
su - buildbot
mkdir /home/buildbot/worker
cd ~
buildbot-worker create-worker --umask=0o22 --keepalive=60 worker vm-srv-build1:4000 Debian-10 123456
Çalışan ana bilgisayarlarda buildbot-worker hizmeti başlatılabilir
systemctl start buildbot-worker
MS Windows
Windows altında montaj için bir "işçi" olarak Win10'un en son sürümüne sahip bir sanal makine kullanılacaktır.
Çalışmak için ihtiyacınız olacak:
Yukarıdakilerin tümü yüklendikten sonra buildbot'un kendisini yükleyebilirsiniz:
pip install buildbot-worker
Bir çalışma dizini oluşturalım
md c:worker
Ve hadi başlayalım
buildbot-worker start c:worker
Her şey işe yararsa (bkz. log c:workertwistd.log), çalışma dizinini içeren bir öğeyi kayıt defterine ekleyerek "işçimizi" bir hizmet olarak kaydedebilirsiniz (komutlar yönetici olarak çalışan powershell'de yürütülür):
Hepsi "işçiler" için geçerli, onlara daha fazla dokunmanıza gerek yok, tüm kontrol ustadan geliyor.
Sihirbaz kurulumu
Başlangıç olarak master için (ana hostta) altyapıyı oluşturalım, bunun için buildbot kullanıcısının altına kayıt olalım ve aşağıdaki komutları çalıştıralım:
su - buildbot
mkdir /home/buildbot/master
cd ~
buildbot create-master master
Hazır paketler için bir derleme dizini oluşturun
mkdir /home/buildbot/builds
/home/buildbot/master/ dizininde bir master.cfg dosyası oluşturuldu. Bu dosya bir python kodudur ve gelecekte üzerinde çalışacağımız sistemin tüm mekanizmalarının açıklamasını içerir;
Master.cfg dosyasının kodunu araştırmak zorunda kalmamak için farklı sürümlerdeki paketlerin montajını otomatikleştirmek için, rac_gui.tcl programının ana komut dosyasına, başlığa güncel sürümü ve sürümü içeren satırlar eklendi :
Ve bu satırlara dayanarak buildbot paketleri numaralandıracak. Verileri çıkarmak için konsol grep çağrısını kullanın. Buildbot'ta "işçiler" için değişkenleri tanımlayamazsınız (en azından nasıl olduğunu bulamadım). Özellikler bunun için kullanılır. Onlar. Montaj sürecinde sürümü ve sürümü belirlemek ve buna göre sürüm ve sürüm özelliklerini ayarlamak için adımlar ekliyoruz. Özellikler çeşitli şekillerde ayarlanabilir; bu durumda konsol komutu çağrılarak:
# Добавим определение версии из основного файла
rac_gui_build_RPM.addStep(
steps.SetPropertyFromCommand(
command="grep version ../rac-gui/rac_gui.tcl | grep -oE 'b[0-9]{1,2}.[0-9]{1,2}.[0-9]{1,2}b'", property="version"
)
)
# Добавим определение релиза из основного файла
rac_gui_build_RPM.addStep(
steps.SetPropertyFromCommand(
command="grep release ../rac-gui/rac_gui.tcl | grep -oE 'b[0-9]{1,3}b'", property="release"
)
)
Ortaya çıkan değerleri util.Interpulate() öğesini çağırarak değiştirebilirsiniz.
Doğru sürüm ve sürüm numaralarını ayarlamak için standart bir sed çağrısı kullanın; komut, spesifikasyon dosyasındaki değerleri gerekli olanlarla değiştirir
Bitmiş birleştirilmiş paketi ve kaynaklarla birlikte arşivi ana bilgisayara kopyalıyoruz. Ancak dosyaları çalışma dosyanızdan deponuza veya web sitenize hemen kopyalayabilirsiniz.
# Скопируем файл на мастер
rac_gui_build_RPM.addStep(
steps.FileUpload(
workersrc=util.Interpolate("/home/buildbot/rpmbuild/RPMS/noarch/rac-gui-%(prop:version)s-%(prop:release)s.noarch.rpm"),
masterdest=util.Interpolate("/home/buildbot/builds/rac-gui-%(prop:version)s-%(prop:release)s.noarch.rpm")
)
)
rac_gui_build_RPM.addStep(
steps.FileUpload(
workersrc=util.Interpolate("/home/buildbot/rpmbuild/SOURCES/rac-gui-%(prop:version)s-%(prop:release)s.tar.gz"),
masterdest=util.Interpolate("/home/buildbot/builds/rac-gui-%(prop:version)s-%(prop:release)s.tar.gz")
)
)
Toplanan paketleri master üzerinde FTP üzerinden hostinge kopyalama işlemine başlayalım. Bu amaçla kullanılır senaryo tcl'de.
RPM'de bu kadar. Şimdi DEB paketi oluşturmaya yönelik algoritmayı açıklamaya başlayalım. Farklı sistemler için paket oluşturma süreçleri birbirinden bağımsız olduğundan birçok adım tekrarlanacaktır.
rac_gui_build_DEB = util.BuildFactory()
rac_gui_build_DEB.addStep(steps.Git(
repourl = 'https://bitbucket.org/svk28/rac-gui.git',
haltOnFailure = True,
submodules = True,
mode='full',
workdir='build',
progress = True)
)
# Добавим определение версии из основного файла
rac_gui_build_DEB.addStep(
steps.SetPropertyFromCommand(
command="grep version rac_gui.tcl | grep -oE 'b[0-9]{1,2}.[0-9]{1,2}.[0-9]{1,2}b'", property="version"
)
)
# Добавим определение релиза из основного файла
rac_gui_build_DEB.addStep(
steps.SetPropertyFromCommand(
command="grep release rac_gui.tcl | grep -oE 'b[0-9]{1,3}b'", property="release"
)
)
# Переименуем запускаемый файл
rac_gui_build_DEB.addStep(steps.ShellCommand(
command=["mv", "rac_gui.tcl", "racgui"]))
Bir RPM paketi için aşağıdaki prosedürlerden bazıları montaj sırasında rpm'nin kendisi tarafından gerçekleştirilir ve spesifikasyonda açıklanmıştır; Debian için bunu burada yapmanız gerekir:
# Поменяем пути к библиотекам
rac_gui_build_DEB.addStep(steps.ShellCommand(
command=["sed", "-i", "s+^set dir(lib)+set dir(lib) /usr/share/rac-gui/lib ;#+g", "racgui"]))
# Поменяем пути к файлам
rac_gui_build_DEB.addStep(steps.ShellCommand(
command=["sed", "-i", "s+[pwd]+/usr/share/rac-gui+g", "racgui"]))
# заархивируем исходники
rac_gui_build_DEB.addStep(steps.ShellCommand(
command=["tar", "czf", util.Interpolate("../rac-gui_%(prop:version)s.orig.tar.gz"), "."]))
# Соберём пакет
rac_gui_build_DEB.addStep(steps.ShellCommand(
command=["dpkg-buildpackage"]))
# Скопируем файл на мастер
rac_gui_build_DEB.addStep(
steps.FileUpload(
workersrc=util.Interpolate("../rac-gui_%(prop:version)s-%(prop:release)s_amd64.deb"),
masterdest=util.Interpolate("/home/buildbot/builds/rac-gui_%(prop:version)s-%(prop:release)s_amd64.deb")
)
)
rac_gui_build_DEB.addStep(
steps.MasterShellCommand(
command=["/usr/local/bin/deploy-ftp.tcl",
util.Interpolate("--local-file=/home/buildbot/builds/rac-gui_%(prop:version)s-%(prop:release)s_amd64.deb"),
util.Interpolate("--remote-file=uploads/rac-gui/rac-gui_%(prop:version)s-%(prop:release)s_amd64.deb")]
)
)
Dosyayı kaydedin ve sihirbaz hizmetini başlatmayı deneyebilirsiniz:
systemctl restart buildbot-master
Günlükte, yapılandırmada her şeyin yolunda olup olmadığını ve her şeyin normal şekilde çalıştığını kontrol edeceğiz. Artık tüm çalışanlarımızın bağlanması gerekiyor ve bu durum »»'/home/buildbot/master/twistd.log»»' günlüğünde memnuniyetle raporlanacak:
2019-07-24 16:50:35+0300 [-] Loading buildbot.tac...
2019-07-24 16:50:35+0300 [-] Loaded.
2019-07-24 16:50:35+0300 [-] twistd 19.2.1 (/usr/bin/python3.6 3.6.8) starting up.
2019-07-24 16:50:35+0300 [-] reactor class: twisted.internet.epollreactor.EPollReactor.
2019-07-24 16:50:35+0300 [-] Starting BuildMaster -- buildbot.version: 2.3.1
2019-07-24 16:50:35+0300 [-] Loading configuration from '/home/buildbot/master/master.cfg'
2019-07-24 16:50:36+0300 [-] /usr/local/lib/python3.6/site-packages/buildbot/config.py:90: buildbot.config.ConfigWarning: [0.9.0 and later] `buildbotNetUsageData` is not configured and defaults to basic.
This parameter helps the buildbot development team to understand the installation base.
No personal information is collected.
Only installation software version info and plugin usage is sent.
You can `opt-out` by setting this variable to None.
Or `opt-in` for more information by setting it to "full".
2019-07-24 16:50:36+0300 [-] Setting up database with URL 'sqlite:/state.sqlite'
2019-07-24 16:50:36+0300 [-] setting database journal mode to 'wal'
2019-07-24 16:50:36+0300 [-] adding 1 new services, removing 0
2019-07-24 16:50:36+0300 [-] adding 1 new change_sources, removing 0
2019-07-24 16:50:36+0300 [-] gitpoller: using workdir '/home/buildbot/master/gitpoller-work'
2019-07-24 16:50:36+0300 [-] adding 3 new builders, removing 0
2019-07-24 16:50:36+0300 [-] adding 1 new schedulers, removing 0
2019-07-24 16:50:36+0300 [-] initializing www plugin 'waterfall_view'
2019-07-24 16:50:36+0300 [-] initializing www plugin 'console_view'
2019-07-24 16:50:36+0300 [-] initializing www plugin 'grid_view'
2019-07-24 16:50:36+0300 [-] NOTE: www plugin 'sitenav' is installed but not configured
2019-07-24 16:50:36+0300 [-] initializing www plugin 'waterfall_view'
2019-07-24 16:50:36+0300 [-] initializing www plugin 'console_view'
2019-07-24 16:50:36+0300 [-] initializing www plugin 'grid_view'
2019-07-24 16:50:36+0300 [-] NOTE: www plugin 'sitenav' is installed but not configured
2019-07-24 16:50:36+0300 [-] BuildbotSite starting on 80
2019-07-24 16:50:36+0300 [-] Starting factory <buildbot.www.service.BuildbotSite object at 0x7fe31c2657b8>
2019-07-24 16:50:36+0300 [-] adding 3 new workers, removing 0
2019-07-24 16:50:36+0300 [-] PBServerFactory starting on 4000
2019-07-24 16:50:36+0300 [-] Starting factory <twisted.spread.pb.PBServerFactory object at 0x7fe31c147470>
2019-07-24 16:50:37+0300 [-] BuildMaster is running
2019-07-24 16:50:37+0300 [-] buildbotNetUsageData: sending {'installid': 'b6193b126b96689351d2fe95787c5a03fc0879f9', 'versions': {'Python': '3.6.8', 'Buildbot': '2.3.1', 'Twisted': '19.2.1'}, 'platform': {'platform': 'Linux-4.15.18-10- pve-x86_64-with-centos-7.6.1810-Core', 'system': 'Linux', 'machine': 'x86_64', 'processor': 'x86_64', 'python_implementation': 'CPython', 'version': '#1 SMP PVE 4.15.18-32', 'distro': 'centos:7'}, 'plugins': {'buildbot/worker/base/Worker': 3, 'buildbot/config/BuilderConfig': 3, 'buildbot/schedulers/basic/SingleBranchScheduler': 1, 'buildbot/reporters/mail/MailNotifier': 1, 'buildbot/changes/gitpoller/GitPoller': 1, 'buildbot/steps/worker/MakeDirectory': 1, 'buildbot/steps/source/git/Git': 3, 'buildbot/steps/shell/ShellCommand': 9, 'buildbot/steps/package/rpm/rpmbuild/RpmBuild': 1}, 'db': 'sqlite', 'mq': 'simple', 'www_plugins': ['waterfall_view', 'console_view', 'grid_view']}
2019-07-24 16:50:37+0300 [Broker,0,127.0.0.1] worker 'CentOS' attaching from IPv4Address(type='TCP', host='127.0.0.1', port=37332)
2019-07-24 16:50:37+0300 [Broker,0,127.0.0.1] Got workerinfo from 'CentOS'
2019-07-24 16:50:37+0300 [-] bot attached
2019-07-24 16:50:37+0300 [Broker,0,127.0.0.1] Worker CentOS attached to Rac-GUI-RPM-builder
2019-07-24 16:50:37+0300 [-] buildbotNetUsageData: buildbot.net said: ok
2019-07-24 16:50:39+0300 [Broker,1,192.168.55.15] worker 'Windows-10' attaching from IPv4Address(type='TCP', host='192.168.5.145', port=49831)
2019-07-24 16:50:39+0300 [Broker,1,192.168.55.15] Got workerinfo from 'Windows-10'
2019-07-24 16:50:40+0300 [-] bot attached
2019-07-24 16:50:40+0300 [Broker,1,192.168.55.15] Worker Windows-10 attached to Rac-GUI-WIN-builder
2019-07-24 16:50:41+0300 [Broker,2,192.168.55.99] worker 'Debian-10' attaching from IPv4Address(type='TCP', host='192.168.5.9', port=44430)
2019-07-24 16:50:41+0300 [Broker,2,192.168.55.99] Got workerinfo from 'Debian-10'
2019-07-24 16:50:41+0300 [-] bot attached
2019-07-24 16:50:41+0300 [Broker,2,192.168.55.99] Worker Debian-10 attached to Rac-GUI-DEB-builder
Bu, kurulum işlemini tamamlar. Mevcut durumu web arayüzü üzerinden görüntüleyebilirsiniz. Ayrıca derleme hatalarını da görebileceğiniz, bir şeyler ters giderse donmuş bir süreci başlatabileceğiniz vb.
Lansmandan hemen sonra çalışkanlarımız "Yapılar" -> "İşçiler" menüsü aracılığıyla görüntülenebilir
İlk derleme işlemi tamamlandıktan sonra (yani Git deposunda yapılan değişiklikler), süreçlerin durumu ilk sayfada görünecektir.
İstediğiniz satıra fareyle tıklarsanız, bu işlemin mevcut durumunu içeren, neler olduğunu, hangi hataları vb. görebileceğiniz bir sayfa açılır.
Sihirbaz yapılandırmasının tamamını burada bulabilirsiniz