Χρειάστηκε να ρυθμίσω τη διαδικασία συναρμολόγησης και παράδοσης πακέτων λογισμικού από ένα αποθετήριο Git στον ιστότοπο. Και όταν είδα, όχι πολύ καιρό πριν, εδώ στο Habré ένα άρθρο για το buildbot (σύνδεσμος στο τέλος), αποφάσισα να το δοκιμάσω και να το εφαρμόσω.
Δεδομένου ότι το buildbot είναι ένα κατανεμημένο σύστημα, θα ήταν λογικό να δημιουργηθεί ένας ξεχωριστός κεντρικός υπολογιστής κατασκευής για κάθε αρχιτεκτονική και λειτουργικό σύστημα. Στην περίπτωσή μας, αυτά θα είναι κοντέινερ LXC (στην περίπτωση του Linux) και qemu (στην περίπτωση των Windows):
vm-srv-build1 - centos 7, θα υπάρχει ένας κύριος buildbot και ένας από τους εργάτες
vm-srv-build2 - debian 10, για τη δημιουργία πακέτων DEB
vm-srv-build3 - windows 10, για συναρμολόγηση, ξέρετε για τι
θα μαζέψουμε Rac GUI — μια γραφική διεπαφή για rac 1C για τη διαχείριση ενός συμπλέγματος διακομιστών. Για το Linux, θα χρησιμοποιηθούν τυπικά εργαλεία για κάθε λειτουργικό σύστημα· για να δημιουργήσετε ένα αρχείο exe για Windows από ένα σενάριο tcl, χρησιμοποιήστε ελεύθερο περιτύλιγμα.
Εγκατάσταση
GNU / Linux
Υπάρχει αρκετή τεκμηρίωση στο Διαδίκτυο για εγκατάσταση 1,2. Ναι, και δεν προκαλεί ιδιαίτερα προβλήματα:
Για τον πλοίαρχο:
Φυσικά, θα ήταν πιο σωστό να συλλέγουμε πακέτα για κάθε λειτουργικό σύστημα, αλλά αυτό ξεφεύγει από το πεδίο εφαρμογής του άρθρου. Θα παραλείψουμε επίσης την περιγραφή της ρύθμισης κοντέινερ για εργασία, θα σημειώσω μόνο ότι χρησιμοποιώ το ProxMox VE. Και θα χρειαστεί επίσης να εγκαταστήσετε πακέτα για κάθε άξονα που απαιτείται για τη συναρμολόγηση (centos: rpmdevtools, κ.λπ., debian: build-essential, dh-make, pbuilder, κ.λπ.)
Τα έργα κατασκευής και οι υπηρεσίες buildbot θα κυκλοφορήσουν ως μη προνομιούχος χρήστης, επομένως πρέπει να δημιουργήσετε ένα σε όλους τους κεντρικούς υπολογιστές που συμμετέχουν στη διαδικασία:
adduser buildbot
Στη συνέχεια, θα διαμορφώσουμε την αυτόματη εκκίνηση των υπηρεσιών, αντίστοιχα, σε κάθε έναν από τους κεντρικούς υπολογιστές (κοντέινερ):
Δεδομένου ότι όλα τα σενάρια (στην περίπτωσή μας) βρίσκονται στο /usr/local/, θα πρέπει να ορίσετε τη διαδρομή προς αυτά στις μεταβλητές περιβάλλοντος:
Μετά από αυτό, μπορείτε να δημιουργήσετε μια υποδομή καταλόγου για "εργάτες" (σε όλους τους κεντρικούς υπολογιστές), για να το κάνετε αυτό, εγγραφείτε στον χρήστη 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 Windows
Ως «εργάτης» για τη συναρμολόγηση στα Windows, θα χρησιμοποιηθεί μια εικονική μηχανή με την τελευταία έκδοση του Win10.
Για να εργαστείτε θα χρειαστείτε:
Αφού εγκατασταθούν όλα τα παραπάνω, μπορείτε να εγκαταστήσετε το ίδιο το buildbot:
pip install buildbot-worker
Ας δημιουργήσουμε έναν κατάλογο εργασίας
md c:worker
Και ας ξεκινήσουμε
buildbot-worker start c:worker
Εάν όλα λειτουργούν (δείτε το αρχείο καταγραφής c:workertwistd.log), τότε μπορείτε να εγγράψετε τον "εργάτη" μας ως υπηρεσία προσθέτοντας ένα στοιχείο με τον κατάλογο εργασίας στο μητρώο (οι εντολές εκτελούνται στο powershell που εκτελείται ως διαχειριστής):
Αυτό είναι όλο με τους «εργάτες», δεν χρειάζεται να τους αγγίξετε περισσότερο, όλος ο έλεγχος προέρχεται από τον κύριο.
Ρύθμιση οδηγού
Αρχικά, ας δημιουργήσουμε την υποδομή για τον κύριο (στον κύριο κεντρικό υπολογιστή), για να το κάνετε αυτό, εγγραφείτε στον χρήστη 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().
Θα πρέπει να σημειωθεί εδώ ότι εφόσον ο κεντρικός υπολογιστής χρησιμοποιείται και για τη χειροκίνητη συναρμολόγηση πακέτων, η συναρμολόγηση θα πραγματοποιείται σε τυπικές διαδρομές.
Για να ορίσετε τους σωστούς αριθμούς έκδοσης και έκδοσης, χρησιμοποιήστε μια τυπική κλήση 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")
)
)
Ας ξεκινήσουμε τη διαδικασία αντιγραφής των συλλεχθέντων πακέτων στη φιλοξενία μέσω 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
Στο αρχείο καταγραφής θα ελέγξουμε ότι όλα είναι εντάξει με το config και ότι όλα λειτουργούν κανονικά. Όλοι οι εργαζόμενοί μας θα πρέπει τώρα να συνδεθούν, κάτι που θα αναφέρεται ευχαρίστως στο αρχείο καταγραφής »»'/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
Αυτό ολοκληρώνει τη διαδικασία εγκατάστασης. Μπορείτε να δείτε την τρέχουσα κατάσταση μέσω της διεπαφής web. Όπου μπορείτε επίσης να δείτε σφάλματα κατασκευής, να ξεκινήσετε μια παγωμένη διαδικασία εάν κάτι πήγε στραβά κ.λπ.
Αμέσως μετά την κυκλοφορία, μπορείτε να δείτε τους σκληρά εργαζόμενους μέσω του μενού "Builds" -> "Workers"
Αφού ολοκληρωθεί η πρώτη διαδικασία κατασκευής (δηλαδή αλλαγές στο αποθετήριο Git), η κατάσταση των διεργασιών θα εμφανιστεί στην πρώτη σελίδα.
Εάν κάνετε κλικ στην επιθυμητή γραμμή με το ποντίκι, θα ανοίξει μια σελίδα με την τρέχουσα κατάσταση αυτής της διαδικασίας, όπου μπορείτε να δείτε τι συμβαίνει, ποια σφάλματα κ.λπ.
Μπορείτε να βρείτε ολόκληρη τη διαμόρφωση του οδηγού εδώ