Buildbot في الأمثلة

كنت بحاجة لإعداد عملية تجميع وتقديم حزم البرامج من مستودع Git إلى الموقع. وبعد أن رأيت ، منذ وقت ليس ببعيد ، هنا على Habr ، المقالة عن buildbot (الرابط في النهاية) قررت تجربتها والتقدم بطلب لذلك.


نظرًا لأن buildbot هو نظام موزع ، فسيكون من المنطقي لكل هندسة ونظام تشغيل إنشاء مضيف تجميع منفصل. في حالتنا ، ستكون هذه حاويات LXC (في حالة نظام التشغيل linux) و qemu (في حالة الإطارات):


  • vm-srv-build1 - centos 7 ، سيكون هناك سيد buildbot وواحد من العمال
  • vm-srv-build2 - دبيان 10 ، لبناء حزم DEB
  • vm-srv-build3 - windows 10 ، للتجميع ، أنت نفسك تفهم ما

سنقوم بجمع Rac GUI - واجهة رسومية لـ 1C rac لإدارة مجموعة من الخوادم. ضمن Linux ، سيتم استخدام الأدوات القياسية لكل نظام تشغيل ، ويتم استخدام freewrap لإنشاء ملف exe للنوافذ من برنامج نصي tcl.


تركيب


جنو / لينكس


للتثبيت ، الوثائق على الشبكة تكفي 1 ، 2 . ولا يسبب أي مشاكل خاصة:
للسيد:


pip3 install buildbot pip3 install twisted pip3 install autobahn pip3 install pysqlite3 pip3 install sqlalchemy sqlalchemy-migrate pip3 install buildbot-www buildbot-grid-view buildbot-console-view buildbot-waterfall-view pip3 install python-dateutil 

بالنسبة إلى "العمال" ، هذا يكفي:


 pip3 install buildbot-worker 

بالطبع ، سيكون من الأصح جمع الحزم لكل نظام تشغيل ، ولكن هذا يتجاوز نطاق المقالة. لقد أغفلنا أيضًا وصف تكوين الحاويات للعمل ، وألاحظ فقط أنني أستخدم ProxMox VE. وتحتاج أيضًا إلى تثبيت الحزم لكل محور مطلوب للتجميع (centos: rpmdevtools ، وما إلى ذلك ؛ دبيان: أساسيات البناء ، و dh-make ، و pbuilder ، وما إلى ذلك)


سيتم إطلاق خدمات تجميع المشروع و buildbot نيابة عن مستخدم غير محترم ، لذلك تحتاج إلى إنشائه على جميع المضيفين المشاركين في العملية:


 adduser buildbot 

بعد ذلك ، قم بتهيئة التشغيل التلقائي للخدمات ، على التوالي ، على كل من المضيفين (الحاويات):


وحدة Systemd لتشغيل المعالج:


 touch /etc/systemd/buildbot-master.service [Unit] Description=BuildBot master service After=network.target [Service] User=buildbot Group=buildbot WorkingDirectory=/home/buildbot/master ExecStart=/usr/local/bin/buildbot start --nodaemon ExecReload=/bin/kill -HUP $MAINPID [Install] WantedBy=multi-user.target 

و "العامل"


 touch /etc/systemd/buildbot-worker.service [Unit] Description=BuildBot worker service After=network.target [Service]master User=buildbot Group=buildbot WorkingDirectory=/home/buildbot/worker ExecStart=/usr/local/bin/buildbot-worker start --nodaemon [Install] WantedBy=buildbot-master.service 

نظرًا لأن جميع البرامج النصية (في حالتنا) موجودة في / usr / local / ، يجب عليك كتابة المسار إليها في متغيرات البيئة:


 nano /root/.bash_profile PATH=$PATH:$HOME/.local/bin:$HOME/bin:/usr/local/bin 

بعد ذلك ، يمكنك إنشاء بنية تحتية للدليل لـ "العمال" (على جميع المضيفين) ، لهذا ، قم بالتسجيل تحت مستخدم buildbot وتنفيذ الأوامر التالية:


على المضيف الأول ، 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 

على المضيف الثاني ، 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 

على المضيفين العاملين ، يمكن بدء تشغيل خدمة buildbot-worker


 systemctl start buildbot-worker 

مايكروسوفت ويندوز


كإنشاء "العمل" للنوافذ ، سيتم استخدام جهاز الظاهري مع أحدث إصدار Win10.
للعمل الذي تحتاجه:



بعد تثبيت كل ما سبق ، يمكنك تثبيت buildbot نفسه:


 pip install buildbot-worker 

إنشاء دليل العمل


 md c:\worker 

والركض


 buildbot-worker start c:\worker 

إذا كان كل شيء يعمل (راجع سجل c: \ worker \ twistd.log) ، فيمكنك تسجيل "العامل" الخاص بنا كخدمة عن طريق إضافة عنصر في دليل العمل إلى السجل (يتم تنفيذ الأوامر في بوويرشيل يعمل كمسؤول):


 buildbot_worker_windows_service.exe --user VM-SRV-BUILD3\buildbot --password 123456 --startup auto install New-ItemProperty -path Registry::HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\BuildBot\Parameters -Name directories -PropertyType String -Value c:\worker 

ويمكنك تشغيل خادم


 Start-Service buildbot 

هذا كل شيء مع "العمال" ، ثم لن تضطر إلى لمسهم بعد الآن ، فكل الإدارة تنتقل من المعلم.


معالج الإعداد


بادئ ذي بدء ، سنقوم بإنشاء البنية التحتية للمعالج (على المضيف الرئيسي) ، لهذا نقوم بالتسجيل تحت مستخدم buildbot وتنفيذ الأوامر التالية:


 su - buildbot mkdir /home/buildbot/master cd ~ buildbot create-master master 

للحزم المكتملة ، قم بإنشاء دليل البنيات


 mkdir /home/buildbot/builds 

تم إنشاء ملف master.cfg في الدليل / home / buildbot / master /. هذا الملف هو رمز بيثون ويحتوي على وصف لجميع آليات النظام ، وسوف نستمر في العمل معها.


 nano /home/buildbot/master/master.cfg 

 import os, re from buildbot.plugins import steps, util, schedulers, worker, changes, reporters c= BuildmasterConfig ={} #   . c['workers'] = [ worker.Worker('CentOS', '123456'), worker.Worker('Debian-10', '123456'), worker.Worker('Windows-10', '123456')] c['protocols'] = {'pb': {'port': 4000}} #      c['change_source'] = [] c['change_source'].append(changes.GitPoller( repourl = 'https://bitbucket.org/svk28/rac-gui.git', project = 'Rac-GUI', branches = True, pollInterval = 60 ) ) #    c['schedulers'] = [] c['schedulers'].append(schedulers.SingleBranchScheduler( name="Rac-GUI-schedulers", change_filter=util.ChangeFilter(branch='master'), builderNames=["Rac-GUI-RPM-builder", "Rac-GUI-DEB-builder", "Rac-GUI-WIN-builder"], properties = {'owner': 'admin'} ) ) @util.renderer ######################################3 #  RPM- rac_gui_build_RPM = util.BuildFactory() rac_gui_build_RPM.addStep(steps.Git( repourl = 'https://bitbucket.org/svk28/rac-gui.git', workdir = 'rac-gui', haltOnFailure = True, submodules = True, mode='full', progress = True) ) 

لأتمتة تجميع حزم الإصدارات المختلفة ، بحيث لا تضطر إلى الصعود إلى رمز الملف master.cfg ، في البرنامج النصي الرئيسي لبرنامج rac_gui.tcl في الرأس ، تمت إضافة أسطر بالإصدار والإصدار الحالي:


 ###################################################### # Rac GUI ... # version: 1.0.3 # release: 1 

واستنادا إلى هذه الخطوط ، سوف يقوم buildbot بترقيم الحزم. لسحب البيانات ، استخدم استدعاء وحدة التحكم grep. في buildbot ، لا يمكنك ببساطة تحديد المتغيرات لـ "العمال" (على أي حال ، لم أجد كيف). للقيام بذلك ، استخدم الخصائص. أي في عملية التجميع ، أضف الخطوات لتحديد الإصدار والإصدار ، وبالتالي ، قم بتعيين خصائص الإصدار والإصدار. يمكن ضبط الخصائص بعدة طرق ، وفي هذه الحالة ، يتم الاتصال بأمر وحدة التحكم:


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

استبدال القيم التي تم الحصول عليها عن طريق استدعاء util.Interpolate ().


 #   rac_gui_build_RPM.addStep( steps.ShellCommand( command=["tar", "czf", util.Interpolate("/home/buildbot/rpmbuild/SOURCES/rac-gui-%(prop:version)s-%(prop:release)s.tar.gz"), "../rac-gui"] ) ) 

تجدر الإشارة إلى أنه نظرًا لاستخدام المضيف للتجميع اليدوي للحزم ، سيتم التجميع على طول المسارات القياسية.


 #  spec rac_gui_build_RPM.addStep(steps.ShellCommand( command=["cp", "../rac-gui/rac_gui.spec", "/home/buildbot/rpmbuild/SPECS/rac_gui.spec"])) 

لتعيين أرقام الإصدار والإصدار الصحيحة ، استخدم استدعاء sed القياسي ، أي يستبدل الأمر القيم الموجودة داخل ملف المواصفات بالضرر


 #   rac_gui_build_RPM.addStep(steps.ShellCommand( command=["sed", "-i", util.Interpolate("s/.*Version:.*/Version:\t%(prop:version)s/"), "/home/buildbot/rpmbuild/SPECS/rac_gui.spec"])) #   rac_gui_build_RPM.addStep(steps.ShellCommand( command=["sed", "-i", util.Interpolate("s/.*Release:.*/Release:\t%(prop:release)s/"), "/home/buildbot/rpmbuild/SPECS/rac_gui.spec"])) #    rac_gui_build_RPM.addStep(steps.RpmBuild( specfile="/home/buildbot/rpmbuild/SPECS/rac_gui.spec", dist='.el5', topdir='/home/buildbot/rpmbuild', builddir='/home/buildbot/rpmbuild/build', rpmdir='/home/buildbot/rpmbuild/RPMS', sourcedir='/home/buildbot/rpmbuild/SOURCES' ) ) 

نقوم بنسخ الحزمة التي تم تجميعها الجاهزة والأرشفة مع رموز المصدر إلى الرئيسي. ولكن يمكنك على الفور نسخ الملفات من سطح المكتب الخاص بك إلى مستودعك أو موقع الويب الخاص بك.


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

على المعالج ، نبدأ عملية نسخ الحزم المجمعة إلى استضافة FTP. للقيام بذلك ، استخدم البرنامج النصي tcl.


 rac_gui_build_RPM.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.noarch.rpm"), util.Interpolate("--remote-file=uploads/rac-gui/rac-gui-%(prop:version)s-%(prop:release)s.noarch.rpm")] ) ) rac_gui_build_RPM.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.tar.gz"), util.Interpolate("--remote-file=uploads/rac-gui/rac-gui-%(prop:version)s-%(prop:release)s.tar.gz")] ) ) 

على ذلك مع RPM الانتهاء. الآن لنبدأ في وصف خوارزمية التجميع لحزمة DEB. نظرًا لأن عمليات بناء الحزم للأنظمة المختلفة مستقلة عن بعضها البعض ، فسيتم تكرار العديد من الخطوات.


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

بالنسبة لحزمة RPM ، يتم تنفيذ جزء من الإجراءات التالية بواسطة rpm نفسها أثناء التجميع ويتم وصفها داخل المواصفات ، بالنسبة إلى دبيان ، يتعين عليك القيام بذلك هنا:


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

ويتم DEB ، والآن النوافذ!


 rac_gui_build_WIN = util.BuildFactory() rac_gui_build_WIN.addStep(steps.Git( repourl = 'https://bitbucket.org/svk28/rac-gui.git', haltOnFailure = True, submodules = True, mode='full', workdir='build', progress = True) ) 

نظرًا لأن windows لا يحتوي على grep و sed (أو هل هناك؟) ، فسنستخدم بوويرشيل


 #       rac_gui_build_WIN.addStep( steps.SetPropertyFromCommand( command="powershell -command \"((Get-Content .\\rac_gui.tcl | Select-String -Pattern 'version:') -split '\\s')[2]", property="version" ) ) #       rac_gui_build_WIN.addStep( steps.SetPropertyFromCommand( command="powershell -command \"((Get-Content .\\rac_gui.tcl | Select-String -Pattern 'release:') -split '\\s')[2]", property="release" ) ) #    rac_gui_build_WIN.addStep(steps.ShellCommand( command=["c:\\bin\\freewrap.exe", "rac_gui.tcl"])) #  ,   rac_gui_build_WIN.addStep(steps.ShellCommand( command=["c:\\Program Files\\7-zip\\7z.exe", "a", "-r", util.Interpolate("..\\rac-gui_%(prop:version)s-%(prop:release)s.win.zip"), "..\\build"])) #    rac_gui_build_WIN.addStep( steps.FileUpload( workersrc=util.Interpolate("..\\rac-gui_%(prop:version)s-%(prop:release)s.win.zip"), masterdest=util.Interpolate("/home/buildbot/builds/rac-gui_%(prop:version)s-%(prop:release)s.win.zip") ) ) #     rac_gui_build_WIN.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.win.zip"), util.Interpolate("--remote-file=uploads/rac-gui/rac-gui_%(prop:version)s-%(prop:release)s.win.zip")] ) ) #        c['builders'] = [ util.BuilderConfig(name="Rac-GUI-RPM-builder", workername='CentOS', factory=rac_gui_build_RPM), util.BuilderConfig(name="Rac-GUI-DEB-builder", workername='Debian-10', factory=rac_gui_build_DEB), util.BuilderConfig(name="Rac-GUI-WIN-builder", workername='Windows-10', factory=rac_gui_build_WIN), ] 

للإبلاغ عن حالة عملية التجميع ، سنستخدم البريد الإلكتروني


 c['services'] = [] template=u'''\ <h4>Build status: {{ summary }}</h4> <p> Worker used: {{ workername }}</p> {% for step in build['steps'] %} <p> {{ step['name'] }}: {{ step['result'] }}</p> {% endfor %} <p><b> -- The Buildbot</b></p> ''' mailNotifier = reporters.MailNotifier(fromaddr="builder@domain.ru", sendToInterestedUsers=False, mode=('all'), extraRecipients=["admin@domain.ru"], relayhost="mail.domain.ru", smtpPort=587, smtpUser="builder@domain.ru", smtpPassword="******", messageFormatter=reporters.MessageFormatter( template=template, template_type='html', wantProperties=True, wantSteps=True)) c['services'].append(mailNotifier) #    c['title'] = "The process of bulding" c['titleURL'] = "http://vm-srv-build1:80/" c['buildbotURL'] = "http://vm-srv-build1/" c['www'] = dict(port=80, plugins=dict(waterfall_view={}, console_view={}, grid_view={})) c['db'] = { 'db_url' : "sqlite:///state.sqlite" } 

نقوم بحفظ الملف ويمكنك محاولة بدء تشغيل خدمة المعالج:


 systemctl restart buildbot-master 

في السجل ، نتحقق من أن كل شيء يتوافق مع التكوين وأن كل شيء يعمل كالمعتاد. يجب على جميع موظفينا الاتصال الآن ، كما سيتم الإبلاغ بسعادة في سجل '' '' '' '/ الصفحة الرئيسية / بناء الموقع / ماستر / twistd.log' '' '' السجل:


  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 

هذا يكمل عملية الإعداد. يمكنك عرض الحالة الحالية من خلال واجهة الويب. حيث يمكنك أيضًا رؤية أخطاء التجميع ، والشروع في عملية مجمدة إذا حدث خطأ ما ، إلخ.


مباشرة بعد إطلاق عمالنا الشاقين ، يمكنك أن ترى من خلال قائمة "Builds" -> "العمال"


صورة


بعد اكتمال عملية الإنشاء الأولى (أي التغييرات في مستودع Git) ، ستظهر حالة العمليات في الصفحة الأولى.


صورة


إذا قمت بوضع الماوس في السطر المرغوب فيه ، يتم فتح صفحة بالحالة الحالية للعملية ، حيث يمكنك رؤية ما يحدث ، وما هي الأخطاء ، وما إلى ذلك.


صورة


يمكنك أن تأخذ التكوين الرئيسي بأكمله هنا
 import os, re from buildbot.plugins import steps, util, schedulers, worker, changes, reporters c= BuildmasterConfig ={} c['workers'] = [ worker.Worker('CentOS', '123456'), worker.Worker('Debian-10', '123456'), worker.Worker('Windows-10', '123456')] c['protocols'] = {'pb': {'port': 4000}} c['change_source'] = [] c['change_source'].append(changes.GitPoller( repourl = 'https://bitbucket.org/svk28/rac-gui.git', project = 'Rac-GUI', branches = True, pollInterval = 600 )) #    c['schedulers'] = [] c['schedulers'].append(schedulers.SingleBranchScheduler( name="Rac-GUI-schedulers", change_filter=util.ChangeFilter(branch='master'), builderNames=["Rac-GUI-RPM-builder", "Rac-GUI-DEB-builder", "Rac-GUI-WIN-builder"], properties = {'owner': 'admin'} )) @util.renderer def get_name_version_release(props): prog_name = "rac-gui" prog_version = "1.0.3" prog_release = "3" return { "prog_name": prog_name #"prog_version": prog_version, #"prog_release": prog_release } rac_gui_build_RPM = util.BuildFactory() rac_gui_build_RPM.addStep(steps.Git( repourl = 'https://bitbucket.org/svk28/rac-gui.git', workdir = 'rac-gui', haltOnFailure = True, submodules = True, mode='full', progress = True) ) #       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" ) ) rac_gui_build_RPM.addStep(steps.ShellCommand( command=["tar", "czf", util.Interpolate("/home/buildbot/rpmbuild/SOURCES/rac-gui-%(prop:version)s-%(prop:release)s.tar.gz"), "../rac-gui"])) rac_gui_build_RPM.addStep(steps.ShellCommand( command=["cp", "../rac-gui/rac_gui.spec", "/home/buildbot/rpmbuild/SPECS/rac_gui.spec"])) rac_gui_build_RPM.addStep(steps.ShellCommand( command=["sed", "-i", util.Interpolate("s/.*Version:.*/Version:\t%(prop:version)s/"), "/home/buildbot/rpmbuild/SPECS/rac_gui.spec"])) rac_gui_build_RPM.addStep(steps.ShellCommand( command=["sed", "-i", util.Interpolate("s/.*Release:.*/Release:\t%(prop:release)s/"), "/home/buildbot/rpmbuild/SPECS/rac_gui.spec"])) rac_gui_build_RPM.addStep(steps.RpmBuild( specfile="/home/buildbot/rpmbuild/SPECS/rac_gui.spec", dist='.el5', topdir='/home/buildbot/rpmbuild', builddir='/home/buildbot/rpmbuild/build', rpmdir='/home/buildbot/rpmbuild/RPMS', sourcedir='/home/buildbot/rpmbuild/SOURCES' )) #     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") ) ) rac_gui_build_RPM.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.noarch.rpm"), util.Interpolate("--remote-file=uploads/rac-gui/rac-gui-%(prop:version)s-%(prop:release)s.noarch.rpm")] ) ) rac_gui_build_RPM.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.tar.gz"), util.Interpolate("--remote-file=uploads/rac-gui/rac-gui-%(prop:version)s-%(prop:release)s.tar.gz")] ) ) #################################### ## DEB #################################### 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"])) #     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")] ) ) ############################################ # WIN ############################################ rac_gui_build_WIN = util.BuildFactory() rac_gui_build_WIN.addStep(steps.Git( repourl = 'https://bitbucket.org/svk28/rac-gui.git', haltOnFailure = True, submodules = True, mode='full', workdir='build', progress = True) ) #       rac_gui_build_WIN.addStep( steps.SetPropertyFromCommand( command="powershell -command \"((Get-Content .\\rac_gui.tcl | Select-String -Pattern 'version:') -split '\\s')[2]", property="version" ) ) #       rac_gui_build_WIN.addStep( steps.SetPropertyFromCommand( command="powershell -command \"((Get-Content .\\rac_gui.tcl | Select-String -Pattern 'release:') -split '\\s')[2]", property="release" ) ) #    rac_gui_build_WIN.addStep(steps.ShellCommand( command=["c:\\bin\\freewrap.exe", "rac_gui.tcl"])) #  ,   rac_gui_build_WIN.addStep(steps.ShellCommand( command=["c:\\Program Files\\7-zip\\7z.exe", "a", "-r", util.Interpolate("..\\rac-gui_%(prop:version)s-%(prop:release)s.win.zip"), "..\\build"])) #    rac_gui_build_WIN.addStep( steps.FileUpload( workersrc=util.Interpolate("..\\rac-gui_%(prop:version)s-%(prop:release)s.win.zip"), masterdest=util.Interpolate("/home/buildbot/builds/rac-gui_%(prop:version)s-%(prop:release)s.win.zip") ) ) #     rac_gui_build_WIN.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.win.zip"), util.Interpolate("--remote-file=uploads/rac-gui/rac-gui_%(prop:version)s-%(prop:release)s.win.zip")] ) ) c['builders'] = [ util.BuilderConfig(name="Rac-GUI-RPM-builder", workername='CentOS', factory=rac_gui_build_RPM), util.BuilderConfig(name="Rac-GUI-DEB-builder", workername='Debian-10', factory=rac_gui_build_DEB), util.BuilderConfig(name="Rac-GUI-WIN-builder", workername='Windows-10', factory=rac_gui_build_WIN), ] c['services'] = [] template=u'''\ <h4>Build status: {{ summary }}</h4> <p> Worker used: {{ workername }}</p> {% for step in build['steps'] %} <p> {{ step['name'] }}: {{ step['result'] }}</p> {% endfor %} <p><b> -- The Buildbot</b></p> ''' mailNotifier = reporters.MailNotifier(fromaddr="112@icvibor.ru", sendToInterestedUsers=False, mode=('all'), extraRecipients=["my@domain.local"], relayhost="mail.domain.local", smtpPort=587, smtpUser="buildbot@domain.local", smtpPassword="**********", messageFormatter=reporters.MessageFormatter( template=template, template_type='html', wantProperties=True, wantSteps=True)) c['services'].append(mailNotifier) c['title'] = "The process of bulding" c['titleURL'] = "http://vm-srv-build1:80/" c['buildbotURL'] = "http://vm-srv-build1/" c['www'] = dict(port=80, plugins=dict(waterfall_view={}, console_view={}, grid_view={})) c['db'] = { 'db_url' : "sqlite:///state.sqlite" } 


:


Source: https://habr.com/ru/post/ar464489/


All Articles