मुझे Git रिपॉजिटरी से साइट पर सॉफ़्टवेयर पैकेजों को असेंबल करने और वितरित करने की प्रक्रिया स्थापित करने की आवश्यकता थी। और जब मैंने, बहुत पहले नहीं, यहां हैबे पर बिल्डबॉट पर एक लेख (अंत में लिंक) देखा, तो मैंने इसे आज़माने और इसे लागू करने का फैसला किया।
चूंकि बिल्डबॉट एक वितरित प्रणाली है, इसलिए प्रत्येक आर्किटेक्चर और ऑपरेटिंग सिस्टम के लिए एक अलग बिल्ड होस्ट बनाना तर्कसंगत होगा। हमारे मामले में, ये LXC कंटेनर (लिनक्स के मामले में) और क्यूमू (विंडोज़ के मामले में) होंगे:
वीएम-एसआरवी-बिल्ड1 - सेंटोस 7, एक बिल्डबॉट मास्टर और श्रमिकों में से एक होगा
vm-srv-build2 - डेबियन 10, DEB पैकेज बनाने के लिए
vm-srv-build3 - विंडोज़ 10, असेंबली के लिए, आप जानते हैं कि किस लिए
हम इकट्ठा करेंगे आरएसी जीयूआई - सर्वरों के समूह के प्रबंधन के लिए 1सी रैक के लिए एक ग्राफिकल इंटरफ़ेस। लिनक्स के लिए, प्रत्येक ओएस के लिए मानक टूल का उपयोग किया जाएगा; एक टीसीएल स्क्रिप्ट से विंडोज के लिए एक exe फ़ाइल बनाने के लिए, इसका उपयोग करें फ्रीरैप.
स्थापना
ग्नू / लिनक्स
इंस्टालेशन के लिए इंटरनेट पर पर्याप्त दस्तावेज़ मौजूद हैं 1,2. हाँ, और इससे कोई विशेष समस्या नहीं होती:
गुरु के लिए:
बेशक, प्रत्येक ओएस के लिए पैकेज एकत्र करना अधिक सही होगा, लेकिन यह लेख के दायरे से बाहर है। हम काम के लिए कंटेनर स्थापित करने के विवरण को भी छोड़ देंगे, मैं केवल यह नोट करूंगा कि मैं ProxMox VE का उपयोग करता हूं। और आपको असेंबली के लिए आवश्यक प्रत्येक अक्ष के लिए पैकेज स्थापित करने की भी आवश्यकता होगी (सेंटोस: आरपीएमदेवटूल्स, आदि; डेबियन: बिल्ड-एसेंशियल, डीएच-मेक, पीबिल्डर, आदि)
बिल्ड प्रोजेक्ट और बिल्डबॉट सेवाएँ एक विशेषाधिकार प्राप्त उपयोगकर्ता के रूप में लॉन्च की जाएंगी, इसलिए आपको प्रक्रिया में भाग लेने वाले सभी होस्टों में से एक बनाना होगा:
adduser 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
वर्कर होस्ट पर, बिल्डबॉट-वर्कर सेवा शुरू की जा सकती है
systemctl start buildbot-worker
एमएस Windows
विंडोज़ के तहत असेंबली के लिए "कार्यकर्ता" के रूप में, Win10 की नवीनतम रिलीज़ वाली एक वर्चुअल मशीन का उपयोग किया जाएगा।
काम करने के लिए आपको आवश्यकता होगी:
उपरोक्त सभी स्थापित होने के बाद, आप बिल्डबॉट को स्वयं स्थापित कर सकते हैं:
pip install buildbot-worker
चलिए एक कार्यशील निर्देशिका बनाते हैं
md c:worker
और चलिए लॉन्च करते हैं
buildbot-worker start c:worker
यदि सब कुछ काम करता है (लॉग c:workertwistd.log देखें), तो आप रजिस्ट्री में कार्यशील निर्देशिका के साथ एक आइटम जोड़कर हमारे "कार्यकर्ता" को एक सेवा के रूप में पंजीकृत कर सकते हैं (आदेश प्रशासक के रूप में चलने वाले पावरशेल में निष्पादित होते हैं):
"श्रमिकों" के साथ बस इतना ही, आपको उन्हें आगे छूने की ज़रूरत नहीं है, सारा नियंत्रण मालिक से आता है।
विज़ार्ड सेटअप
आरंभ करने के लिए, आइए मास्टर (मुख्य होस्ट पर) के लिए बुनियादी ढांचा बनाएं, ऐसा करने के लिए, बिल्डबॉट उपयोगकर्ता के तहत पंजीकरण करें और निम्नलिखित कमांड चलाएं:
su - buildbot
mkdir /home/buildbot/master
cd ~
buildbot create-master master
तैयार पैकेजों के लिए, एक बिल्ड निर्देशिका बनाएं
mkdir /home/buildbot/builds
/home/buildbot/master/ निर्देशिका में एक master.cfg फ़ाइल बनाई गई थी। यह फ़ाइल एक पायथन कोड है और इसमें सिस्टम के सभी तंत्रों का विवरण है; हम भविष्य में इसके साथ काम करेंगे।
विभिन्न संस्करणों के पैकेजों की असेंबली को स्वचालित करने के लिए, ताकि मास्टर.सीएफजी फ़ाइल के कोड में गहराई से न जाना पड़े, rac_gui.tcl प्रोग्राम की मुख्य स्क्रिप्ट में, वर्तमान संस्करण और रिलीज़ वाली पंक्तियाँ हेडर में जोड़ी गईं :
और इन पंक्तियों के आधार पर, बिल्डबॉट पैकेजों को क्रमांकित करेगा। डेटा निकालने के लिए कंसोल ग्रेप कॉल का उपयोग करें। बिल्डबॉट में आप बस "श्रमिकों" के लिए चर परिभाषित नहीं कर सकते (कम से कम, मुझे यह नहीं पता कि कैसे)। संपत्तियों का उपयोग इसी के लिए किया जाता है। वे। असेंबली प्रक्रिया में, हम संस्करण और रिलीज़ को निर्धारित करने के लिए चरण जोड़ते हैं और तदनुसार, संस्करण और रिलीज़ गुणों को सेट करते हैं। गुणों को विभिन्न तरीकों से सेट किया जा सकता है, इस मामले में कंसोल कमांड को कॉल करके:
# Добавим определение версии из основного файла
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() को कॉल करके परिणामी मानों को प्रतिस्थापित कर सकते हैं।
सही रिलीज़ और संस्करण संख्याएँ सेट करने के लिए, एक मानक sed कॉल का उपयोग करें, अर्थात। कमांड विशिष्ट फ़ाइल के अंदर के मानों को आवश्यक मानों से बदल देता है
हम तैयार इकट्ठे पैकेज और स्रोतों के साथ संग्रह को मास्टर के पास कॉपी करते हैं। लेकिन आप तुरंत अपनी कार्य फ़ाइल से फ़ाइलों को अपनी रिपॉजिटरी या वेबसाइट पर कॉपी कर सकते हैं।
# Скопируем файл на мастер
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")
)
)
आइए एकत्रित पैकेजों को मास्टर पर एफ़टीपी के माध्यम से होस्टिंग में कॉपी करने की प्रक्रिया शुरू करें। इसी उद्देश्य से इसका प्रयोग किया जाता है लिखी हुई कहानी टीसीएल पर.
आरपीएम के साथ बस इतना ही। आइए अब 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")]
)
)
फ़ाइल सहेजें और आप विज़ार्ड सेवा प्रारंभ करने का प्रयास कर सकते हैं:
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
यह सेटअप प्रक्रिया पूरी करता है. आप वेब इंटरफ़ेस के माध्यम से वर्तमान स्थिति देख सकते हैं। जहां आप बिल्ड त्रुटियां भी देख सकते हैं, कुछ गलत होने पर रुकी हुई प्रक्रिया को बंद कर सकते हैं, आदि।
लॉन्च के तुरंत बाद, हमारे हार्ड वर्कर्स को "बिल्ड्स" -> "वर्कर्स" मेनू के माध्यम से देखा जा सकता है।
पहली बिल्ड प्रक्रिया पूरी होने के बाद (यानी Git रिपॉजिटरी में परिवर्तन), प्रक्रियाओं की स्थिति पहले पृष्ठ पर दिखाई देगी।
यदि आप माउस से वांछित लाइन पर क्लिक करते हैं, तो इस प्रक्रिया की वर्तमान स्थिति वाला एक पेज खुलेगा, जहां आप देख सकते हैं कि क्या हो रहा है, क्या त्रुटियां हैं, आदि।
संपूर्ण विज़ार्ड कॉन्फ़िगरेशन यहां पाया जा सकता है