كنت بحاجة إلى إعداد عملية إنشاء حزم البرامج وتسليمها من مستودع Git إلى الموقع. وعندما رأيت ، منذ وقت ليس ببعيد ، هنا على Habré مقالًا عن buildbot (الرابط في النهاية) ، قررت أن أجربه وأطبقه لهذا الغرض.
نظرًا لأن buildbot نظام موزع ، سيكون من المنطقي إنشاء مضيف بناء منفصل لكل بنية ونظام تشغيل. في حالتنا ، ستكون هذه حاويات LXC (في حالة Linux) و qemu (في حالة النوافذ):
vm-srv-build1 - centos 7 ، سيكون هناك سيد buildbot (سيد) وأحد العمال (عامل)
سوف نجمع راك GUI - وجه رسومي لـ 1C rac لإدارة مجموعة من الخوادم. في نظام Linux ، سيتم استخدام الأدوات القياسية لكل نظام تشغيل ؛ لإنشاء ملف exe تحت النوافذ من برنامج نصي tcl ، استخدم غلاف مجاني.
تركيب
جنو / لينكس
للتثبيت ، هناك وثائق كافية على الشبكة 1,2. نعم ولا يسبب اي مشاكل خاصة:
للسيد:
بالطبع ، سيكون من الأصح إنشاء حزم لكل نظام تشغيل ، لكن هذا ليس ضمن نطاق المقالة. سنحذف أيضًا وصف إعداد حاويات العمل ، وسألاحظ فقط أنني أستخدم ProxMox VE. وستحتاج أيضًا إلى تثبيت حزم لكل محور مطلوب للبناء (centos: rpmdevtools ، إلخ ؛ debian: build-ضروري ، dh-make ، pbuilder ، إلخ.)
سيتم تشغيل خدمات Project builds and buildbot كمستخدم غير متمتّع ، لذلك تحتاج إلى إنشائه على جميع المضيفين المشاركين في العملية:
adduser buildbot
بعد ذلك ، سنقوم بتهيئة البداية التلقائية للخدمات ، على التوالي ، على كل من المضيفين (الحاويات):
إذا كان كل شيء يعمل (راجع سجل c: workertwistd.log) ، فيمكنك تسجيل "العامل" كخدمة عن طريق إضافة عنصر مع دليل العمل إلى السجل (يتم تنفيذ الأوامر في بوويرشيل يعمل كمسؤول):
مع "العمال" هذا كل شيء ، لا يمكنك لمسهم أكثر ، كل التحكم يأتي من السيد.
إعداد المعالج
بادئ ذي بدء ، دعنا ننشئ البنية التحتية للسيد (على المضيف الرئيسي) ، ولهذا نسجل تحت مستخدم buildbot وننفذ الأوامر التالية:
su - buildbot
mkdir /home/buildbot/master
cd ~
buildbot create-master master
بالنسبة للحزم الجاهزة ، قم بإنشاء دليل builds
mkdir /home/buildbot/builds
تم إنشاء ملف master.cfg في الدليل / home / buildbot / master /. هذا الملف عبارة عن كود Python ويحتوي على وصف لجميع آليات النظام ، وسنعمل معه في المستقبل.
لأتمتة تجميع حزم الإصدارات المختلفة ، حتى لا تضطر إلى الصعود إلى رمز ملف master.cfg ، في البرنامج النصي الرئيسي لبرنامج rac_gui.tcl في الرأس ، تم وضع الأسطر مع الإصدار الحالي والإصدار الحالي مضاف:
وبناءً على هذه الأسطر ، سيقوم 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 ().
هذه نهاية دورة في الدقيقة. لنبدأ الآن في وصف الخوارزمية لبناء حزمة 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 نفسها عند البناء ويتم وصفها داخل المواصفات ، بالنسبة إلى debian ، عليك القيام بذلك هنا:
# Поменяем пути к библиотекам
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")]
)
)
في السجل ، سوف نتحقق من أن كل شيء متوافق مع التكوين وأن كل شيء يعمل بشكل طبيعي. يجب على جميع عمالنا الاتصال الآن ، وسيتم الإبلاغ عن ذلك بسعادة في سجل »» '/home/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
هذا يكمل عملية الإعداد. يمكنك عرض الوضع الحالي من خلال الويب موردي. حيث يمكنك أيضًا رؤية أخطاء الإنشاء ، قم بتشغيل عملية مجمدة إذا حدث خطأ ما ، وما إلى ذلك.
مباشرة بعد إطلاق عمالنا الجادّين ، يمكنك أن ترى من خلال القائمة "يبني" -> "عمال"
بعد الانتهاء من عملية الإنشاء الأولى (أي التغييرات في مستودع Git) ، ستظهر حالة العمليات في الصفحة الأولى.
إذا قمت بالنقر فوق السطر المطلوب بالماوس ، فسيتم فتح صفحة بالحالة الحالية لهذه العملية ، حيث يمكنك رؤية ما يحدث ، وما هي الأخطاء ، وما إلى ذلك.