เด‰เดฆเดพเดนเดฐเดฃเด™เตเด™เดณเดฟเตฝ เดฌเดฟเตฝเดกเตเดฌเต‹เดŸเตเดŸเต

เด’เดฐเต Git เดฑเดฟเดชเตเดชเต‹เดธเดฟเดฑเตเดฑเดฑเดฟเดฏเดฟเตฝ เดจเดฟเดจเตเดจเต เดธเตˆเดฑเตเดฑเดฟเดฒเต‡เด•เตเด•เต เดธเต‹เดซเตโ€Œเดฑเตเดฑเตโ€Œเดตเต†เดฏเตผ เดชเดพเด•เตเด•เต‡เดœเตเด•เตพ เด•เต‚เดŸเตเดŸเดฟเดšเตเดšเต‡เตผเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเด‚ เดตเดฟเดคเดฐเดฃเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเตเดฎเตเดณเตเดณ เดชเตเดฐเด•เตเดฐเดฟเดฏ เดŽเดจเดฟเด•เตเด•เต เดธเดœเตเดœเต€เด•เดฐเดฟเด•เตเด•เต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต. เดตเดณเดฐเต†เด•เตเด•เดพเดฒเด‚ เดฎเตเดฎเตเดชเต, เด‡เดตเดฟเดŸเต† เดนเดฌเตเดฐเต†เดฏเดฟเตฝ เดฌเดฟเตฝเดกเตเดฌเต‹เดŸเตเดŸเดฟเดจเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเตเดณเตเดณ เด’เดฐเต เดฒเต‡เด–เดจเด‚ เด•เดฃเตเดŸเดชเตเดชเต‹เตพ (เด…เดตเดธเดพเดจเด‚ เดฒเดฟเด™เตเด•เต), เด…เดคเต เดชเดฐเต€เด•เตเดทเดฟเดšเตเดšเต เดชเตเดฐเดฏเต‹เด—เดฟเด•เตเด•เดพเตป เดžเดพเตป เดคเต€เดฐเตเดฎเดพเดจเดฟเดšเตเดšเต.

เดฌเดฟเตฝเดกเตโ€Œเดฌเต‹เดŸเตเดŸเต เด’เดฐเต เดกเดฟเดธเตเดŸเตเดฐเดฟเดฌเตเดฏเต‚เดกเต เดธเดฟเดธเตเดฑเตเดฑเดฎเดพเดฏเดคเดฟเดจเดพเตฝ, เด“เดฐเต‹ เด†เตผเด•เตเด•เดฟเดŸเต†เด•เตเดšเดฑเดฟเดจเตเด‚ เด“เดชเตเดชเดฑเต‡เดฑเตเดฑเดฟเด‚เด—เต เดธเดฟเดธเตเดฑเตเดฑเดคเตเดคเดฟเดจเตเด‚ เด’เดฐเต เดชเตเดฐเดคเตเดฏเต‡เด• เดฌเดฟเตฝเดกเต เดนเต‹เดธเตเดฑเตเดฑเต เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเดจเตเดจเดคเต เดฏเตเด•เตเดคเดฟเดธเดนเดฎเดพเดฏเดฟเดฐเดฟเด•เตเด•เตเด‚. เดžเด™เตเด™เดณเตเดŸเต† เด•เดพเดฐเตเดฏเดคเตเดคเดฟเตฝ, เด‡เดต LXC เด•เดฃเตเดŸเต†เดฏเตโ€Œเดจเดฑเตเด•เดณเตเด‚ (เดฒเดฟเดจเด•เตโ€Œเดธเดฟเดจเตเดฑเต† เด•เดพเดฐเตเดฏเดคเตเดคเดฟเตฝ), qemu (เดตเดฟเตปเดกเต‹เดธเดฟเดจเตเดฑเต† เด•เดพเดฐเตเดฏเดคเตเดคเดฟเตฝ):

  • vm-srv-build1 - centos 7, เด’เดฐเต เดฌเดฟเตฝเดกเตโ€Œเดฌเต‹เดŸเตเดŸเต เดฎเดพเดธเตเดฑเตเดฑเดฑเตเด‚ (เดฎเดพเดธเตเดฑเตเดฑเตผ) เดคเตŠเดดเดฟเดฒเดพเดณเดฟเด•เดณเดฟเตฝ เด’เดฐเดพเดณเตเด‚ (เดคเตŠเดดเดฟเดฒเดพเดณเดฟ) เด‰เดฃเตเดŸเดพเด•เตเด‚.
  • vm-srv-build2 - debian 10, DEB เดชเดพเด•เตเด•เต‡เดœเตเด•เตพ เดจเดฟเตผเดฎเตเดฎเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต
  • vm-srv-build3 - เดตเดฟเตปเดกเต‹เดธเต 10, เด…เดธเด‚เดฌเตเดฒเดฟเด•เตเด•เต, เดŽเดจเตเดคเดฟเดจเตเดตเต‡เดฃเตเดŸเดฟเดฏเดพเดฃเต†เดจเตเดจเต เดจเดฟเด™เตเด™เตพเด•เตเด•เดฑเดฟเดฏเดพเด‚

เดžเด™เตเด™เตพ เดถเต‡เด–เดฐเดฟเด•เตเด•เตเด‚ เดฑเดพเด•เตเด•เต เดœเดฟเดฏเตเด โ€” เด’เดฐเต เด•เตเดฒเดธเตเดฑเตเดฑเตผ เดธเต†เตผเดตเดฑเตเด•เตพ เด•เตˆเด•เดพเดฐเตเดฏเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ 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 เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเตเดตเต†เดจเตเดจเต เดฎเดพเดคเตเดฐเด‚ เดžเดพเตป เดถเตเดฐเดฆเตเดงเดฟเด•เตเด•เตเด‚. เด•เต‚เดŸเดพเดคเต† เด…เดธเด‚เดฌเตเดฒเดฟเด•เตเด•เต เด†เดตเดถเตเดฏเดฎเดพเดฏ เด“เดฐเต‹ เด…เด•เตเดทเดคเตเดคเดฟเดจเตเด‚ เดจเดฟเด™เตเด™เตพ เดชเดพเด•เตเด•เต‡เดœเตเด•เตพ เด‡เตปเดธเตเดฑเตเดฑเดพเตพ เดšเต†เดฏเตเดฏเต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต (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 เดจเตเดฑเต† เดเดฑเตเดฑเดตเตเด‚ เดชเตเดคเดฟเดฏ เดฑเดฟเดฒเต€เดธเตเดณเตเดณ เด’เดฐเต เดตเต†เตผเดšเตเดตเตฝ เดฎเต†เดทเต€เตป เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเด‚.
เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เดพเตป เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด‡เดคเต เด†เดตเดถเตเดฏเดฎเดพเดฃเต:

เดฎเตเด•เดณเดฟเตฝ เดชเดฑเดžเตเดžเดตเดฏเต†เดฒเตเดฒเดพเด‚ เด‡เตปเดธเตเดฑเตเดฑเดพเตพ เดšเต†เดฏเตเดค เดถเต‡เดทเด‚, เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดฌเดฟเตฝเดกเตเดฌเต‹เดŸเตเดŸเต เดคเดจเตเดจเต† เด‡เตปเดธเตเดฑเตเดฑเดพเตพ เดšเต†เดฏเตเดฏเดพเตป เด•เดดเดฟเดฏเตเด‚:

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 เดตเดดเดฟ เดนเต‹เดธเตเดฑเตเดฑเดฟเด‚เด—เดฟเดฒเต‡เด•เตเด•เต เดชเด•เตผเดคเตเดคเตเดจเตเดจ เดชเตเดฐเด•เตเดฐเดฟเดฏ เด†เดฐเด‚เดญเดฟเด•เตเด•เดพเด‚. เดˆ เด†เดตเดถเตเดฏเดคเตเดคเดฟเดจเดพเดฏเดฟ เด‡เดคเต เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเต เดธเตเด•เตเดฐเดฟเดชเตเดฑเตเดฑเต 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"]))

เด’เดฐเต เด†เตผโ€Œเดชเดฟโ€ŒเดŽเด‚ เดชเดพเด•เตเด•เต‡เดœเดฟเดจเดพเดฏเดฟ, เด‡เดจเดฟเดชเตเดชเดฑเดฏเตเดจเตเดจ เดšเดฟเดฒ เดจเดŸเดชเดŸเดฟเด•เตเดฐเดฎเด™เตเด™เตพ เด…เดธเด‚เดฌเตเดฒเดฟ เดธเดฎเดฏเดคเตเดคเต เด†เตผโ€Œเดชเดฟโ€ŒเดŽเด‚ เดคเดจเตเดจเต† เดšเต†เดฏเตเดฏเตเดจเตเดจเต, เด…เดต เดธเตโ€Œเดชเต†เด•เตเด•เดฟเดจเตเดณเตเดณเดฟเตฝ เดตเดฟเดตเดฐเดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต; เดกเต†เดฌเดฟเดฏเดจเดฟเดจเต, เดจเดฟเด™เตเด™เตพ เด…เดคเต เด‡เดตเดฟเดŸเต† เดšเต†เดฏเตเดฏเดฃเด‚:

# ะŸะพะผะตะฝัะตะผ ะฟัƒั‚ะธ ะบ ะฑะธะฑะปะธะพั‚ะตะบะฐะผ
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"
}

เดตเดธเตเดคเตเด•เตเด•เตพ

เดฒเต‡เด–เดจเด‚ เดคเดฏเตเดฏเดพเดฑเดพเด•เตเด•เดพเตป เด‡เดจเดฟเดชเตเดชเดฑเดฏเตเดจเตเดจ เดฎเต†เดฑเตเดฑเต€เดฐเดฟเดฏเดฒเตเด•เตพ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต:

เด…เดตเดฒเด‚เดฌเด‚: www.habr.com

เด’เดฐเต เด…เดญเดฟเดชเตเดฐเดพเดฏเด‚ เดšเต‡เตผเด•เตเด•เตเด•