เชฎเชจเซ เชเชฟเช เชฐเชฟเชชเซเชเซเชเชฐเซเชฎเชพเชเชฅเซ เชธเชพเชเช เชชเชฐ เชธเซเชซเซเชเชตเซเชฐ เชชเซเชเซเชเซเชจเซ เชเชธเซเชฎเซเชฌเชฒ เชเชฐเชตเชพเชจเซ เช เชจเซ เชชเชนเซเชเชเชพเชกเชตเชพเชจเซ เชชเซเชฐเชเซเชฐเชฟเชฏเชพเชจเซ เชธเซเช เชเชฐเชตเชพเชจเซ เชเชฐเซเชฐ เชนเชคเซ. เช เชจเซ เชเซเชฏเชพเชฐเซ เชฎเซเช เชเซเชฏเซเช, เชเชเชฒเชพ เชฒเชพเชเชฌเชพ เชธเชฎเชฏ เชชเชนเซเชฒเชพ, เช เชนเซเช Habrรฉ เชชเชฐ เชฌเชฟเชฒเซเชกเชฌเซเช เชชเชฐ เชเช เชฒเซเช (เช เชเชคเชฎเชพเช เชฒเชฟเชเช), เชฎเซเช เชคเซเชจเซ เช เชเชฎเชพเชตเชตเชพเชจเซเช เช เชจเซ เชคเซเชจเซ เชฒเชพเชเซ เชเชฐเชตเชพเชจเซเช เชจเชเซเชเซ เชเชฐเซเชฏเซเช.
เชฌเชฟเชฒเซเชกเชฌเซเช เชตเชฟเชคเชฐเชฟเชค เชธเชฟเชธเซเชเชฎ เชนเซเชตเชพเชฅเซ, เชฆเชฐเซเช เชเชฐเซเชเชฟเชเซเชเซเชเชฐ เช เชจเซ เชเชชเชฐเซเชเชฟเชเช เชธเชฟเชธเซเชเชฎ เชฎเชพเชเซ เช เชฒเช เชฌเชฟเชฒเซเชก เชนเซเชธเซเช เชฌเชจเชพเชตเชตเซเช เชคเชพเชฐเซเชเชฟเช เชฐเชนเซเชถเซ. เช เชฎเชพเชฐเชพ เชเชฟเชธเซเชธเชพเชฎเชพเช, เช LXC เชเชจเซเชเซเชจเชฐ เชนเชถเซ (เชฒเชฟเชจเชเซเชธเชจเชพ เชเชฟเชธเซเชธเชพเชฎเชพเช) เช เชจเซ qemu (เชตเชฟเชจเซเชกเซเชเชจเชพ เชเชฟเชธเซเชธเชพเชฎเชพเช):
- vm-srv-build1 - centos 7, เชคเซเชฏเชพเช เชเช เชฌเชฟเชฒเซเชกเชฌเซเช เชฎเชพเชธเซเชเชฐ เช เชจเซ เชเช เชเชพเชฎเชฆเชพเชฐ เชนเชถเซ
- vm-srv-build2 - debian 10, DEB เชชเซเชเซเชเซ เชฌเชจเชพเชตเชตเชพ เชฎเชพเชเซ
- vm-srv-build3 - เชตเชฟเชจเซเชกเซเช 10, เชเชธเซเชฎเซเชฌเชฒเซ เชฎเชพเชเซ, เชคเชฎเซ เชเชพเชฃเซ เชเซ เชเซ เชถเซเช เชเซ
เช
เชฎเซ เชเชเชคเซเชฐเชฟเชค เชเชฐเซเชถเซเช
เชธเซเชฅเชพเชชเชจ
เชเซเชเชจเชฏเซ / เชฒเชฟเชจเชเซเชธ
เชเชจเซเชธเซเชเซเชฒเซเชถเชจ เชฎเชพเชเซ เชเชจเซเชเชฐเชจเซเช เชชเชฐ เชชเซเชฐเชคเชพ เชฆเชธเซเชคเชพเชตเซเชเซ เชเซ
เชฎเชพเชธเซเชเชฐ เชฎเชพเชเซ:
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 เชจเซ เชเชชเชฏเซเช เชเชฐเซเช เชเซเช. เช เชจเซ เชคเชฎเชพเชฐเซ เชเชธเซเชฎเซเชฌเชฒเซ เชฎเชพเชเซ เชเชฐเซเชฐเซ เชฆเชฐเซเช เช เชเซเชท เชฎเชพเชเซ เชชเซเชเซเชเซ เชชเชฃ เชเชจเซเชธเซเชเซเชฒ เชเชฐเชตเชพเชจเซ เชเชฐเซเชฐ เชชเชกเชถเซ (เชธเซเชจเซเชเซ: rpmdevtools, เชตเชเซเชฐเซ.; debian: build-essential, dh-make, pbuilder, เชตเชเซเชฐเซ.)
เชฌเชฟเชฒเซเชก เชชเซเชฐเซเชเซเชเซเชเซเชธ เช เชจเซ เชฌเชฟเชฒเซเชกเชฌเซเช เชธเซเชตเชพเช เชเช เชฌเชฟเชจเชชเซเชฐเชพเชชเซเชคเชฟเชนเซเชค เชตเชชเชฐเชพเชถเชเชฐเซเชคเชพ เชคเชฐเซเชเซ เชถเชฐเซ เชเชฐเชตเชพเชฎเชพเช เชเชตเชถเซ, เชคเซเชฅเซ เชคเชฎเชพเชฐเซ เชชเซเชฐเชเซเชฐเชฟเชฏเชพเชฎเชพเช เชญเชพเช เชฒเซเชคเชพ เชฌเชงเชพ เชนเซเชธเซเชเซเชธ เชชเชฐ เชเช เชฌเชจเชพเชตเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ:
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
เช เชชเชเซ, เชคเชฎเซ "เชเชพเชฎเชฆเชพเชฐเซ" (เชฌเชงเชพ เชนเซเชธเซเช เชชเชฐ) เชฎเชพเชเซ เชกเชฟเชฐเซเชเซเชเชฐเซ เชเชจเซเชซเซเชฐเชพเชธเซเชเซเชฐเชเซเชเชฐ เชฌเชจเชพเชตเซ เชถเชเซ เชเซ, เช เชเชฐเชตเชพ เชฎเชพเชเซ, เชฌเชฟเชฒเซเชกเชฌเซเช เชตเชชเชฐเชพเชถเชเชฐเซเชคเชพ เชนเซเช เชณ เชจเซเชเชงเชฃเซ เชเชฐเซ เช เชจเซ เชจเซเชเซเชจเชพ เชเชฆเซเชถเซ เชเชฒเชพเชตเซ:
เชชเซเชฐเชฅเชฎ เชนเซเชธเซเช 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
เชเชฎเชเชธ เชตเชฟเชจเซเชกเซเช
เชตเชฟเชจเซเชกเซเช เชนเซเช เชณ เชเชธเซเชฎเซเชฌเชฒเซ เชฎเชพเชเซ "เชเชพเชฐเซเชฏเชเชฐ" เชคเชฐเซเชเซ, Win10 เชจเชพ เชจเชตเซเชจเชคเชฎ เชชเซเชฐเชเชพเชถเชจ เชธเชพเชฅเซ เชตเชฐเซเชเซเชฏเซเช
เชฒ เชฎเชถเซเชจเชจเซ เชเชชเชฏเซเช เชเชฐเชตเชพเชฎเชพเช เชเชตเชถเซ.
เชเชพเชฎ เชเชฐเชตเชพ เชฎเชพเชเซ เชคเชฎเชพเชฐเซ เชเชจเซ เชเชฐเซเชฐ เชชเชกเชถเซ:
เชชเชพเชฏเชฅเซเชจ เชชเชพเชฏเชตเชฟเชจ เชเชฟเช - เชชเชพเชฏเชฅเซเชจเชฎเชพเช เชคเชฎเชพเชฎ เชชเซเชฐเชเชพเชฐเชจเซ เชตเชฟเชตเชฟเชง เชตเชธเซเชคเซเช เชเชจเซเชธเซเชเซเชฒ เชเชฐเชตเชพ เชฎเชพเชเซ, เชคเชฎเชพเชฐเซ เชกเชพเชเชจเชฒเซเชก เชเชฐเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ
เชตเชฟเชเซเชฏเซเช เชฒ เชธเซเชเซเชกเชฟเชฏเซ 2019 เชฎเชพเชเซ เชเซเชฒเซเชธ เชฌเชจเชพเชตเซ - 7Zip
เชเชชเชฐเซเชเซเชค เชคเชฎเชพเชฎ เชเชจเซเชธเซเชเซเชฒ เชฅเช เชเชฏเชพ เชชเชเซ, เชคเชฎเซ เชฌเชฟเชฒเซเชกเชฌเซเช เชชเซเชคเซ เช เชเชจเซเชธเซเชเซเชฒ เชเชฐเซ เชถเชเซ เชเซ:
pip install buildbot-worker
เชเชพเชฒเซ เชตเชฐเซเชเชฟเชเช เชกเชฟเชฐเซเชเซเชเชฐเซ เชฌเชจเชพเชตเซเช
md c:worker
เช เชจเซ เชเชพเชฒเซ เชฒเซเชจเซเช เชเชฐเซเช
buildbot-worker start c:worker
เชเซ เชฌเชงเซเช เชเชพเชฎ เชเชฐเซ เชเซ (เชฒเซเช c:workertwistd.log เชเซเช), เชคเซ เชคเชฎเซ เชฐเชเชฟเชธเซเชเซเชฐเซเชฎเชพเช เชเชพเชฐเซเชฏเชเชพเชฐเซ เชจเชฟเชฐเซเชฆเซเชถเชฟเชเชพ เชธเชพเชฅเซเชจเซ เชเชเชเชฎ เชเชฎเซเชฐเซเชจเซ เชธเซเชตเชพ เชคเชฐเซเชเซ เช เชฎเชพเชฐเชพ "เชเชพเชฐเซเชฏเชเชฐ" เชจเซ เชฐเชเซเชธเซเชเชฐ เชเชฐเซ เชถเชเซ เชเซ (เชธเชเชเชพเชฒเช เชคเชฐเซเชเซ เชเชพเชฒเชคเชพ เชชเชพเชตเชฐเชถเซเชฒเชฎเชพเช เชเชฆเซเชถเซ เชเชฒเชพเชตเชตเชพเชฎเชพเช เชเชตเซ เชเซ):
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
เช เชฌเชงเซเช "เชเชพเชฎเชฆเชพเชฐเซ" เชธเชพเชฅเซ เชเซ, เชคเชฎเชพเชฐเซ เชคเซเชฎเชจเซ เชตเชงเซ เชธเซเชชเชฐเซเชถ เชเชฐเชตเชพเชจเซ เชเชฐเซเชฐ เชจเชฅเซ, เชคเชฎเชพเชฎ เชจเชฟเชฏเชเชคเซเชฐเชฃ เชฎเชพเชธเซเชเชฐ เชคเชฐเชซเชฅเซ เชเชตเซ เชเซ.
เชตเชฟเชเชพเชฐเซเชก เชธเซเชเช เชช
เชถเชฐเซ เชเชฐเชตเชพ เชฎเชพเชเซ, เชเชพเชฒเซ เชฎเชพเชธเซเชเชฐ (เชฎเซเชเซเชฏ เชนเซเชธเซเช เชชเชฐ) เชฎเชพเชเซ เชเชจเซเชซเซเชฐเชพเชธเซเชเซเชฐเชเซเชเชฐ เชฌเชจเชพเชตเซเช, เช เชเชฐเชตเชพ เชฎเชพเชเซ, เชฌเชฟเชฒเซเชกเชฌเซเช เชตเชชเชฐเชพเชถเชเชฐเซเชคเชพ เชนเซเช เชณ เชจเซเชเชงเชฃเซ เชเชฐเซ เช เชจเซ เชจเซเชเซเชจเชพ เชเชฆเซเชถเซ เชเชฒเชพเชตเซ:
su - buildbot
mkdir /home/buildbot/master
cd ~
buildbot create-master master
เชคเซเชฏเชพเชฐ เชชเซเชเซเชเซ เชฎเชพเชเซ, เชฌเชฟเชฒเซเชก เชกเชฟเชฐเซเชเซเชเชฐเซ เชฌเชจเชพเชตเซ
mkdir /home/buildbot/builds
master.cfg เชซเชพเชเชฒ /home/buildbot/master/ เชกเชฟเชฐเซเชเซเชเชฐเซเชฎเชพเช เชฌเชจเชพเชตเชตเชพเชฎเชพเช เชเชตเซ เชนเชคเซ. เช เชซเชพเชเชฒ เชเช เชชเชพเชฏเชฅเซเชจ เชเซเชก เชเซ เช เชจเซ เชคเซเชฎเชพเช เชธเชฟเชธเซเชเชฎเชจเซ เชคเชฎเชพเชฎ เชฎเชฟเชเซเชจเชฟเชเชฎเซเชธเชจเซเช เชตเชฐเซเชฃเชจ เชเซ; เช เชฎเซ เชญเชตเชฟเชทเซเชฏเชฎเชพเช เชคเซเชจเซ เชธเชพเชฅเซ เชเชพเชฎ เชเชฐเซเชถเซเช.
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)
)
rac_gui.tcl เชชเซเชฐเซเชเซเชฐเชพเชฎเชจเซ เชฎเซเชเซเชฏ เชธเซเชเซเชฐเชฟเชชเซเชเชฎเชพเช, master.cfg เชซเชพเชเชฒเชจเชพ เชเซเชกเชฎเชพเช เชคเชชเชพเชธ เชเชฐเชตเชพเชจเซ เชเชฐเซเชฐ เชจ เชชเชกเซ เชคเซ เชฎเชพเชเซ, เชตเชฟเชตเชฟเชง เชธเชเชธเซเชเชฐเชฃเซเชจเชพ เชชเซเชเซเชเซเชจเซ เชเชธเซเชฎเซเชฌเชฒเซเชจเซ เชธเซเชตเชเชพเชฒเชฟเชค เชเชฐเชตเชพ เชฎเชพเชเซ, เชนเซเชกเชฐเชฎเชพเช เชตเชฐเซเชคเชฎเชพเชจ เชธเชเชธเซเชเชฐเชฃ เช เชจเซ เชชเซเชฐเชเชพเชถเชจ เชธเชพเชฅเซเชจเซ เชฐเซเชเชพเช เชเชฎเซเชฐเชตเชพเชฎเชพเช เชเชตเซ เชนเชคเซ. :
######################################################
# Rac GUI
...
# version: 1.0.3
# release: 1
เช เชจเซ เช เชฐเซเชเชพเชเชจเชพ เชเชงเชพเชฐเซ, เชฌเชฟเชฒเซเชกเชฌเซเช เชชเซเชเซเชเซเชจเซ เชจเชเชฌเชฐ เชเชชเชถเซ. เชกเซเชเชพ เชเชพเชขเชตเชพ เชฎเชพเชเซ, เชเชจเซเชธเซเชฒ grep เชเซเชฒเชจเซ เชเชชเชฏเซเช เชเชฐเซ. เชฌเชฟเชฒเซเชกเชฌเซเชเชฎเชพเช เชคเชฎเซ เชซเชเซเชค "เชเชพเชฎเชฆเชพเชฐเซ" เชฎเชพเชเซ เชเชฒเซเชจเซ เชตเซเชฏเชพเชเซเชฏเชพเชฏเชฟเชค เชเชฐเซ เชถเชเชคเชพ เชจเชฅเซ (เชเชเชพเชฎเชพเช เชเชเซเช, เชฎเชจเซ เชเซเชตเซ เชฐเซเชคเซ เชฎเชณเซเชฏเซเช เชจเชฅเซ). เช เชคเซ เชเซ เชเซ เชเซเชฃเชงเชฐเซเชฎเซ เชฎเชพเชเซ เชตเชชเชฐเชพเชฏ เชเซ. เชคเซ. เชเชธเซเชฎเซเชฌเชฒเซ เชชเซเชฐเชเซเชฐเชฟเชฏเชพเชฎเชพเช, เช เชฎเซ เชธเชเชธเซเชเชฐเชฃ เช เชจเซ เชชเซเชฐเชเชพเชถเชจ เชจเชเซเชเซ เชเชฐเชตเชพ เชฎเชพเชเซ เชชเชเชฒเชพเชเช เชเชฎเซเชฐเซเช เชเซเช เช เชจเซ เชคเซ เชฎเซเชเชฌ, เชธเชเชธเซเชเชฐเชฃ เช เชจเซ เชชเซเชฐเชเชพเชถเชจ เชเซเชฃเชงเชฐเซเชฎเซ เชธเซเช เชเชฐเซเช เชเซเช. เชเซเชฃเชงเชฐเซเชฎเซเชจเซ เชตเชฟเชตเชฟเชง เชฐเซเชคเซ เชธเซเช เชเชฐเซ เชถเชเชพเชฏ เชเซ, เช เชเชฟเชธเซเชธเชพเชฎเชพเช เชเชจเซเชธเซเชฒ เชเชฆเซเชถเชจเซ เชเซเชฒ เชเชฐเซเชจเซ:
# ะะพะฑะฐะฒะธะผ ะพะฟัะตะดะตะปะตะฝะธะต ะฒะตััะธะธ ะธะท ะพัะฝะพะฒะฝะพะณะพ ัะฐะนะปะฐ
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"]))
เชธเชพเชเชพ เชชเซเชฐเชเชพเชถเชจ เช เชจเซ เชธเชเชธเซเชเชฐเชฃ เชจเชเชฌเชฐเซ เชธเซเช เชเชฐเชตเชพ เชฎเชพเชเซ, เชชเซเชฐเชฎเชพเชฃเชญเซเชค เชธเซเชก เชเซเชฒเชจเซ เชเชชเชฏเซเช เชเชฐเซ, เชเชเชฒเซ เชเซ. เชเชฆเซเชถ เชธเซเชชเซเช เชซเชพเชเชฒเชจเซ เช เชเชฆเชฐเชจเชพ เชฎเซเชฒเซเชฏเซเชจเซ เชเชฐเซเชฐเซ เชธเชพเชฅเซ เชฌเชฆเชฒเซ เชเซ
# ะผะตะฝัะตะผ ะฒะตััะธั
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")
)
)
เชเชพเชฒเซ เชฎเชพเชธเซเชเชฐ เชชเชฐ 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 เชธเชพเชฅเซ เชเซ. เชนเชตเซ เชเชพเชฒเซ 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 เชชเซเชเซเช เชฎเชพเชเซ, เชจเซเชเซเชจเซ เชเซเชเชฒเซเช เชชเซเชฐเชเซเชฐเชฟเชฏเชพเช เชเชธเซเชฎเซเชฌเชฒเซ เชฆเชฐเชฎเชฟเชฏเชพเชจ เชเชฐเชชเซเชเชฎ เชฆเซเชตเชพเชฐเชพ เช เชเชฐเชตเชพเชฎเชพเช เชเชตเซ เชเซ เช เชจเซ เชธเซเชชเซเชเชจเซ เช เชเชฆเชฐ เชตเชฐเซเชฃเชตเชตเชพเชฎเชพเช เชเชตเซ เชเซ; เชกเซเชฌเชฟเชฏเชจ เชฎเชพเชเซ, เชคเชฎเชพเชฐเซ เชคเซ เช เชนเซเช เชเชฐเชตเซเช เชชเชกเชถเซ:
# ะะพะผะตะฝัะตะผ ะฟััะธ ะบ ะฑะธะฑะปะธะพัะตะบะฐะผ
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 เชธเชพเชฅเซ เชเชฐเซเชฏเซเช, เชนเชตเซ เชตเชฟเชจเซเชกเซเช!
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 เชฎเชพเช เชชเซเชฐเชฎเชพเชฃเชญเซเชค เชจเชฅเซ (เช เชฅเชตเชพ เชคเซเชฏเชพเช เชเซ?), เช เชฎเซ เชชเชพเชตเชฐเชถเซเชฒเชจเซ เชเชชเชฏเซเช เชเชฐเซเชถเซเช
# ะะพะฑะฐะฒะธะผ ะพะฟัะตะดะตะปะตะฝะธะต ะฒะตััะธะธ ะธะท ะพัะฝะพะฒะฝะพะณะพ ัะฐะนะปะฐ
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
เชฒเซเชเชฎเชพเช เชเชชเชฃเซ เชคเชชเชพเชธ เชเชฐเซเชถเซเช เชเซ เชฌเชงเซเช เชฐเซเชชเชฐเซเชเชพ เชธเชพเชฅเซ เชเซเชฐเชฎเชฎเชพเช เชเซ เช เชจเซ เชฌเชงเซเช เชธเชพเชฎเชพเชจเซเชฏ เชฐเซเชคเซ เชเชพเชฎ เชเชฐเซ เชฐเชนเซเชฏเซเช เชเซ. เช เชฎเชพเชฐเชพ เชฌเชงเชพ เชเชพเชฎเชฆเชพเชฐเซเช เชนเชตเซ เชเชจเซเชเซเช เชฅเชตเซเช เชเซเชเช, เชเซเชจเซ เชเชพเชฃ เชฒเซเชเชฎเชพเช เชเซเชถเซเชฅเซ เชเชฐเชตเชพเชฎเชพเช เชเชตเชถเซ ยปยป'/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 เชฐเซเชชเซเชเซเชเชฐเซเชฎเชพเช เชซเซเชฐเชซเชพเชฐเซ), เชชเซเชฐเชเซเชฐเชฟเชฏเชพเชเชจเซ เชธเซเชฅเชฟเชคเชฟ เชชเซเชฐเชฅเชฎ เชชเซเชทเซเช เชชเชฐ เชฆเซเชเชพเชถเซ.
เชเซ เชคเชฎเซ เชฎเชพเชเชธ เชตเชกเซ เชเชเซเชเชฟเชค เชฒเชพเชเชจ เชชเชฐ เชเซเชฒเชฟเช เชเชฐเซ เชเซ, เชคเซ เช เชชเซเชฐเชเซเชฐเชฟเชฏเชพเชจเซ เชตเชฐเซเชคเชฎเชพเชจ เชธเซเชฅเชฟเชคเชฟ เชธเชพเชฅเซ เชเช เชชเซเชทเซเช เชเซเชฒเชถเซ, เชเซเชฏเชพเช เชคเชฎเซ เชเซเช เชถเชเซ เชเซ เชเซ เชถเซเช เชฅเช เชฐเชนเซเชฏเซเช เชเซ, เชเช เชญเซเชฒเซ เชตเชเซเชฐเซ.
เชธเชเชชเซเชฐเซเชฃ เชตเชฟเชเชพเชฐเซเชก เชฐเซเชชเชฐเซเชเชพ เช เชนเซเช เชฎเชณเซ เชถเชเซ เชเซ
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 เชธเชพเชฅเซ เชธเชคเชค เชเชเซเชเชฐเชฃเชจเซเช เชเชฆเชพเชนเชฐเชฃ เช เชฎเชฒเซเชเชฐเชฃ เชฌเชฟเชฒเซเชกเชฌเซเช: เชฌเซเชเซ เชธเชคเชค เชเชเซเชเชฐเชฃ เชธเชฟเชธเซเชเชฎ เชตเชฟเชถเซ เชเชฆเชพเชนเชฐเชฃเซ เชธเชพเชฅเซเชจเซ เชตเชพเชฐเซเชคเชพ เชเชฌเซเชจเซเชเซ 16.04 เชชเชฐ เชฌเชฟเชฒเซเชกเชฌเซเชเชฎเชพเช เชธเชคเชค เชเชเซเชเชฐเชฃ เชธเซเช เชเชฐเชตเซเช - เชธเชพเชฐเซเช, เชเชคเซเชชเชพเชฆเชจ เชฆเชธเซเชคเชพเชตเซเชเซเชเชฐเชฃ
เชฌเชฟเชฒเซเชกเชฌเซเช เชเซเชฏเซเชเซเชฐเซเชฏเชฒ
เชธเซเชฐเซเชธ: www.habr.com