كنت بحاجة لإعداد عملية تجميع وتقديم حزم البرامج من مستودع 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 ={}
لأتمتة تجميع حزم الإصدارات المختلفة ، بحيث لا تضطر إلى الصعود إلى رمز الملف master.cfg ، في البرنامج النصي الرئيسي لبرنامج rac_gui.tcl في الرأس ، تمت إضافة أسطر بالإصدار والإصدار الحالي:
واستنادا إلى هذه الخطوط ، سوف يقوم buildbot بترقيم الحزم. لسحب البيانات ، استخدم استدعاء وحدة التحكم grep. في buildbot ، لا يمكنك ببساطة تحديد المتغيرات لـ "العمال" (على أي حال ، لم أجد كيف). للقيام بذلك ، استخدم الخصائص. أي في عملية التجميع ، أضف الخطوات لتحديد الإصدار والإصدار ، وبالتالي ، قم بتعيين خصائص الإصدار والإصدار. يمكن ضبط الخصائص بعدة طرق ، وفي هذه الحالة ، يتم الاتصال بأمر وحدة التحكم:
استبدال القيم التي تم الحصول عليها عن طريق استدعاء util.Interpolate ().
تجدر الإشارة إلى أنه نظرًا لاستخدام المضيف للتجميع اليدوي للحزم ، سيتم التجميع على طول المسارات القياسية.
لتعيين أرقام الإصدار والإصدار الصحيحة ، استخدم استدعاء sed القياسي ، أي يستبدل الأمر القيم الموجودة داخل ملف المواصفات بالضرر
نقوم بنسخ الحزمة التي تم تجميعها الجاهزة والأرشفة مع رموز المصدر إلى الرئيسي. ولكن يمكنك على الفور نسخ الملفات من سطح المكتب الخاص بك إلى مستودعك أو موقع الويب الخاص بك.
على المعالج ، نبدأ عملية نسخ الحزم المجمعة إلى استضافة 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) )
بالنسبة لحزمة RPM ، يتم تنفيذ جزء من الإجراءات التالية بواسطة rpm نفسها أثناء التجميع ويتم وصفها داخل المواصفات ، بالنسبة إلى دبيان ، يتعين عليك القيام بذلك هنا:
ويتم 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 (أو هل هناك؟) ، فسنستخدم بوويرشيل
للإبلاغ عن حالة عملية التجميع ، سنستخدم البريد الإلكتروني
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)
نقوم بحفظ الملف ويمكنك محاولة بدء تشغيل خدمة المعالج:
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 ))
: