من باید فرآیند مونتاژ و تحویل بسته های نرم افزاری را از یک مخزن Git به سایت تنظیم کنم. و وقتی نه چندان دور، اینجا در Habré مقاله ای در مورد buildbot دیدم (لینک در پایان)، تصمیم گرفتم آن را امتحان کنم و اعمال کنم.
از آنجایی که buildbot یک سیستم توزیع شده است، منطقی است که برای هر معماری و سیستم عامل یک build host جداگانه ایجاد شود. در مورد ما، اینها کانتینرهای LXC (در مورد لینوکس) و qemu (در مورد ویندوز) خواهند بود:
vm-srv-build1 - centos 7، یک استاد buildbot و یکی از کارگران وجود خواهد داشت
vm-srv-build2 - debian 10، برای ساخت بسته های DEB
vm-srv-build3 - ویندوز 10، برای مونتاژ، می دانید برای چه
جمع آوری خواهیم کرد Rac GUI - یک رابط گرافیکی برای rac 1C برای مدیریت یک خوشه از سرورها. برای لینوکس، ابزارهای استاندارد برای هر سیستم عامل استفاده خواهد شد؛ برای ساختن یک فایل exe برای ویندوز از یک اسکریپت tcl، از آن استفاده کنید. بسته بندی آزاد.
نصب
گنو / لینوکس
مدارک کافی در اینترنت برای نصب وجود دارد 1,2. بله، و مشکل خاصی ایجاد نمی کند:
برای استاد:
البته، جمع آوری بسته ها برای هر سیستم عامل صحیح تر است، اما این خارج از حوصله مقاله است. ما همچنین توضیحات مربوط به تنظیم کانتینرها را حذف می کنیم، فقط توجه می کنم که از ProxMox VE استفاده می کنم. و همچنین باید بسته هایی را برای هر محور مورد نیاز برای مونتاژ نصب کنید (centos: rpmdevtools و غیره؛ debian: build-essential، dh-make، pbuilder و غیره)
پروژههای ساخت و سرویسهای بیلد بات به عنوان یک کاربر غیرمجاز راهاندازی میشوند، بنابراین باید در همه میزبانهایی که در این فرآیند شرکت میکنند، یکی ایجاد کنید:
adduser buildbot
در مرحله بعد، راه اندازی خودکار خدمات را به ترتیب در هر یک از میزبان ها (کانتینرها) پیکربندی می کنیم:
پس از این، می توانید یک زیرساخت دایرکتوری برای "workers" (در همه هاست ها) ایجاد کنید، برای انجام این کار، زیر کاربر 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
MS ویندوز
به عنوان یک "کارگر" برای مونتاژ تحت ویندوز، یک ماشین مجازی با آخرین نسخه Win10 استفاده خواهد شد.
برای کار شما نیاز دارید:
پس از نصب تمام موارد بالا، می توانید خود buildbot را نصب کنید:
pip install buildbot-worker
بیایید یک پوشه کاری ایجاد کنیم
md c:worker
و راه اندازی کنیم
buildbot-worker start c:worker
اگر همه چیز کار می کند (به گزارش c:workertwistd.log مراجعه کنید)، می توانید با افزودن یک مورد با فهرست کاری به رجیستری، "worker" ما را به عنوان یک سرویس ثبت کنید (دستورها در powershell اجرا می شوند که به عنوان مدیر اجرا می شوند):
این همه مربوط به "کارگران" است، لازم نیست آنها را بیشتر لمس کنید، تمام کنترل از طرف استاد است.
راه اندازی جادوگر
برای شروع، بیایید زیرساختی را برای master (در میزبان اصلی) ایجاد کنیم، برای انجام این کار، زیر کاربر buildbot ثبت نام کرده و دستورات زیر را اجرا کنید:
su - buildbot
mkdir /home/buildbot/master
cd ~
buildbot create-master master
برای بسته های آماده، یک دایرکتوری builds ایجاد کنید
mkdir /home/buildbot/builds
یک فایل master.cfg در پوشه /home/buildbot/master/ ایجاد شد. این فایل یک کد پایتون است و حاوی توضیحاتی در مورد تمام مکانیزم های سیستم است که در آینده با آن کار خواهیم کرد.
برای اتوماسیون مونتاژ بسته های نسخه های مختلف، به طوری که مجبور نباشید به کد فایل 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 جایگزین کنید.
ما بسته مونتاژ شده تمام شده و آرشیو با منابع را به استاد کپی می کنیم. اما می توانید بلافاصله فایل ها را از فایل کاری خود در مخزن یا وب سایت خود کپی کنید.
# Скопируем файл на мастер
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 در Master شروع کنیم. برای این منظور استفاده می شود اسکریپت در tcl.
با 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 در هنگام مونتاژ انجام می شود و در داخل مشخصات توضیح داده شده است؛ برای 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")]
)
)
فایل را ذخیره کنید و می توانید سعی کنید سرویس جادوگر را راه اندازی کنید:
systemctl restart buildbot-master
در لاگ بررسی می کنیم که همه چیز با پیکربندی درست است و همه چیز به طور معمول کار می کند. همه کارگران ما اکنون باید متصل شوند، که خوشبختانه در گزارش »»'/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
این فرآیند راه اندازی را کامل می کند. می توانید وضعیت فعلی را از طریق رابط وب مشاهده کنید. جایی که همچنین می توانید خطاهای ساخت را ببینید، اگر مشکلی پیش آمد، یک فرآیند ثابت را شروع کنید و غیره.
بلافاصله پس از راه اندازی، کارگران سخت کوش ما را می توان از طریق منوی "Builds" -> "Workers" مشاهده کرد.
پس از تکمیل اولین فرآیند ساخت (یعنی تغییرات در مخزن Git)، وضعیت فرآیندها در صفحه اول ظاهر می شود.
اگر با ماوس روی خط مورد نظر کلیک کنید، صفحه ای با وضعیت فعلی این فرآیند باز می شود که می توانید ببینید چه اتفاقی می افتد، چه خطاهایی و ....
کل پیکربندی جادوگر را می توانید در اینجا پیدا کنید