เบเปเบญเบเบเปเบฒเปเบเบฑเบเบเปเบญเบเบเบฑเปเบเบเปเบฒเบเบฐเบเบงเบเบเบฒเบเบเบฐเบเบญเบเปเบฅเบฐเบชเบปเปเบเบเบธเบเบเบญเบเปเบงเบเบฒเบเบเปเบญเบเปเบเบฑเบ Git เปเบเบซเบฒเปเบงเบฑเบเปเบเบเป. เปเบฅเบฐเปเบเปเบงเบฅเบฒเบเบตเปเบเปเบฒเบเบฐเปเบเบปเปเบฒเปเบเปเปเบซเบฑเบ, เบเปเปเบเบปเบเบเปเบญเบเบซเบเปเบฒเบเบตเป, เบเบตเปเบเบตเปเบเปเบฝเบงเบเบฑเบ Habre เบเบปเบเบเบงเบฒเบกเบเปเบฝเบงเบเบฑเบ buildbot (เบเบฒเบเปเบเบทเปเบญเบกเบเปเปเปเบเบเบญเบเบเปเบฒเบเบเบญเบ), เบเปเบฒเบเบฐเปเบเบปเปเบฒเปเบเปเบเบฑเบเบชเบดเบเปเบเบเบตเปเบเบฐเบเบฐเบเบฒเบเบฒเบกเบกเบฑเบเปเบฅเบฐเบเปเบฒเปเบเปเบกเบฑเบ.
เปเบเบทเปเบญเบเบเบฒเบ buildbot เปเบเบฑเบเบฅเบฐเบเบปเบเบเบฒเบเปเบเบเบขเบฒเบ, เบกเบฑเบเบเบฐเปเบเบฑเบเบเบฒเบเบชเบปเบกเปเบซเบเบชเบปเบกเบเบปเบเบเบตเปเบเบฐเบชเปเบฒเบเปเบเบปเปเบฒเบเบฒเบเบชเปเบฒเบเปเบเบเบเปเบฒเบเบซเบฒเบเบชเปเบฒเบฅเบฑเบเปเบเปเบฅเบฐเบชเบฐเบเบฒเบเบฑเบเบเบฐเบเบฐเบเปเบฒเปเบฅเบฐเบฅเบฐเบเบปเบเบเบฐเบเบดเบเบฑเบเบเบฒเบ. เปเบเบเปเบฅเบฐเบเบตเบเบญเบเบเบงเบเปเบฎเบปเบฒ, เปเบซเบผเบปเปเบฒเบเบตเปเปเบกเปเบเบเบฑเบเบเบธ LXC (เปเบเบเปเบฅเบฐเบเบตเบเบญเบ Linux) เปเบฅเบฐ qemu (เปเบเบเปเบฅเบฐเบเบตเบเบญเบ Windows):
- vm-srv-build1 - centos 7, เบเบฐเบกเบต buildbot master เปเบฅเบฐเบซเบเบถเปเบเปเบเบเบฐเบเบฑเบเบเบฒเบ.
- vm-srv-build2 - debian 10, เบชเปเบฒเบฅเบฑเบเบเบฒเบเบชเปเบฒเบเปเบเบฑเบเปเบเบฑเบ DEB
- vm-srv-build3 - windows 10, เบชเปเบฒเบฅเบฑเบเบเบฒเบเบเบฐเบเบญเบ, เบเปเบฒเบเบฎเบนเปเบงเปเบฒเบชเปเบฒเบฅเบฑเบเบซเบเบฑเบ
เบเบงเบเปเบฎเบปเบฒเบเบฐเปเบเบฑเบเบเปเบฒ
เบเบฒเบเบเบฑเปเบเบเปเบฒ
GNU / Linux
เบกเบตเปเบญเบเบฐเบชเบฒเบเบเบฝเบเบเปเปเบเบญเบดเบเปเบเบตเปเบเบฑเบเบชเปเบฒเบฅเบฑเบเบเบฒเบเบเบดเบเบเบฑเปเบ
เบชเปเบฒเบฅเบฑเบเปเบกเปเบเบปเบ:
pip3 install buildbot
pip3 install twisted
pip3 install autobahn
pip3 install pysqlite3
pip3 install sqlalchemy sqlalchemy-migrate
pip3 install buildbot-www buildbot-grid-view buildbot-console-view buildbot-waterfall-view
pip3 install python-dateutil
เบชเปเบฒเบฅเบฑเบ "เบเบปเบเบเบฒเบ", เบเบตเปเปเบกเปเบเบเบฝเบเบเป:
pip3 install buildbot-worker
เปเบเปเบเบญเบ, เบกเบฑเบเบเบฐเบเบทเบเบเปเบญเบเบเบงเปเบฒเบเบตเปเบเบฐเบฅเบงเบเบฅเบงเบกเปเบเบฑเบเปเบเบฑเบเบชเปเบฒเบฅเบฑเบเปเบเปเบฅเบฐ OS, เปเบเปเบเบตเปเปเบกเปเบเปเบเบตเบเบเบญเบเปเบเบเบเบญเบเบเบปเบเบเบงเบฒเบก. เบเบงเบเปเบฎเบปเบฒเบเบฑเบเบเบฐเบเบปเบเปเบงเบฑเปเบเบเปเบฒเบญเบฐเบเบดเบเบฒเบเบเปเบฝเบงเบเบฑเบเบเบฒเบเบเบฑเปเบเบเปเบฒเบเบนเปเบเบญเบเปเบเบเปเบเบตเบชเปเบฒเบฅเบฑเบเบเบฒเบเปเบฎเบฑเบเบงเบฝเบ, เบเปเบฒเบเบฐเปเบเบปเปเบฒเบเบฝเบเปเบเปเบเบฐเบชเบฑเบเปเบเบเบงเปเบฒเบเปเบญเบเปเบเป ProxMox VE. เปเบฅเบฐเบเปเบฒเบเบเบฑเบเบเบฐเบเปเบญเบเบเบดเบเบเบฑเปเบเบเบธเบเบชเปเบฒเบฅเบฑเบเปเบเปเบฅเบฐเปเบเบเบเบตเปเบเปเบญเบเบเบฒเบเบชเปเบฒเบฅเบฑเบเบเบฒเบเบเบฐเบเบญเบ (centos: rpmdevtools, เปเบฅเบฐเบญเบทเปเบเป; debian: build-essential, dh-make, pbuilder, เปเบฅเบฐเบญเบทเปเบเป.)
เปเบเบเบเบฒเบเบเปเปเบชเปเบฒเบเปเบฅเบฐเบเปเบฅเบดเบเบฒเบ buildbot เบเบฐเบเบทเบเปเบเบตเบเบเบปเบงเปเบเบฑเบเบเบนเปเปเบเปเบเบตเปเบเปเปเบกเบตเบชเบดเบเบเบดเบเบดเปเบชเบ, เบเบฑเปเบเบเบฑเปเบเบเปเบฒเบเบเปเบฒเปเบเบฑเบเบเปเบญเบเบชเปเบฒเบเบซเบเบถเปเบเปเบเบเบธเบเปเบเบปเปเบฒเบเบฒเบเบเบตเปเปเบเบปเปเบฒเบฎเปเบงเบกเปเบเบเบฐเบเบงเบเบเบฒเบ:
adduser buildbot
เบเปเปเปเบ, เบเบงเบเปเบฎเบปเบฒเบเบฐเบเบฑเปเบเบเปเบฒเบเบฒเบเปเบเบตเบเบเบปเบงเบญเบฑเบเบเบฐเปเบเบกเบฑเบเบเบญเบเบเบฒเบเบเปเบฅเบดเบเบฒเบ, เบเบฒเบกเบฅเปเบฒเบเบฑเบ, เปเบเปเบเปเบฅเบฐเปเบเบปเปเบฒเบเบฒเบ (เบเบฑเบเบเบธ):
เบซเบเปเบงเบเบเบฒเบเบฅเบฐเบเบปเบเปเบเบทเปเบญเปเบฅเปเบเบเบปเบงเบเปเบงเบเบชเปเบฒเบ:
touch /etc/systemd/buildbot-master.service
[Unit]
Description=BuildBot master service
After=network.target
[Service]
User=buildbot
Group=buildbot
WorkingDirectory=/home/buildbot/master
ExecStart=/usr/local/bin/buildbot start --nodaemon
ExecReload=/bin/kill -HUP $MAINPID
[Install]
WantedBy=multi-user.target
เปเบฅเบฐ "เบเบฐเบเบฑเบเบเบฒเบ"
touch /etc/systemd/buildbot-worker.service
[Unit]
Description=BuildBot worker service
After=network.target
[Service]master
User=buildbot
Group=buildbot
WorkingDirectory=/home/buildbot/worker
ExecStart=/usr/local/bin/buildbot-worker start --nodaemon
[Install]
WantedBy=buildbot-master.service
เปเบเบทเปเบญเบเบเบฒเบเบชเบฐเบเบฃเบดเบเบเบฑเบเปเบปเบ (เปเบเบเปเบฅเบฐเบเบตเบเบญเบเบเบงเบเปเบฎเบปเบฒ) เบขเบนเปเปเบ /usr/local/, เบเปเบฒเบเบเบงเบเบเบฑเปเบเปเบชเบฑเปเบเบเบฒเบเปเบเบซเบฒเบเบงเบเบกเบฑเบเบขเบนเปเปเบเบเบปเบงเปเบเบชเบฐเบเบฒเบเปเบงเบเบฅเปเบญเบก:
nano /root/.bash_profile
PATH=$PATH:$HOME/.local/bin:$HOME/bin:/usr/local/bin
เบซเบผเบฑเบเบเบฒเบเบเบฑเปเบ, เบเปเบฒเบเบชเบฒเบกเบฒเบเบชเปเบฒเบเปเบเบเบชเปเบฒเบเบเบทเปเบเบเบฒเบเบเบญเบเปเบเปเบฅเบเบฐเบเปเบฅเบตเบชเปเบฒเบฅเบฑเบ "เบเบฐเบเบฑเบเบเบฒเบ" (เปเบเบเบธเบเปเบฎเบ), เปเบเบทเปเบญเปเบฎเบฑเบเบชเบดเปเบเบเบตเป, เบฅเบปเบเบเบฐเบเบฝเบเบเบฒเบเปเบเปเบเบนเปเปเบเป buildbot เปเบฅเบฐเบเปเบฒเปเบเบตเบเบเบฒเบเบเปเบฒเบชเบฑเปเบเบเปเปเปเบเบเบตเป:
เปเบ host เบเปเบฒเบญเบดเบ 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
เปเบ hosts เบเบฐเบเบฑเบเบเบฒเบ, เบเบฒเบเบเปเบฅเบดเบเบฒเบ buildbot-worker เบชเบฒเบกเบฒเบเปเบฅเบตเปเบกเบเบปเปเบเปเบเป
systemctl start buildbot-worker
MS Windows
เปเบเบเบฒเบเบฐเปเบเบฑเบ "เบเบนเปเปเบฎเบฑเบเบงเบฝเบ" เบชเปเบฒเบฅเบฑเบเบเบฒเบเบเบฐเบเบญเบเบเบฒเบเปเบเป Windows, เปเบเบทเปเบญเบ virtual เบเบตเปเบกเบตเบเบฒเบเบเปเบญเบเบซเบฅเปเบฒเบชเบธเบเบเบญเบ Win10 เบเบฐเบเบทเบเบเปเบฒเปเบเป.
เปเบเบทเปเบญโเปเบฎเบฑเบโเบงเบฝเบโเบเปเบฒเบโเบเบฐโเบเปเบญเบโเบเบฒเบโ:
Python PyWIN Git - เปเบเบทเปเบญเบเบดเบเบเบฑเปเบเบชเบดเปเบเบเบตเปเปเบเบเบเปเบฒเบเบเบฑเบเปเบ Python, เบเปเบฒเบเบเปเบฒเปเบเบฑเบเบเปเบญเบเบเบฒเบงเปเบซเบฅเบ
เบชเปเบฒเบเปเบเบทเปเบญเบเบกเบทเบชเบณเบฅเบฑเบ Visual Studio 2019 - 7Zip
เบซเบผเบฑเบเบเบฒเบเบเบตเปเบเบฑเบเบซเบกเบปเบเบเปเบฒเบเปเบเบดเบเปเบเปเบเบทเบเบเบดเบเบเบฑเปเบ, เบเปเบฒเบเบชเบฒเบกเบฒเบเบเบดเบเบเบฑเปเบ buildbot เบเบปเบงเบเบญเบเบกเบฑเบเปเบญเบ:
pip install buildbot-worker
เปเบซเปเบชเปเบฒเบเปเบเปเบฅเบเบฐเบเปเบฅเบตเบเบตเปเปเบฎเบฑเบเบงเบฝเบ
md c:worker
เปเบฅเบฐเปเบซเปเปเบเบตเบเบเบปเบง
buildbot-worker start c:worker
เบเปเบฒเบเบธเบเบชเบดเปเบเบเบธเบเบขเปเบฒเบเปเบฎเบฑเบเบงเบฝเบ (เปเบเบดเปเบเบเบฑเบเบเบถเบ c:workertwistd.log), เบซเบผเบฑเบเบเบฒเบเบเบฑเปเบเบเปเบฒเบเบชเบฒเบกเบฒเบเบฅเบปเบเบเบฐเบเบฝเบ "เบเบฐเบเบฑเบเบเบฒเบ" เบเบญเบเบเบงเบเปเบฎเบปเบฒเปเบเบฑเบเบเบฒเบเบเปเบฅเบดเบเบฒเบเปเบเบเบเบฒเบเปเบเบตเปเบกเบฅเบฒเบเบเบฒเบเบเบตเปเบกเบตเปเบเปเบฅเบเบฐเบเปเบฅเบตเบเบตเปเปเบฎเบฑเบเบงเบฝเบเบขเบนเปเปเบเบเบฐเบเบฝเบ (เบเปเบฒเบชเบฑเปเบเบเบทเบเบเบฐเบเบดเบเบฑเบเปเบ powershell เปเบฅเปเบเปเบเบฑเบเบเบนเปเปเบเบดเปเบเปเบเบ):
buildbot_worker_windows_service.exe --user VM-SRV-BUILD3buildbot --password 123456 --startup auto install
New-ItemProperty -path Registry::HKEY_LOCAL_MACHINESYSTEMCurrentControlSetservicesBuildBotParameters -Name directories -PropertyType String -Value c:worker
เปเบฅเบฐเบเปเบฒเบเบชเบฒเบกเบฒเบเปเบฅเบตเปเบกเบเบปเปเบเบเบฒเบเบเปเบฅเบดเบเบฒเบ
Start-Service buildbot
เบเบฑเปเบเปเบกเปเบเบเบฑเบเบซเบกเบปเบเบเบฑเบ "เบเบฐเบเบฑเบเบเบฒเบ", เบเปเบฒเบเบเปเปเบเปเบฒเปเบเบฑเบเบเปเบญเบเปเบเบฐเบเปเบญเบเบเบงเบเปเบเบปเบฒเบญเบตเบเบเปเปเปเบ, เบเบฒเบเบเบงเบเบเบธเบกเบเบฑเบเบซเบกเบปเบเปเบกเปเบเบกเบฒเบเบฒเบเปเบกเปเบเบปเบ.
เบเบฒเบเบเบฑเปเบเบเปเบฒเบเบปเบงเบเปเบงเบเบชเปเบฒเบ
เปเบเบทเปเบญเปเบฅเบตเปเบกเบเบปเปเบเบเปเบงเบ, เปเบซเปเบชเปเบฒเบเปเบเบเบชเปเบฒเบเบเบทเปเบเบเบฒเบเบชเปเบฒเบฅเบฑเบเปเบกเปเบเบปเบ (เบขเบนเปเปเบเปเบเบปเปเบฒเบเบฒเบเบเบปเปเบเบเป), เปเบเบทเปเบญเปเบฎเบฑเบเบชเบดเปเบเบเบตเป, เบฅเบปเบเบเบฐเบเบฝเบเบเบฒเบเปเบเปเบเบนเปเปเบเป buildbot เปเบฅเบฐเบเปเบฒเปเบเบตเบเบเบฒเบเบเปเบฒเบชเบฑเปเบเบเปเปเปเบเบเบตเป:
su - buildbot
mkdir /home/buildbot/master
cd ~
buildbot create-master master
เบชเปเบฒเบฅเบฑเบเบเบธเบเบเบตเปเบเบฝเบกเบเปเบญเบก, เบชเปเบฒเบเปเบเปเบฅเบเบฐเบเปเบฅเบต builds
mkdir /home/buildbot/builds
เปเบเบฅเป master.cfg เบเบทเบเบชเปเบฒเบเบเบทเปเบเบขเบนเปเปเบเบฅเบฐเบเบปเบ /home/buildbot/master/. เปเบเบฅเปเบเบตเปเปเบกเปเบเบฅเบฐเบซเบฑเบ python เปเบฅเบฐเบกเบตเบเปเบฒเบญเบฐเบเบดเบเบฒเบเบเปเบฝเบงเบเบฑเบเบเบปเบเปเบเบเบฑเบเบซเบกเบปเบเบเบญเบเบฅเบฐเบเบปเบเบเบตเปเบเบงเบเปเบฎเบปเบฒเบเบฐเปเบฎเบฑเบเบงเบฝเบเบเบฑเบเบกเบฑเบเปเบเบญเบฐเบเบฒเบเบปเบ.
nano /home/buildbot/master/master.cfg
import os, re
from buildbot.plugins import steps, util, schedulers, worker, changes, reporters
c= BuildmasterConfig ={}
# ะะฟะธัะฐะฝะธะต ะฝะฐัะธั
ัะฐะฑะพัะธั
.
c['workers'] = [ worker.Worker('CentOS', '123456'), worker.Worker('Debian-10', '123456'), worker.Worker('Windows-10', '123456')]
c['protocols'] = {'pb': {'port': 4000}}
# ะฃะบะฐะทะฐะฝะธะต ะผะฐััะตัั ะบะฐะบะพะน ัะตะฟะพะทะธัะพัะธะน ะพััะปะตะถะธะฒะฐัั
c['change_source'] = []
c['change_source'].append(changes.GitPoller(
repourl = 'https://bitbucket.org/svk28/rac-gui.git',
project = 'Rac-GUI',
branches = True,
pollInterval = 60
)
)
# ัะปัะถะฑะฐ ะทะฐะฟััะบะฐ ัะฑะพัะบะธ
c['schedulers'] = []
c['schedulers'].append(schedulers.SingleBranchScheduler(
name="Rac-GUI-schedulers",
change_filter=util.ChangeFilter(branch='master'),
builderNames=["Rac-GUI-RPM-builder", "Rac-GUI-DEB-builder", "Rac-GUI-WIN-builder"],
properties = {'owner': 'admin'}
)
)
@util.renderer
######################################3
# ะกะฑะพัะบะฐ RPM-ะฟะฐะบะตัะฐ
rac_gui_build_RPM = util.BuildFactory()
rac_gui_build_RPM.addStep(steps.Git(
repourl = 'https://bitbucket.org/svk28/rac-gui.git',
workdir = 'rac-gui',
haltOnFailure = True,
submodules = True,
mode='full',
progress = True)
)
เปเบเบทเปเบญเบญเบฑเบเบเบฐเปเบเบกเบฑเบเบเบฒเบเบเบฐเบเบญเบเบเบฒเบเบซเบธเปเบกเบซเปเปเบเบญเบเบชเบฐเบเบฑเบเบเบตเปเปเบเบเบเปเบฒเบเบเบฑเบ, เปเบเบทเปเบญเบเปเปเปเบซเปเบกเบตเบเบฒเบเปเบเบฒเบฐเปเบฅเบดเบเปเบเบปเปเบฒเปเบเปเบเบฅเบฐเบซเบฑเบเบเบญเบเปเบเบฅเป master.cfg, เปเบเบชเบฐเบเบดเบเบเบปเปเบเบเปเบเบญเบเปเบเบเบเบฒเบ rac_gui.tcl, เบชเบฒเบเบเบตเปเบกเบตเบชเบฐเบเบฑเบเบเบฐเบเบธเบเบฑเบเปเบฅเบฐเบเบฒเบเบเปเบญเบเปเบเปเบเบทเบเปเบเบตเปเบกเปเบเบปเปเบฒเปเบ header. :
######################################################
# Rac GUI
...
# version: 1.0.3
# release: 1
เปเบฅเบฐเบญเบตเบเปเบชเปเบชเบฒเบเปเบซเบผเบปเปเบฒเบเบตเป, buildbot เบเบฐเปเบฅเบเบเบธเบ. เปเบเบทเปเบญเบชเบฐเบเบฑเบเบเปเปเบกเบนเบ, เปเบซเปเปเบเป console grep call. เปเบ buildbot เบเปเบฒเบเบเบฝเบเปเบเปเบเปเปเบชเบฒเบกเบฒเบเบเปเบฒเบเบปเบเบเบปเบงเปเบเบชเปเบฒเบฅเบฑเบ "เบเบฐเบเบฑเบเบเบฒเบ" (เบขเปเบฒเบเบซเบเปเบญเบ, เบเปเบญเบเบเปเปเบเบปเบเบงเบดเบเบต). เบเบตเปเปเบกเปเบเบชเบดเปเบเบเบตเปเบเบธเบเบชเบปเบกเบเบฑเบเบเบทเบเบเปเบฒเปเบเปเบชเปเบฒเบฅเบฑเบ. เปเบซเบผเบปเปเบฒเบเบฑเปเบ. เปเบเบเบฐเบเบงเบเบเบฒเบเบเบฐเบเบญเบ, เบเบงเบเปเบฎเบปเบฒเปเบเบตเปเบกเบเบฑเปเบเบเบญเบเปเบเบทเปเบญเบเปเบฒเบเบปเบเบชเบฐเบเบฑเบเปเบฅเบฐเบเบฒเบเบเปเบญเบเปเบฅเบฐ, เบเบฒเบกเบเบงเบฒเบกเปเบซเบกเบฒเบฐเบชเบปเบก, เบเปเบฒเบเบปเบเบชเบฐเบเบฑเบเปเบฅเบฐเบเบธเบเบชเบปเบกเบเบฑเบเบเบฒเบเบเปเบญเบ. เบเบธเบเบชเบปเบกเบเบฑเบเบชเบฒเบกเบฒเบเบเบทเบเบเปเบฒเบเบปเบเบเปเบงเบเบงเบดเบเบตเบเปเบฒเบเป, เปเบเบเปเบฅเบฐเบเบตเบเบตเปเปเบเบเบเบฒเบเปเบเบซเบฒเบเปเบฒเบชเบฑเปเบ console:
# ะะพะฑะฐะฒะธะผ ะพะฟัะตะดะตะปะตะฝะธะต ะฒะตััะธะธ ะธะท ะพัะฝะพะฒะฝะพะณะพ ัะฐะนะปะฐ
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.ShellCommand(
command=["tar", "czf", util.Interpolate("/home/buildbot/rpmbuild/SOURCES/rac-gui-%(prop:version)s-%(prop:release)s.tar.gz"), "../rac-gui"]
)
)
เบกเบฑเบเบเบงเบเบเบฐเบชเบฑเบเปเบเบเปเบซเบฑเบเบขเบนเปเบเบตเปเบเบตเปเบงเปเบฒเบเบฑเบเบเบฑเปเบเปเบเปเปเบเบปเปเบฒเบเบฒเบเบเบฑเบเบเบทเบเบเปเบฒเปเบเปเบชเปเบฒเบฅเบฑเบเบเบฒเบเบเบฐเบเบญเบเบเบนเปเบกเบทเบเบญเบเบเบธเบ, เบเบฒเบเบเบธเบกเบเบธเบกเบเบฐเบเบฑเบเบเบถเปเบเบเบฒเบกเปเบชเบฑเปเบเบเบฒเบเบกเบฒเบเบเบฐเบเบฒเบ.
# ะะพะฟะธััะตะผ spec
rac_gui_build_RPM.addStep(steps.ShellCommand(
command=["cp", "../rac-gui/rac_gui.spec", "/home/buildbot/rpmbuild/SPECS/rac_gui.spec"]))
เปเบเบทเปเบญเบเปเบฒเบเบปเบเบเบฒเบเบเปเบญเบเปเบฅเบฐเบเบปเบงเปเบฅเบเบเบตเปเบเบทเบเบเปเบญเบ, เปเบซเปเปเบเป sed call เบกเบฒเบเบเบฐเบเบฒเบ, i.e. เบเปเบฒเบชเบฑเปเบเบเบปเบเปเบเบเบเปเบฒเบเบฒเบเปเบเปเบเบฅเป spec เบเบฑเบเบชเบดเปเบเบเบตเปเบเปเบญเบเบเบฒเบ
# ะผะตะฝัะตะผ ะฒะตััะธั
rac_gui_build_RPM.addStep(steps.ShellCommand(
command=["sed", "-i", util.Interpolate("s/.*Version:.*/Version:t%(prop:version)s/"), "/home/buildbot/rpmbuild/SPECS/rac_gui.spec"]))
# ะผะตะฝัะตะผ ัะตะปะธะท
rac_gui_build_RPM.addStep(steps.ShellCommand(
command=["sed", "-i", util.Interpolate("s/.*Release:.*/Release:t%(prop:release)s/"), "/home/buildbot/rpmbuild/SPECS/rac_gui.spec"]))
# ะทะฐะฟััะบะฐะตะผ ะฟัะพัะตัั ัะฑะพัะบะธ
rac_gui_build_RPM.addStep(steps.RpmBuild(
specfile="/home/buildbot/rpmbuild/SPECS/rac_gui.spec",
dist='.el5',
topdir='/home/buildbot/rpmbuild',
builddir='/home/buildbot/rpmbuild/build',
rpmdir='/home/buildbot/rpmbuild/RPMS',
sourcedir='/home/buildbot/rpmbuild/SOURCES'
)
)
เบเบงเบเปเบฎเบปเบฒเบเบฑเบเบฅเบญเบเบเบธเบเบเบตเปเบเบฐเบเบญเบเบชเปเบฒเปเบฅเบฑเบเปเบฅเปเบงเปเบฅเบฐเปเบเปเบกเบเบฑเบเปเบเบฑเบเบเบตเปเบกเบตเปเบซเบผเปเบเปเบเบซเบฒเปเบกเปเบเบปเบ. เปเบเปเบเปเบฒเบเบชเบฒเบกเบฒเบเบเบฑเบเบฅเบญเบเปเบเบฅเปเบเบฒเบเปเบเบฅเปเบเปเบญเบเปเบฎเบฑเบเบงเบฝเบเบเบญเบเบเปเบฒเบเปเบเบซเบฒเบเปเบญเบเปเบเบฑเบเบกเปเบฝเบเบซเบผเบทเปเบงเบฑเบเปเบเบเปเบเบญเบเบเปเบฒเบเบเบฑเบเบเบต.
# ะกะบะพะฟะธััะตะผ ัะฐะนะป ะฝะฐ ะผะฐััะตั
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")
)
)
เปเบซเปเปเบฅเบตเปเบกเบเบปเปเบเบเบฐเบเบงเบเบเบฒเบเบเบญเบเบเบฒเบเบเบฑเบเบฅเบญเบเบเบธเบเบเบตเปเปเบเบฑเบเบเปเบฒเปเบ hosting เบเปเบฒเบ FTP เปเบเปเบกเปเบเบปเบ. เบชเปเบฒเบฅเบฑเบเบเบธเบเบเบฐเบชเบปเบเบเบตเป, เบกเบฑเบเบเบทเบเบเปเบฒเปเบเป
rac_gui_build_RPM.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.noarch.rpm"),
util.Interpolate("--remote-file=uploads/rac-gui/rac-gui-%(prop:version)s-%(prop:release)s.noarch.rpm")]
)
)
rac_gui_build_RPM.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.tar.gz"),
util.Interpolate("--remote-file=uploads/rac-gui/rac-gui-%(prop:version)s-%(prop:release)s.tar.gz")]
)
)
เบเบฑเปเบเปเบกเปเบเบเบฑเบ RPM. เบเบญเบเบเบตเปเปเบซเปเปเบฅเบตเปเบกเบเบปเปเบเบเบฒเบเบญเบฐเบเบดเบเบฒเบ algorithm เบชเปเบฒเบฅเบฑเบเบเบฒเบเบเปเปเบชเปเบฒเบเบเบธเบ 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 เบเบปเบงเบกเบฑเบเปเบญเบเปเบเบฅเบฐเบซเบงเปเบฒเบเบเบฒเบเบเบฐเบเบญเบเปเบฅเบฐเบเบทเบเบญเบฐเบเบดเบเบฒเบเบขเบนเปเปเบ spec เบชเปเบฒเบฅเบฑเบ 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")]
)
)
เปเบฅเบฐเปเบฎเบฑเบเปเบฅเปเบงเบเบฑเบ DEB, เบเบฝเบงเบเบตเป windows!
rac_gui_build_WIN = util.BuildFactory()
rac_gui_build_WIN.addStep(steps.Git(
repourl = 'https://bitbucket.org/svk28/rac-gui.git',
haltOnFailure = True,
submodules = True,
mode='full',
workdir='build',
progress = True)
)
เปเบเบทเปเบญเบเบเบฒเบ grep เปเบฅเบฐ sed เบเปเปเปเบกเปเบเบกเบฒเบเบเบฐเบเบฒเบเปเบ Windows (เบซเบผเบทเบกเบต?), เบเบงเบเปเบฎเบปเบฒเบเบฐเปเบเป powershell
# ะะพะฑะฐะฒะธะผ ะพะฟัะตะดะตะปะตะฝะธะต ะฒะตััะธะธ ะธะท ะพัะฝะพะฒะฝะพะณะพ ัะฐะนะปะฐ
rac_gui_build_WIN.addStep(
steps.SetPropertyFromCommand(
command="powershell -command "((Get-Content .rac_gui.tcl | Select-String -Pattern 'version:') -split 's')[2]",
property="version"
)
)
# ะะพะฑะฐะฒะธะผ ะพะฟัะตะดะตะปะตะฝะธะต ัะตะปะธะทะฐ ะธะท ะพัะฝะพะฒะฝะพะณะพ ัะฐะนะปะฐ
rac_gui_build_WIN.addStep(
steps.SetPropertyFromCommand(
command="powershell -command "((Get-Content .rac_gui.tcl | Select-String -Pattern 'release:') -split 's')[2]",
property="release"
)
)
# ะกะพะทะดะฐะดะธะผ ะทะฐะฟััะบะฐะตะผัะน ัะฐะนะป
rac_gui_build_WIN.addStep(steps.ShellCommand(
command=["c:binfreewrap.exe", "rac_gui.tcl"]))
# ะทะฐะฟะฐะบัะตะผ ัะพ, ััะพ ะฟะพะปััะธะปะพัั
rac_gui_build_WIN.addStep(steps.ShellCommand(
command=["c:Program Files7-zip7z.exe", "a", "-r", util.Interpolate("..rac-gui_%(prop:version)s-%(prop:release)s.win.zip"), "..build"]))
# ัะบะพะฟะธััะตะผ ะฝะฐ ะผะฐััะตั
rac_gui_build_WIN.addStep(
steps.FileUpload(
workersrc=util.Interpolate("..rac-gui_%(prop:version)s-%(prop:release)s.win.zip"),
masterdest=util.Interpolate("/home/buildbot/builds/rac-gui_%(prop:version)s-%(prop:release)s.win.zip")
)
)
# ะกะบะพะฟะธััะตะผ ัะฐะนะป ะฝะฐ ั
ะพััะธะฝะณ
rac_gui_build_WIN.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.win.zip"),
util.Interpolate("--remote-file=uploads/rac-gui/rac-gui_%(prop:version)s-%(prop:release)s.win.zip")]
)
)
# ะขัั ะพะฟัะตะดะตะปัะตะผ ะบะฐะบะธะต ัะฑะพััะธะบะธ ั ะฝะฐั ะตััั
c['builders'] = [
util.BuilderConfig(name="Rac-GUI-RPM-builder", workername='CentOS', factory=rac_gui_build_RPM),
util.BuilderConfig(name="Rac-GUI-DEB-builder", workername='Debian-10', factory=rac_gui_build_DEB),
util.BuilderConfig(name="Rac-GUI-WIN-builder", workername='Windows-10', factory=rac_gui_build_WIN),
]
เบเบงเบเปเบฎเบปเบฒเบเบฐเปเบเปเบญเบตเปเบกเบงเปเบเบทเปเบญเปเบเปเบเบเบญเบเบเปเบฒเบเบเปเบฝเบงเบเบฑเบเบชเบฐเบเบฒเบเบฐเบเบญเบเบเบฐเบเบงเบเบเบฒเบเบชเปเบฒเบ.
c['services'] = []
template=u'''
<h4>Build status: {{ summary }}</h4>
<p> Worker used: {{ workername }}</p>
{% for step in build['steps'] %}
<p> {{ step['name'] }}: {{ step['result'] }}</p>
{% endfor %}
<p><b> -- The Buildbot</b></p>
'''
mailNotifier = reporters.MailNotifier(fromaddr="[email protected]",
sendToInterestedUsers=False,
mode=('all'),
extraRecipients=["[email protected]"],
relayhost="mail.domain.ru",
smtpPort=587,
smtpUser="[email protected]",
smtpPassword="******",
messageFormatter=reporters.MessageFormatter(
template=template, template_type='html',
wantProperties=True, wantSteps=True))
c['services'].append(mailNotifier)
# ะัะฝะพะฒะฝัะต ะฝะฐัััะพะนะบะธ ะผะฐััะตัะฐ
c['title'] = "The process of bulding"
c['titleURL'] = "http://vm-srv-build1:80/"
c['buildbotURL'] = "http://vm-srv-build1/"
c['www'] = dict(port=80,
plugins=dict(waterfall_view={}, console_view={}, grid_view={}))
c['db'] = {
'db_url' : "sqlite:///state.sqlite"
}
เบเบฑเบเบเบถเบเปเบเบฅเปเปเบฅเบฐเบเปเบฒเบเบชเบฒเบกเบฒเบเบเบฐเบเบฒเบเบฒเบกเปเบฅเบตเปเบกเบเบปเปเบเบเบฒเบเบเปเบฅเบดเบเบฒเบเบเบญเบเบเบงเบฒเบกเบเบฒเบงเบเบฒ:
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
เบเบตเปเปเบฎเบฑเบเบชเปเบฒเปเบฅเบฑเบเบเบฐเบเบงเบเบเบฒเบเบเบดเบเบเบฑเปเบ. เบเปเบฒเบเบชเบฒเบกเบฒเบเปเบเบดเปเบเบชเบฐเบเบฒเบเบฐเบเบฐเบเบธเบเบฑเบเปเบเปเปเบเบเบเปเบฒเบเบเบฒเบเปเบเปเบเบญเบเปเบงเบฑเบเปเบเบเป. เบเปเบญเบโเบเบตเปโเบเปเบฒเบโเบเบฑเบโเบชเบฒโเบกเบฒเบโเปเบเบดเปเบโเบเบงเบฒเบกโเบเบดเบโเบเบฒเบโเบเบฒเบโเบเปเปโเบชเปเบฒเบโ, เปเบเบฐโเบเบฐโเบเบงเบโเบเบฒเบ frozen เบเปเบฒโเบซเบฒเบโเบงเปเบฒโเบเบฒเบโเบชเบดเปเบโเบเบฒเบโเบขเปเบฒเบโเบเบดเบโเบเบฒเบโ, เปเบฅเบฐโเบญเบทเปเบเปโ.
เบเบฑเบเบเบตเบซเบผเบฑเบเบเบฒเบเบเบฒเบเปเบเบตเบเบเบปเบง, เบเบปเบเบเบฒเบเบซเบเบฑเบเบเบญเบเบเบงเบเปเบฎเบปเบฒเบชเบฒเบกเบฒเบเปเบเบดเปเบเปเบเปเบเปเบฒเบเปเบกเบเบน "เบชเปเบฒเบ" -> "เบเบปเบเบเบฒเบ"
เบซเบผเบฑเบเบเบฒเบเบเบฐเบเบงเบเบเบฒเบเบชเปเบฒเบเบเปเบฒเบญเบดเบเบชเปเบฒเปเบฅเบฑเบ (i. e. เบเบฒเบเบเปเบฝเบเปเบเบเบเบฑเบ Git repository), เบชเบฐเบเบฒเบเบฐเบเบฒเบเบเบญเบเบเบฐเบเบงเบเบเบฒเบเบเบฐเบเบฒเบเบปเบเบขเบนเปเปเบเบซเบเปเบฒเบเปเบฒเบญเบดเบ.
เบเปเบฒเบเปเบฒเบเบเบฅเบดเบเปเบชเปเปเบชเบฑเปเบเบเบตเปเบเปเบญเบเบเบฒเบเบเปเบงเบเบซเบเบน, เบซเบเปเบฒเปเบเบซเบเบถเปเบเบเบฐเปเบเบตเบเบเปเบงเบเบชเบฐเบเบฒเบเบฐเบเบฐเบเบธเบเบฑเบเบเบญเบเบเบฐเบเบงเบเบเบฒเบเบเบตเป, เบเปเบญเบเบเบตเปเบเปเบฒเบเบชเบฒเบกเบฒเบเปเบเบดเปเบเบชเบดเปเบเบเบตเปเปเบเบตเบเบเบถเปเบ, เบเปเปเบเบดเบเบเบฒเบเบซเบเบฑเบ, เปเบฅเบฐเบญเบทเปเบเป.
เบเบฒเบเบเบฑเปเบเบเปเบฒเบเบปเบงเบเปเบงเบเบชเปเบฒเบเบเบฑเบเปเบปเบเบชเบฒเบกเบฒเบเบเบปเบเปเบเปเบเบตเปเบเบตเป
import os, re
from buildbot.plugins import steps, util, schedulers, worker, changes, reporters
c= BuildmasterConfig ={}
c['workers'] = [ worker.Worker('CentOS', '123456'), worker.Worker('Debian-10', '123456'), worker.Worker('Windows-10', '123456')]
c['protocols'] = {'pb': {'port': 4000}}
c['change_source'] = []
c['change_source'].append(changes.GitPoller(
repourl = 'https://bitbucket.org/svk28/rac-gui.git',
project = 'Rac-GUI',
branches = True,
pollInterval = 600
))
# ัะปัะถะฑะฐ ะทะฐะฟััะบะฐ ัะฑะพัะบะธ
c['schedulers'] = []
c['schedulers'].append(schedulers.SingleBranchScheduler(
name="Rac-GUI-schedulers",
change_filter=util.ChangeFilter(branch='master'),
builderNames=["Rac-GUI-RPM-builder", "Rac-GUI-DEB-builder", "Rac-GUI-WIN-builder"],
properties = {'owner': 'admin'}
))
@util.renderer
def get_name_version_release(props):
prog_name = "rac-gui"
prog_version = "1.0.3"
prog_release = "3"
return {
"prog_name": prog_name
#"prog_version": prog_version,
#"prog_release": prog_release
}
rac_gui_build_RPM = util.BuildFactory()
rac_gui_build_RPM.addStep(steps.Git(
repourl = 'https://bitbucket.org/svk28/rac-gui.git',
workdir = 'rac-gui',
haltOnFailure = True,
submodules = True,
mode='full',
progress = True)
)
# ะะพะฑะฐะฒะธะผ ะพะฟัะตะดะตะปะตะฝะธะต ะฒะตััะธะธ ะธะท ะพัะฝะพะฒะฝะพะณะพ ัะฐะนะปะฐ
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"
)
)
rac_gui_build_RPM.addStep(steps.ShellCommand(
command=["tar", "czf", util.Interpolate("/home/buildbot/rpmbuild/SOURCES/rac-gui-%(prop:version)s-%(prop:release)s.tar.gz"), "../rac-gui"]))
rac_gui_build_RPM.addStep(steps.ShellCommand(
command=["cp", "../rac-gui/rac_gui.spec", "/home/buildbot/rpmbuild/SPECS/rac_gui.spec"]))
rac_gui_build_RPM.addStep(steps.ShellCommand(
command=["sed", "-i", util.Interpolate("s/.*Version:.*/Version:t%(prop:version)s/"), "/home/buildbot/rpmbuild/SPECS/rac_gui.spec"]))
rac_gui_build_RPM.addStep(steps.ShellCommand(
command=["sed", "-i", util.Interpolate("s/.*Release:.*/Release:t%(prop:release)s/"), "/home/buildbot/rpmbuild/SPECS/rac_gui.spec"]))
rac_gui_build_RPM.addStep(steps.RpmBuild(
specfile="/home/buildbot/rpmbuild/SPECS/rac_gui.spec",
dist='.el5',
topdir='/home/buildbot/rpmbuild',
builddir='/home/buildbot/rpmbuild/build',
rpmdir='/home/buildbot/rpmbuild/RPMS',
sourcedir='/home/buildbot/rpmbuild/SOURCES'
))
# ะกะบะพะฟะธััะตะผ ัะฐะนะป ะฝะฐ ะผะฐััะตั
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")
)
)
rac_gui_build_RPM.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.noarch.rpm"),
util.Interpolate("--remote-file=uploads/rac-gui/rac-gui-%(prop:version)s-%(prop:release)s.noarch.rpm")]
)
)
rac_gui_build_RPM.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.tar.gz"),
util.Interpolate("--remote-file=uploads/rac-gui/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")]
)
)
############################################
# WIN
############################################
rac_gui_build_WIN = util.BuildFactory()
rac_gui_build_WIN.addStep(steps.Git(
repourl = 'https://bitbucket.org/svk28/rac-gui.git',
haltOnFailure = True,
submodules = True,
mode='full',
workdir='build',
progress = True)
)
# ะะพะฑะฐะฒะธะผ ะพะฟัะตะดะตะปะตะฝะธะต ะฒะตััะธะธ ะธะท ะพัะฝะพะฒะฝะพะณะพ ัะฐะนะปะฐ
rac_gui_build_WIN.addStep(
steps.SetPropertyFromCommand(
command="powershell -command "((Get-Content .rac_gui.tcl | Select-String -Pattern 'version:') -split 's')[2]",
property="version"
)
)
# ะะพะฑะฐะฒะธะผ ะพะฟัะตะดะตะปะตะฝะธะต ัะตะปะธะทะฐ ะธะท ะพัะฝะพะฒะฝะพะณะพ ัะฐะนะปะฐ
rac_gui_build_WIN.addStep(
steps.SetPropertyFromCommand(
command="powershell -command "((Get-Content .rac_gui.tcl | Select-String -Pattern 'release:') -split 's')[2]",
property="release"
)
)
# ะกะพะทะดะฐะดะธะผ ะทะฐะฟััะบะฐะตะผัะน ัะฐะนะป
rac_gui_build_WIN.addStep(steps.ShellCommand(
command=["c:binfreewrap.exe", "rac_gui.tcl"]))
# ะทะฐะฟะฐะบัะตะผ ัะพ, ััะพ ะฟะพะปััะธะปะพัั
rac_gui_build_WIN.addStep(steps.ShellCommand(
command=["c:Program Files7-zip7z.exe", "a", "-r", util.Interpolate("..rac-gui_%(prop:version)s-%(prop:release)s.win.zip"), "..build"]))
# ัะบะพะฟะธััะตะผ ะฝะฐ ะผะฐััะตั
rac_gui_build_WIN.addStep(
steps.FileUpload(
workersrc=util.Interpolate("..rac-gui_%(prop:version)s-%(prop:release)s.win.zip"),
masterdest=util.Interpolate("/home/buildbot/builds/rac-gui_%(prop:version)s-%(prop:release)s.win.zip")
)
)
# ะกะบะพะฟะธััะตะผ ัะฐะนะป ะฝะฐ ั
ะพััะธะฝะณ
rac_gui_build_WIN.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.win.zip"),
util.Interpolate("--remote-file=uploads/rac-gui/rac-gui_%(prop:version)s-%(prop:release)s.win.zip")]
)
)
c['builders'] = [
util.BuilderConfig(name="Rac-GUI-RPM-builder", workername='CentOS', factory=rac_gui_build_RPM),
util.BuilderConfig(name="Rac-GUI-DEB-builder", workername='Debian-10', factory=rac_gui_build_DEB),
util.BuilderConfig(name="Rac-GUI-WIN-builder", workername='Windows-10', factory=rac_gui_build_WIN),
]
c['services'] = []
template=u'''
<h4>Build status: {{ summary }}</h4>
<p> Worker used: {{ workername }}</p>
{% for step in build['steps'] %}
<p> {{ step['name'] }}: {{ step['result'] }}</p>
{% endfor %}
<p><b> -- The Buildbot</b></p>
'''
mailNotifier = reporters.MailNotifier(fromaddr="[email protected]",
sendToInterestedUsers=False,
mode=('all'),
extraRecipients=["[email protected]"],
relayhost="mail.domain.local",
smtpPort=587,
smtpUser="[email protected]",
smtpPassword="**********",
messageFormatter=reporters.MessageFormatter(
template=template, template_type='html',
wantProperties=True, wantSteps=True))
c['services'].append(mailNotifier)
c['title'] = "The process of bulding"
c['titleURL'] = "http://vm-srv-build1:80/"
c['buildbotURL'] = "http://vm-srv-build1/"
c['www'] = dict(port=80,
plugins=dict(waterfall_view={}, console_view={}, grid_view={}))
c['db'] = {
'db_url' : "sqlite:///state.sqlite"
}
เปเบเบทเปเบญเบเปเบเปเบเบเบฒเบ
เบญเบธเบเบฐเบเบญเบเบเปเปเปเบเบเบตเปเปเบเปเบเบทเบเบเปเบฒเปเบเปเปเบเบเบฒเบเบเบฐเบเบฝเบกเบเบปเบเบเบงเบฒเบก:
เบเบปเบงเบขเปเบฒเบเบเบญเบเบเบฒเบเบเบฐเบเบดเบเบฑเบเบเบฒเบเปเบเบทเปเบญเบกเปเบเบเบขเปเบฒเบเบเปเปเปเบเบทเปเบญเบเปเบเบเปเบเป BuildBot Buildbot: เบเบดเบเบฒเบเบเบตเปเบกเบตเบเบปเบงเบขเปเบฒเบเบเปเบฝเบงเบเบฑเบเบฅเบฐเบเบปเบเบเบฒเบเปเบเบทเปเบญเบกเปเบเบเบขเปเบฒเบเบเปเปเปเบเบทเปเบญเบเบญเบทเปเบ เบเบฒเบเบเบฑเปเบเบเปเบฒเบเบฒเบเปเบเบทเปเบญเบกเปเบเบเบขเปเบฒเบเบเปเปเปเบเบทเปเบญเบเปเบ Buildbot เปเบ Ubuntu 16.04 - เบเบต, เปเบญเบเบฐเบชเบฒเบเบเบฐเบฅเบดเบเบเบฐเบเบฑเบ
Buildbot Tutorial
เปเบซเบผเปเบเบเปเปเบกเบนเบ: www.habr.com