Minun piti määrittää ohjelmistopakettien kokoaminen ja toimittaminen Git-varastosta sivustolle. Ja kun näin vähän aikaa sitten täällä Habressa artikkelin buildbotista (linkki lopussa), päätin kokeilla sitä ja soveltaa sitä.
Koska buildbot on hajautettu järjestelmä, olisi loogista luoda erillinen koontipalvelin jokaiselle arkkitehtuurille ja käyttöjärjestelmälle. Meidän tapauksessamme nämä ovat LXC-säilöjä (Linuxin tapauksessa) ja qemua (Windowsin tapauksessa):
vm-srv-build1 - centos 7, siellä on buildbot-isäntä ja yksi työntekijöistä
Tietysti olisi oikeampaa kerätä paketteja jokaiselle käyttöjärjestelmälle, mutta tämä ei kuulu artikkelin soveltamisalaan. Jätämme myös pois kuvauksen konttien asettamisesta työhön, huomautan vain, että käytän ProxMox VE: tä. Ja sinun on myös asennettava paketit jokaiselle kokoonpanossa tarvittavalle akselille (centos: rpmdevtools jne.; debian: build-essential, dh-make, pbuilder jne.)
Rakennusprojektit ja buildbot-palvelut käynnistetään etuoikeutettomana käyttäjänä, joten sinun on luotava sellainen kaikille prosessiin osallistuville koneille:
adduser buildbot
Seuraavaksi määritämme palveluiden automaattisen käynnistyksen kussakin isännässä (säilössä):
Tämän jälkeen voit luoda hakemistoinfrastruktuurin "työntekijöille" (kaikille koneille), rekisteröitymällä buildbot-käyttäjän alle ja suorittamalla seuraavat komennot:
Ensimmäisessä isännässä 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
Toisessa isännässä 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 hosteissa buildbot-worker -palvelu voidaan käynnistää
systemctl start buildbot-worker
MS Windows
Windows-asennuksen "työntekijänä" käytetään virtuaalikonetta, jossa on uusin Win10-versio.
Työskentelyä varten tarvitset:
Kun kaikki edellä mainitut on asennettu, voit asentaa itse buildbotin:
pip install buildbot-worker
Luodaan työhakemisto
md c:worker
Ja käynnistetään
buildbot-worker start c:worker
Jos kaikki toimii (katso loki c:workertwistd.log), voit rekisteröidä "työntekijämme" palveluksi lisäämällä työhakemiston sisältävän kohteen rekisteriin (komennot suoritetaan powershellissä, joka toimii järjestelmänvalvojana):
Siinä kaikki "työntekijöiden" kanssa, sinun ei tarvitse koskea heihin enempää, kaikki hallinta tulee isännältä.
Ohjatun toiminnon asetukset
Aluksi luodaan isäntäkoneen infrastruktuuri (pääisännällä), rekisteröidään buildbot-käyttäjän alle ja suorita seuraavat komennot:
su - buildbot
mkdir /home/buildbot/master
cd ~
buildbot create-master master
Luo valmiille paketeille koontihakemisto
mkdir /home/buildbot/builds
Master.cfg-tiedosto luotiin /home/buildbot/master/-hakemistoon. Tämä tiedosto on python-koodi ja sisältää kuvauksen kaikista järjestelmän mekanismeista. Työskentelemme sen kanssa tulevaisuudessa.
Eri versioiden pakettien kokoamisen automatisoimiseksi, jotta ei tarvitsisi syventyä master.cfg-tiedoston koodiin, rac_gui.tcl-ohjelman pääkomentosarjassa otsikkoon lisättiin rivit nykyisellä versiolla ja julkaisulla. :
Ja näiden rivien perusteella buildbot numeroi paketit. Poimi tiedot käyttämällä konsolin grep-kutsua. Buildbotissa et yksinkertaisesti voi määrittää muuttujia "työntekijöille" (en ainakaan ole löytänyt kuinka). Tätä varten ominaisuuksia käytetään. Nuo. Kokoonpanoprosessissa lisäämme vaiheet version ja julkaisun määrittämiseksi ja vastaavasti asetamme version ja julkaisun ominaisuudet. Ominaisuudet voidaan asettaa useilla tavoilla, tässä tapauksessa kutsumalla konsolikomento:
# Добавим определение версии из основного файла
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"
)
)
Voit korvata saadut arvot kutsumalla util.Interpolate().
Aseta oikeat julkaisu- ja versionumerot käyttämällä tavallista sed-kutsua, ts. komento korvaa määritystiedoston sisällä olevat arvot vaadituilla arvoilla
Kopioimme valmiin kootun paketin ja arkiston lähteineen isännälle. Voit kuitenkin kopioida tiedostoja työtiedostostasi välittömästi arkistoon tai verkkosivustollesi.
# Скопируем файл на мастер
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")
)
)
Aloitetaan kerättyjen pakettien kopioiminen isännöintiin FTP:n kautta isäntäkoneella. Tätä tarkoitusta varten sitä käytetään käsikirjoitus tcl:ssä.
Siinä se RPM:n kanssa. Aloitetaan nyt DEB-paketin rakentamisalgoritmin kuvaaminen. Koska eri järjestelmien pakettien rakentamisprosessit ovat toisistaan riippumattomia, monet vaiheet toistetaan.
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-paketissa rpm itse suorittaa jotkin seuraavista toimenpiteistä kokoonpanon aikana, ja ne on kuvattu spesifikaatioissa; Debianille se on tehtävä täällä:
# Поменяем пути к библиотекам
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")]
)
)
Tallenna tiedosto ja voit yrittää käynnistää ohjatun palvelun:
systemctl restart buildbot-master
Tarkistamme lokista, että kaikki on kunnossa asetusten kanssa ja kaikki toimii normaalisti. Kaikkien työntekijöidemme tulisi nyt muodostaa yhteys, mikä ilmoitetaan mielellään lokissa »»'/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
Tämä päättää asennusprosessin. Voit tarkastella nykyistä tilaa verkkokäyttöliittymän kautta. Siellä voit myös nähdä rakennusvirheet, pysäyttää prosessin, jos jokin meni pieleen jne.
Heti lanseerauksen jälkeen ahkeramme työntekijämme ovat nähtävissä valikon ”Rakennus” -> ”Työmiehet” kautta.
Kun ensimmäinen koontiprosessi on valmis (eli Git-tietovarastoon tehtyjen muutosten jälkeen), prosessien tila näkyy ensimmäisellä sivulla.
Jos napsautat haluamaasi riviä hiirellä, avautuu sivu, jossa on tämän prosessin nykyinen tila, josta näet mitä tapahtuu, mitä virheitä jne.