Buildbot เปƒเบ™เบ•เบปเบงเบขเปˆเบฒเบ‡

เบ‚เป‰เบญเบเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบ›เบฐเบเบญเบšเปเบฅเบฐเบชเบปเปˆเบ‡เบŠเบธเบ”เบŠเบญเบšเปเบงเบˆเบฒเบเบšเปˆเบญเบ™เป€เบเบฑเบš 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, เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ›เบฐเบเบญเบš, เบ—เปˆเบฒเบ™เบฎเบนเป‰เบงเปˆเบฒเบชเปเบฒเบฅเบฑเบšเบซเบเบฑเบ‡

เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเป€เบเบฑเบšเบเปเบฒ Rac GUI โ€” เบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบšเบฎเบนเบšเบžเบฒเบšเบชเปเบฒเบฅเบฑเบš 1C rac เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ„เบธเป‰เบกเบ„เบญเบ‡เบเบธเปˆเบกเบ‚เบญเบ‡เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ. เบชเปเบฒเบฅเบฑเบš Linux, เป€เบ„เบทเปˆเบญเบ‡เบกเบทเบกเบฒเบ”เบ•เบฐเบ–เบฒเบ™เบชเปเบฒเบฅเบฑเบšเปเบ•เปˆเบฅเบฐ OS เบˆเบฐเบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰; freewrap.

เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ

GNU / Linux

เบกเบตเป€เบญเบเบฐเบชเบฒเบ™เบžเบฝเบ‡เบžเปเปƒเบ™เบญเบดเบ™เป€เบ•เบตเป€เบ™เบฑเบ”เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ•เบดเบ”เบ•เบฑเป‰เบ‡ 1,2. เปเบกเปˆเบ™เปเบฅเป‰เบง, เปเบฅเบฐเบกเบฑเบ™เบšเปเปˆเป„เบ”เป‰เป€เบฎเบฑเบ”เปƒเบซเป‰เป€เบเบตเบ”เบšเบฑเบ™เบซเบฒเบžเบดเป€เบชเบ”เปƒเบ”เป†:
เบชเปเบฒเบฅเบฑเบšเปเบกเปˆเบšเบปเบ”:

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 เบˆเบฐเบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰.
เป€เบžเบทเปˆเบญโ€‹เป€เบฎเบฑเบ”โ€‹เบงเบฝเบโ€‹เบ—เปˆเบฒเบ™โ€‹เบˆเบฐโ€‹เบ•เป‰เบญเบ‡โ€‹เบเบฒเบ™โ€‹:

เบซเบผเบฑเบ‡เบˆเบฒเบเบ—เบตเปˆเบ—เบฑเบ‡เบซเบกเบปเบ”เบ‚เป‰เบฒเบ‡เป€เบ—เบดเบ‡เป„เบ”เป‰เบ–เบทเบเบ•เบดเบ”เบ•เบฑเป‰เบ‡, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ•เบดเบ”เบ•เบฑเป‰เบ‡ 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 เปƒเบ™เปเบกเปˆเบšเบปเบ”. เบชเปเบฒเบฅเบฑเบšเบˆเบธเบ”เบ›เบฐเบชเบปเบ‡เบ™เบตเป‰, เบกเบฑเบ™เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰ เบชเบฐเบ„เบฃเบดเบš เบชเบธเบ” tcl.

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 เบ–เป‰เบฒโ€‹เบซเบฒเบโ€‹เบงเปˆเบฒโ€‹เบšเบฒเบ‡โ€‹เบชเบดเปˆเบ‡โ€‹เบšเบฒเบ‡โ€‹เบขเปˆเบฒเบ‡โ€‹เบœเบดเบ”โ€‹เบžเบฒเบ”โ€‹, เปเบฅเบฐโ€‹เบญเบทเปˆเบ™เป†โ€‹.

เบ—เบฑเบ™เบ—เบตเบซเบผเบฑเบ‡เบˆเบฒเบเบเบฒเบ™เป€เบ›เบตเบ”เบ•เบปเบง, เบ„เบปเบ™เบ‡เบฒเบ™เบซเบ™เบฑเบเบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเบชเบฒเบกเบฒเบ”เป€เบšเบดเปˆเบ‡เป„เบ”เป‰เบœเปˆเบฒเบ™เป€เบกเบ™เบน "เบชเป‰เบฒเบ‡" -> "เบ„เบปเบ™เบ‡เบฒเบ™"

Buildbot เปƒเบ™เบ•เบปเบงเบขเปˆเบฒเบ‡

เบซเบผเบฑเบ‡เบˆเบฒเบเบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบชเป‰เบฒเบ‡เบ—เปเบฒเบญเบดเบ”เบชเปเบฒเป€เบฅเบฑเบ” (i. e. เบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เบเบฑเบš Git repository), เบชเบฐเบ–เบฒเบ™เบฐเบžเบฒเบšเบ‚เบญเบ‡เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบˆเบฐเบ›เบฒเบเบปเบ”เบขเบนเปˆเปƒเบ™เบซเบ™เป‰เบฒเบ—เปเบฒเบญเบดเบ”.

Buildbot เปƒเบ™เบ•เบปเบงเบขเปˆเบฒเบ‡

เบ–เป‰เบฒเบ—เปˆเบฒเบ™เบ„เบฅเบดเบเปƒเบชเปˆเป€เบชเบฑเป‰เบ™เบ—เบตเปˆเบ•เป‰เบญเบ‡เบเบฒเบ™เบ”เป‰เบงเบเบซเบ™เบน, เบซเบ™เป‰เบฒเปƒเบ”เบซเบ™เบถเปˆเบ‡เบˆเบฐเป€เบ›เบตเบ”เบ”เป‰เบงเบเบชเบฐเบ–เบฒเบ™เบฐเบ›เบฐเบˆเบธเบšเบฑเบ™เบ‚เบญเบ‡เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบ™เบตเป‰, เบšเปˆเบญเบ™เบ—เบตเปˆเบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป€เบšเบดเปˆเบ‡เบชเบดเปˆเบ‡เบ—เบตเปˆเป€เบเบตเบ”เบ‚เบถเป‰เบ™, เบ‚เปเป‰เบœเบดเบ”เบžเบฒเบ”เบซเบเบฑเบ‡, เปเบฅเบฐเบญเบทเปˆเบ™เป†.

Buildbot เปƒเบ™เบ•เบปเบงเบขเปˆเบฒเบ‡

เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบ•เบปเบงเบŠเปˆเบงเบเบชเป‰เบฒเบ‡เบ—เบฑเบ‡เปเบปเบ”เบชเบฒเบกเบฒเบ”เบžเบปเบšเป„เบ”เป‰เบ—เบตเปˆเบ™เบตเป‰

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"
}

เป€เบ„เบทเปˆเบญเบ‡เปเบ•เปˆเบ‡เบเบฒเบ

เบญเบธเบ›เบฐเบเบญเบ™เบ•เปเปˆเป„เบ›เบ™เบตเป‰เป„เบ”เป‰เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เปƒเบ™เบเบฒเบ™เบเบฐเบเบฝเบกเบšเบปเบ”เบ„เบงเบฒเบก:

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™