เช‰เชฆเชพเชนเชฐเชฃเซ‹เชฎเชพเช‚ เชฌเชฟเชฒเซเชกเชฌเซ‹เชŸ

เชฎเชจเซ‡ เช—เชฟเชŸ เชฐเชฟเชชเซ‹เชเซ€เชŸเชฐเซ€เชฎเชพเช‚เชฅเซ€ เชธเชพเช‡เชŸ เชชเชฐ เชธเซ‹เชซเซเชŸเชตเซ‡เชฐ เชชเซ‡เช•เซ‡เชœเซ‹เชจเซ‡ เชเชธเซ‡เชฎเซเชฌเชฒ เช•เชฐเชตเชพเชจเซ€ เช…เชจเซ‡ เชชเชนเซ‹เช‚เชšเชพเชกเชตเชพเชจเซ€ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพเชจเซ‡ เชธเซ‡เชŸ เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เชนเชคเซ€. เช…เชจเซ‡ เชœเซเชฏเชพเชฐเซ‡ เชฎเซ‡เช‚ เชœเซ‹เชฏเซเช‚, เช†เชŸเชฒเชพ เชฒเชพเช‚เชฌเชพ เชธเชฎเชฏ เชชเชนเซ‡เชฒเชพ, เช…เชนเซ€เช‚ Habrรฉ เชชเชฐ เชฌเชฟเชฒเซเชกเชฌเซ‹เชŸ เชชเชฐ เชเช• เชฒเซ‡เช– (เช…เช‚เชคเชฎเชพเช‚ เชฒเชฟเช‚เช•), เชฎเซ‡เช‚ เชคเซ‡เชจเซ‡ เช…เชœเชฎเชพเชตเชตเชพเชจเซเช‚ เช…เชจเซ‡ เชคเซ‡เชจเซ‡ เชฒเชพเช—เซ เช•เชฐเชตเชพเชจเซเช‚ เชจเช•เซเช•เซ€ เช•เชฐเซเชฏเซเช‚.

เชฌเชฟเชฒเซเชกเชฌเซ‹เชŸ เชตเชฟเชคเชฐเชฟเชค เชธเชฟเชธเซเชŸเชฎ เชนเซ‹เชตเชพเชฅเซ€, เชฆเชฐเซ‡เช• เช†เชฐเซเช•เชฟเชŸเซ‡เช•เซเชšเชฐ เช…เชจเซ‡ เช“เชชเชฐเซ‡เชŸเชฟเช‚เช— เชธเชฟเชธเซเชŸเชฎ เชฎเชพเชŸเซ‡ เช…เชฒเช— เชฌเชฟเชฒเซเชก เชนเซ‹เชธเซเชŸ เชฌเชจเชพเชตเชตเซเช‚ เชคเชพเชฐเซเช•เชฟเช• เชฐเชนเซ‡เชถเซ‡. เช…เชฎเชพเชฐเชพ เช•เชฟเชธเซเชธเชพเชฎเชพเช‚, เช† LXC เช•เชจเซเชŸเซ‡เชจเชฐ เชนเชถเซ‡ (เชฒเชฟเชจเช•เซเชธเชจเชพ เช•เชฟเชธเซเชธเชพเชฎเชพเช‚) เช…เชจเซ‡ qemu (เชตเชฟเชจเซเชกเซ‹เชเชจเชพ เช•เชฟเชธเซเชธเชพเชฎเชพเช‚):

  • vm-srv-build1 - centos 7, เชคเซเชฏเชพเช‚ เชเช• เชฌเชฟเชฒเซเชกเชฌเซ‹เชŸ เชฎเชพเชธเซเชŸเชฐ เช…เชจเซ‡ เชเช• เช•เชพเชฎเชฆเชพเชฐ เชนเชถเซ‡
  • vm-srv-build2 - debian 10, DEB เชชเซ‡เช•เซ‡เชœเซ‹ เชฌเชจเชพเชตเชตเชพ เชฎเชพเชŸเซ‡
  • vm-srv-build3 - เชตเชฟเชจเซเชกเซ‹เช 10, เชเชธเซ‡เชฎเซเชฌเชฒเซ€ เชฎเชพเชŸเซ‡, เชคเชฎเซ‡ เชœเชพเชฃเซ‹ เช›เซ‹ เช•เซ‡ เชถเซเช‚ เช›เซ‡

เช…เชฎเซ‡ เชเช•เชคเซเชฐเชฟเชค เช•เชฐเซ€เชถเซเช‚ เชฐเซ‡เช• GUI โ€” เชธเชฐเซเชตเชฐเซเชธเชจเชพ เช•เซเชฒเชธเซเชŸเชฐเชจเซเช‚ เชธเช‚เชšเชพเชฒเชจ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ 1C เชฐเซ‡เช• เชฎเชพเชŸเซ‡ เช—เซเชฐเชพเชซเชฟเช•เชฒ เช‡เชจเซเชŸเชฐเชซเซ‡เชธ. Linux เชฎเชพเชŸเซ‡, เชฆเชฐเซ‡เช• OS เชฎเชพเชŸเซ‡ เชชเซเชฐเชฎเชพเชฃเชญเซ‚เชค เชธเชพเชงเชจเซ‹เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡; tcl เชธเซเช•เซเชฐเชฟเชชเซเชŸเชฎเชพเช‚เชฅเซ€ Windows เชฎเชพเชŸเซ‡ exe เชซเชพเช‡เชฒ เชฌเชจเชพเชตเชตเชพ เชฎเชพเชŸเซ‡, เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‹ เชซเซเชฐเซ€เชตเซเชฐเซ‡เชช.

เชธเซเชฅเชพเชชเชจ

เชœเซ€เชเชจเชฏเซ / เชฒเชฟเชจเช•เซเชธ

เช‡เชจเซเชธเซเชŸเซ‹เชฒเซ‡เชถเชจ เชฎเชพเชŸเซ‡ เช‡เชจเซเชŸเชฐเชจเซ‡เชŸ เชชเชฐ เชชเซ‚เชฐเชคเชพ เชฆเชธเซเชคเชพเชตเซ‡เชœเซ‹ เช›เซ‡ 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 เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซเช‚ เช›เซเช‚. เช…เชจเซ‡ เชคเชฎเชพเชฐเซ‡ เชเชธเซ‡เชฎเซเชฌเชฒเซ€ เชฎเชพเชŸเซ‡ เชœเชฐเซ‚เชฐเซ€ เชฆเชฐเซ‡เช• เช…เช•เซเชท เชฎเชพเชŸเซ‡ เชชเซ‡เช•เซ‡เชœเซ‹ เชชเชฃ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เชชเชกเชถเซ‡ (เชธเซ‡เชจเซเชŸเซ‹: 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 เชจเชพ เชจเชตเซ€เชจเชคเชฎ เชชเซเชฐเช•เชพเชถเชจ เชธเชพเชฅเซ‡ เชตเชฐเซเชšเซเชฏเซเช…เชฒ เชฎเชถเซ€เชจเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡.
เช•เชพเชฎ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชคเชฎเชพเชฐเซ‡ เช†เชจเซ€ เชœเชฐเซ‚เชฐ เชชเชกเชถเซ‡:

เช‰เชชเชฐเซ‹เช•เซเชค เชคเชฎเชพเชฎ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เชฅเชˆ เช—เชฏเชพ เชชเช›เซ€, เชคเชฎเซ‡ เชฌเชฟเชฒเซเชกเชฌเซ‹เชŸ เชชเซ‹เชคเซ‡ เชœ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹:

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 เชฆเซเชตเชพเชฐเชพ เชนเซ‹เชธเซเชŸเชฟเช‚เช—เชฎเชพเช‚ เชเช•เชคเซเชฐเชฟเชค เชชเซ‡เช•เซ‡เชœเซ‹เชจเซ€ เชจเช•เชฒ เช•เชฐเชตเชพเชจเซ€ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เชถเชฐเซ‚ เช•เชฐเซ€เช. เช† เชนเซ‡เชคเซ เชฎเชพเชŸเซ‡ เชคเซ‡เชจเซ‹ เช‰เชชเชฏเซ‹เช— เชฅเชพเชฏ เช›เซ‡ เชธเซเช•เซเชฐเชฟเชชเซเชŸ 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 เชธเชพเชฅเซ‡ เช›เซ‡. เชนเชตเซ‡ เชšเชพเชฒเซ‹ 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"
}

เชธเชพเชฎเช—เซเชฐเซ€

เชฒเซ‡เช– เชคเซˆเชฏเชพเชฐ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชจเซ€เชšเซ‡เชจเซ€ เชธเชพเชฎเช—เซเชฐเซ€เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซ‹ เชนเชคเซ‹:

เชธเซ‹เชฐเซเชธ: www.habr.com

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹