เดเดฐเต Git เดฑเดฟเดชเตเดชเตเดธเดฟเดฑเตเดฑเดฑเดฟเดฏเดฟเตฝ เดจเดฟเดจเตเดจเต เดธเตเดฑเตเดฑเดฟเดฒเตเดเตเดเต เดธเตเดซเตโเดฑเตเดฑเตโเดตเตเดฏเตผ เดชเดพเดเตเดเตเดเตเดเตพ เดเตเดเตเดเดฟเดเตเดเตเตผเดเตเดเตเดจเตเดจเดคเดฟเดจเตเด เดตเดฟเดคเดฐเดฃเด เดเตเดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเตเดฎเตเดณเตเดณ เดชเตเดฐเดเตเดฐเดฟเดฏ เดเดจเดฟเดเตเดเต เดธเดเตเดเตเดเดฐเดฟเดเตเดเตเดฃเตเดเดคเตเดฃเตเดเต. เดตเดณเดฐเตเดเตเดเดพเดฒเด เดฎเตเดฎเตเดชเต, เดเดตเดฟเดเต เดนเดฌเตเดฐเตเดฏเดฟเตฝ เดฌเดฟเตฝเดกเตเดฌเตเดเตเดเดฟเดจเตเดเตเดเตเดฑเดฟเดเตเดเตเดณเตเดณ เดเดฐเต เดฒเตเดเดจเด เดเดฃเตเดเดชเตเดชเตเตพ (เด เดตเดธเดพเดจเด เดฒเดฟเดเตเดเต), เด เดคเต เดชเดฐเตเดเตเดทเดฟเดเตเดเต เดชเตเดฐเดฏเตเดเดฟเดเตเดเดพเตป เดเดพเตป เดคเตเดฐเตเดฎเดพเดจเดฟเดเตเดเต.
เดฌเดฟเตฝเดกเตโเดฌเตเดเตเดเต เดเดฐเต เดกเดฟเดธเตเดเตเดฐเดฟเดฌเตเดฏเตเดกเต เดธเดฟเดธเตเดฑเตเดฑเดฎเดพเดฏเดคเดฟเดจเดพเตฝ, เดเดฐเต เดเตผเดเตเดเดฟเดเตเดเตเดเดฑเดฟเดจเตเด เดเดชเตเดชเดฑเตเดฑเตเดฑเดฟเดเดเต เดธเดฟเดธเตเดฑเตเดฑเดคเตเดคเดฟเดจเตเด เดเดฐเต เดชเตเดฐเดคเตเดฏเตเด เดฌเดฟเตฝเดกเต เดนเตเดธเตเดฑเตเดฑเต เดธเตเดทเตเดเดฟเดเตเดเตเดจเตเดจเดคเต เดฏเตเดเตเดคเดฟเดธเดนเดฎเดพเดฏเดฟเดฐเดฟเดเตเดเตเด. เดเดเตเดเดณเตเดเต เดเดพเดฐเตเดฏเดคเตเดคเดฟเตฝ, เดเดต 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 เดเดชเดฏเตเดเดฟเดเตเดเตเดจเตเดจเตเดตเตเดจเตเดจเต เดฎเดพเดคเตเดฐเด เดเดพเตป เดถเตเดฐเดฆเตเดงเดฟเดเตเดเตเด. เดเตเดเดพเดคเต เด เดธเดเดฌเตเดฒเดฟเดเตเดเต เดเดตเดถเตเดฏเดฎเดพเดฏ เดเดฐเต เด เดเตเดทเดคเตเดคเดฟเดจเตเด เดจเดฟเดเตเดเตพ เดชเดพเดเตเดเตเดเตเดเตพ เดเตปเดธเตเดฑเตเดฑเดพเตพ เดเตเดฏเตเดฏเตเดฃเตเดเดคเตเดฃเตเดเต (centos: rpmdevtools, etc.; debian: build-essential, dh-make, pbuilder, etc.)
เดฌเดฟเตฝเดกเต เดชเตเดฐเตเดเดเตโเดฑเตเดฑเตเดเดณเตเด เดฌเดฟเตฝเดกเตโเดฌเตเดเตเดเต เดธเตเดตเดจเดเตเดเดณเตเด เดเดฐเต เดชเตเดฐเดคเตเดฏเตเดเดพเดตเดเดพเดถเดฎเดฟเดฒเตเดฒเดพเดคเตเดค เดเดชเดฏเตเดเตเดคเดพเดตเดพเดฏเดฟ เดธเดฎเดพเดฐเดเดญเดฟเดเตเดเตเด, เด เดคเดฟเดจเดพเตฝ เด เดชเตเดฐเดเตเดฐเดฟเดฏเดฏเดฟเตฝ เดชเดเตเดเตเดเตเดเตเดเตเดจเตเดจ เดเดฒเตเดฒเดพ เดนเตเดธเตเดฑเตเดฑเตเดเดณเดฟเดฒเตเด เดจเดฟเดเตเดเตพ เดเดจเตเดจเต เดธเตเดทเตโเดเดฟเดเตเดเตเดฃเตเดเดคเตเดฃเตเดเต:
adduser buildbot
เด เดเตเดคเตเดคเดคเดพเดฏเดฟ, เดเดฐเต เดนเตเดธเตเดฑเตเดฑเตเดเดณเดฟเดฒเตเด (เดเดฃเตเดเตเดฏเตโเดจเดฑเตเดเตพ) เดฏเดฅเดพเดเตเดฐเดฎเด เดธเตเดตเดจเดเตเดเดณเตเดเต เดฏเดพเดจเตเดคเตเดฐเดฟเด เดธเดฎเดพเดฐเดเดญเด เดเดเตเดเตพ เดเตเดฐเดฎเตเดเดฐเดฟเดเตเดเตเด:
เดตเดฟเดธเดพเตผเดกเต เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเดเตเดเตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ Systemd เดฏเตเดฃเดฟเดฑเตเดฑเต:
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
MS เดตเดฟเตปเดกเตเดธเต
เดตเดฟเตปเดกเตเดธเดฟเดจเต เดเตเดดเดฟเดฒเตเดณเตเดณ เด
เดธเดเดฌเตเดฒเดฟเดเตเดเต เดเดฐเต "เดตเตผเดเตเดเตผ" เดเดจเตเดจ เดจเดฟเดฒเดฏเดฟเตฝ, Win10 เดจเตเดฑเต เดเดฑเตเดฑเดตเตเด เดชเตเดคเดฟเดฏ เดฑเดฟเดฒเตเดธเตเดณเตเดณ เดเดฐเต เดตเตเตผเดเตเดตเตฝ เดฎเตเดทเตเตป เดเดชเดฏเตเดเดฟเดเตเดเตเด.
เดชเตเดฐเดตเตผเดคเตเดคเดฟเดเตเดเดพเตป เดจเดฟเดเตเดเตพเดเตเดเต เดเดคเต เดเดตเดถเตเดฏเดฎเดพเดฃเต:
เดชเตเดคเตเดคเตบ เดชเตเดตเดฟเตป Git - เดชเตเดคเตเดคเดฃเดฟเตฝ เดเดฒเตเดฒเดพเดคเตเดคเดฐเด เดตเตเดฏเดคเตเดฏเดธเตเดค เดเดพเดฐเตเดฏเดเตเดเดณเตเด เดเตปเดธเตเดฑเตเดฑเดพเตพ เดเตเดฏเตเดฏเดพเตป, เดจเดฟเดเตเดเตพ เดกเตเตบเดฒเตเดกเต เดเตเดฏเตเดฏเตเดฃเตเดเดคเตเดฃเตเดเต
เดตเดฟเดทเตเดตเตฝ เดธเตเดฑเตเดฑเตเดกเดฟเดฏเต 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
/home/buildbot/master/ เดกเดฏเดฑเดเตเดเดฑเดฟเดฏเดฟเตฝ เดเดฐเต master.cfg เดซเดฏเตฝ เดธเตเดทเตเดเดฟเดเตเดเต. เด เดซเดฏเตฝ เดเดฐเต เดชเตเดคเตเดคเตบ เดเตเดกเดพเดฃเต, เดเตเดเดพเดคเต เดธเดฟเดธเตเดฑเตเดฑเดคเตเดคเดฟเดจเตเดฑเต เดเดฒเตเดฒเดพ เดฎเตเดเตเดเดพเดจเดฟเดธเดเตเดเดณเตเดเตเดฏเตเด เดตเดฟเดตเดฐเดฃเด เด เดเดเตเดเดฟเดฏเดฟเดฐเดฟเดเตเดเตเดจเตเดจเต; เดญเดพเดตเดฟเดฏเดฟเตฝ เดเดเตเดเตพ เดเดคเต เดเดชเดฏเตเดเดฟเดเตเดเต เดชเตเดฐเดตเตผเดคเตเดคเดฟเดเตเดเตเด.
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 เดชเตเดฐเตเดเตเดฐเดพเดฎเดฟเดจเตเดฑเต เดชเตเดฐเดงเดพเดจ เดธเตเดเตเดฐเดฟเดชเตเดฑเตเดฑเดฟเตฝ, เดจเดฟเดฒเดตเดฟเดฒเต เดชเดคเดฟเดชเตเดชเตเด เดฑเดฟเดฒเตเดธเตเด เดเดณเตเดณ เดตเดฐเดฟเดเตพ เดคเดฒเดเตเดเตเดเตเดเดฟเตฝ เดเตเตผเดคเตเดคเต. :
######################################################
# 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"]))
เดเดฐเต เดเตผโเดชเดฟโเดเด เดชเดพเดเตเดเตเดเดฟเดจเดพเดฏเดฟ, เดเดจเดฟเดชเตเดชเดฑเดฏเตเดจเตเดจ เดเดฟเดฒ เดจเดเดชเดเดฟเดเตเดฐเดฎเดเตเดเตพ เด เดธเดเดฌเตเดฒเดฟ เดธเดฎเดฏเดคเตเดคเต เดเตผโเดชเดฟโเดเด เดคเดจเตเดจเต เดเตเดฏเตเดฏเตเดจเตเดจเต, เด เดต เดธเตโเดชเตเดเตเดเดฟเดจเตเดณเตเดณเดฟเตฝ เดตเดฟเดตเดฐเดฟเดเตเดเดฟเดฐเดฟเดเตเดเตเดจเตเดจเต; เดกเตเดฌเดฟเดฏเดจเดฟเดจเต, เดจเดฟเดเตเดเตพ เด เดคเต เดเดตเดฟเดเต เดเตเดฏเตเดฏเดฃเด:
# ะะพะผะตะฝัะตะผ ะฟััะธ ะบ ะฑะธะฑะปะธะพัะตะบะฐะผ
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)
)
เดตเดฟเตปเดกเตเดธเดฟเตฝ เดเตเดฐเตเดชเตเดชเตเด เดธเตเดกเตเด เดธเตเดฑเตเดฑเดพเตปเดกเตเตผเดกเต เด เดฒเตเดฒเดพเดคเตเดคเดคเดฟเดจเดพเตฝ (เด เดฒเตเดฒเตเดเตเดเดฟเตฝ เดเดฃเตเดเต?), เดเดเตเดเตพ เดชเดตเตผเดทเตเตฝ เดเดชเดฏเตเดเดฟเดเตเดเตเด
# ะะพะฑะฐะฒะธะผ ะพะฟัะตะดะตะปะตะฝะธะต ะฒะตััะธะธ ะธะท ะพัะฝะพะฒะฝะพะณะพ ัะฐะนะปะฐ
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