Be kellett állítanom a szoftvercsomagok összeállításának és a Git-tárházból a webhelyre történő szállításának folyamatát. És amikor nem is olyan régen láttam itt a Habrén egy cikket a buildbotról (link a végén), úgy döntöttem, kipróbálom és alkalmazom.
Mivel a buildbot egy elosztott rendszer, logikus lenne külön build hosztot létrehozni minden architektúrához és operációs rendszerhez. Esetünkben ezek LXC konténerek (Linux esetén) és qemu (Windows esetén):
vm-srv-build1 - centos 7, lesz egy buildbot mester és az egyik dolgozó
vm-srv-build2 - debian 10, DEB csomagok építéséhez
vm-srv-build3 - Windows 10, összeszereléshez, tudod mire
gyűjteni fogunk Rac GUI — grafikus felület az 1C rac számára a szerverfürt kezeléséhez. Linux esetén minden operációs rendszerhez szabványos eszközöket kell használni; ha tcl-szkriptből szeretne exe fájlt készíteni a Windows számára, használja a freewrap.
Telepítés
GNU / Linux
A telepítéshez elegendő dokumentáció található az interneten 1,2. Igen, és nem okoz különösebb problémát:
A mesternek:
Természetesen helyesebb lenne minden operációs rendszerhez csomagokat gyűjteni, de ez meghaladja a cikk kereteit. A konténerek munkához való beállításának leírását is elhagyjuk, csak annyit jegyzem meg, hogy ProxMox VE-t használok. Illetve telepítenie kell a csomagokat minden egyes összeszereléshez szükséges tengelyhez (centos: rpmdevtools stb.; debian: build-essential, dh-make, pbuilder stb.)
A Build projektek és a buildbot szolgáltatások privilegizált felhasználóként indulnak el, ezért létre kell hoznia egyet a folyamatban részt vevő összes gazdagépen:
adduser buildbot
Ezután konfiguráljuk a szolgáltatások automatikus elindítását az egyes gazdagépeken (tárolókon):
Ezután létrehozhat egy címtár-infrastruktúrát a „dolgozók” számára (minden gazdagépen), ehhez regisztráljon a buildbot felhasználó alatt, és futtassa a következő parancsokat:
Az első vm-srv-build1 gazdagépen:
su - buildbot
mkdir /home/buildbot/worker
cd ~
buildbot-worker create-worker --umask=0o22 --keepalive=60 worker vm-srv-build1:4000 CentOS 123456
A második gazdagépen a 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
Worker gazdagépeken a buildbot-worker szolgáltatás elindítható
systemctl start buildbot-worker
MS Windows
A Windows alatti összeszerelés „munkásaként” egy virtuális gépet használnak a Win10 legújabb kiadásával.
A munkához szüksége lesz:
Miután a fentiek mindegyike telepítve van, telepítheti magát a buildbotot:
pip install buildbot-worker
Hozzunk létre egy munkakönyvtárat
md c:worker
És induljunk
buildbot-worker start c:worker
Ha minden működik (lásd a c:workertwistd.log naplót), akkor a „munkásunkat” szolgáltatásként regisztrálhatja úgy, hogy hozzáad egy elemet a munkakönyvtárral a nyilvántartáshoz (a parancsok a rendszergazdaként futó powershellben futnak):
A „munkásoknál” ennyi, nem kell tovább nyúlni hozzájuk, minden irányítás a mestertől származik.
Varázsló beállítása
Kezdésként hozzuk létre a mester infrastruktúráját (a fő gazdagépen), ehhez regisztráljunk a buildbot felhasználó alatt, és futtassuk a következő parancsokat:
su - buildbot
mkdir /home/buildbot/master
cd ~
buildbot create-master master
A kész csomagokhoz hozzon létre egy build könyvtárat
mkdir /home/buildbot/builds
A master.cfg fájl létrejött a /home/buildbot/master/ könyvtárban. Ez a fájl egy python kód, és a rendszer összes mechanizmusának leírását tartalmazza; a jövőben ezzel fogunk dolgozni.
A különböző verziójú csomagok összeállításának automatizálása érdekében, hogy ne kelljen belemélyedni a master.cfg fájl kódjába, a rac_gui.tcl program fő szkriptjében az aktuális verzióval és kiadással rendelkező sorok kerültek a fejlécbe. :
És ezen sorok alapján a buildbot számozni fogja a csomagokat. Az adatok kinyeréséhez használja a konzol grep-hívását. A buildbotban egyszerűen nem lehet változókat definiálni a „dolgozók” számára (legalábbis nem találtam meg, hogyan). Erre használják a tulajdonságokat. Azok. Az összeállítási folyamatban lépéseket adunk a verzió és a kiadás meghatározásához, és ennek megfelelően beállítjuk a verzió és a kiadás tulajdonságait. A tulajdonságok többféleképpen állíthatók be, ebben az esetben a konzol parancs meghívásával:
# Добавим определение версии из основного файла
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"
)
)
A kapott értékeket az util.Interpolate() meghívásával helyettesítheti.
A megfelelő kiadás- és verziószám beállításához használjon szabványos sed hívást, pl. a parancs lecseréli a specifikációs fájlban lévő értékeket a szükségesekre
A kész összeállított csomagot és az archívumot forrásokkal átmásoljuk a mesternek. De azonnal átmásolhatja a fájlokat a munkafájlból a tárhelyére vagy webhelyére.
# Скопируем файл на мастер
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")
)
)
Kezdjük el az összegyűjtött csomagok másolását a tárhelyre FTP-n keresztül a masteren. Erre a célra használják forgatókönyv a tcl.
RPM-nél ennyi. Most kezdjük el leírni a DEB-csomag felépítésének algoritmusát. Mivel a különböző rendszerek csomagjainak felépítésének folyamatai függetlenek egymástól, sok lépés megismétlődik.
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-csomag esetén a következő eljárások némelyikét maga az rpm hajtja végre az összeállítás során, és a specifikációban vannak leírva; Debian esetén itt kell megtennie:
# Поменяем пути к библиотекам
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")]
)
)
Mentse el a fájlt, és megpróbálhatja elindítani a varázsló szolgáltatást:
systemctl restart buildbot-master
A naplóban ellenőrizzük, hogy minden rendben van-e a konfigurációval, és minden normálisan működik. Most minden dolgozónknak csatlakoznia kell, ami boldogan megjelenik a naplóban »»'/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
Ezzel befejeződik a beállítási folyamat. Az aktuális állapotot a webes felületen tekintheti meg. Ahol láthatod az összeállítási hibákat is, leállíthatod a lefagyott folyamatot, ha valami elromlott, stb.
Közvetlenül az indulás után az „Épít” -> „Munkások” menüponton keresztül megtekinthetőek szorgos munkásaink.
Az első összeállítási folyamat befejezése (vagyis a Git-tárhely módosítása) után a folyamatok állapota megjelenik az első oldalon.
Ha rákattint az egérrel a kívánt sorra, megnyílik egy oldal a folyamat aktuális állapotával, ahol láthatja, hogy mi történik, milyen hibák stb.