เจ‰เจฆเจพเจนเจฐเจจเจพเจ‚ เจตเจฟเฉฑเจš เจฌเจฟเจฒเจกเจฌเฉ‹เจŸ

เจฎเฉˆเจจเฉ‚เฉฐ เจ‡เฉฑเจ• Git เจฐเจฟเจชเฉ‹เจœเจผเจŸเจฐเฉ€ เจคเฉ‹เจ‚ เจธเจพเจˆเจŸ 'เจคเฉ‡ เจธเฉŒเจซเจŸเจตเฉ‡เจ…เจฐ เจชเฉˆเจ•เฉ‡เจœเจพเจ‚ เจจเฉ‚เฉฐ เจ…เจธเฉˆเจ‚เจฌเจฒ เจ•เจฐเจจ เจ…เจคเฉ‡ เจกเจฟเจฒเฉ€เจตเจฐ เจ•เจฐเจจ เจฆเฉ€ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจจเฉ‚เฉฐ เจธเฉˆเฉฑเจŸ เจ•เจฐเจจ เจฆเฉ€ เจฒเฉ‹เฉœ เจธเฉ€เฅค เจ…เจคเฉ‡ เจœเจฆเฉ‹เจ‚ เจฎเฉˆเจ‚ เจฆเฉ‡เจ–เจฟเจ†, เจฌเจนเฉเจค เจธเจฎเจพเจ‚ เจชเจนเจฟเจฒเจพเจ‚, เจ‡เฉฑเจฅเฉ‡ เจนเฉˆเจฌเจฐเฉ‡ เจ‰เฉฑเจคเฉ‡ เจฌเจฟเจฒเจกเจฌเฉ‹เจŸ (เจ…เฉฐเจค เจตเจฟเฉฑเจš เจฒเจฟเฉฐเจ•) 'เจคเฉ‡ เจ‡เฉฑเจ• เจฒเฉ‡เจ–, เจฎเฉˆเจ‚ เจ‡เจธเจจเฉ‚เฉฐ เจ…เจœเจผเจฎเจพเจ‰เจฃ เจ…เจคเฉ‡ เจ‡เจธเจจเฉ‚เฉฐ เจฒเจพเจ—เฉ‚ เจ•เจฐเจจ เจฆเจพ เจซเฉˆเจธเจฒเจพ เจ•เฉ€เจคเจพ.

เจ•เจฟเจ‰เจ‚เจ•เจฟ เจฌเจฟเจฒเจกเจฌเฉ‹เจŸ เจ‡เฉฑเจ• เจกเจฟเจธเจŸเฉเจฐเฉ€เจฌเจฟเจŠเจŸเจฟเจก เจธเจฟเจธเจŸเจฎ เจนเฉˆ, เจ‡เจธ เจฒเจˆ เจนเจฐเฉ‡เจ• เจ†เจฐเจ•เฉ€เจŸเฉˆเจ•เจšเจฐ เจ…เจคเฉ‡ เจ“เจชเจฐเฉ‡เจŸเจฟเฉฐเจ— เจธเจฟเจธเจŸเจฎ เจฒเจˆ เจ‡เฉฑเจ• เจตเฉฑเจ–เจฐเจพ เจฌเจฟเจฒเจก เจนเฉ‹เจธเจŸ เจฌเจฃเจพเจ‰เจฃเจพ เจฒเจพเจœเจผเฉ€เจ•เจฒ เจนเฉ‹เจตเฉ‡เจ—เจพเฅค เจธเจพเจกเฉ‡ เจ•เฉ‡เจธ เจตเจฟเฉฑเจš, เจ‡เจน LXC เจ•เฉฐเจŸเฉ‡เจจเจฐ (เจฒเฉ€เจจเจ•เจธ เจฆเฉ‡ เจฎเจพเจฎเจฒเฉ‡ เจตเจฟเฉฑเจš) เจ…เจคเฉ‡ เจ•เจฟเจฎเฉ‚ (เจตเจฟเฉฐเจกเฉ‹เจœเจผ เจฆเฉ‡ เจฎเจพเจฎเจฒเฉ‡ เจตเจฟเฉฑเจš) เจนเฉ‹เจฃเจ—เฉ‡:

  • vm-srv-build1 - centos 7, เจ‡เฉฑเจฅเฉ‡ เจ‡เฉฑเจ• เจฌเจฟเจฒเจกเจฌเฉ‹เจŸ เจฎเจพเจธเจŸเจฐ เจ…เจคเฉ‡ เจ‡เฉฑเจ• เจตเจฐเจ•เจฐ เจนเฉ‹เจตเฉ‡เจ—เจพ
  • vm-srv-build2 - debian 10, DEB เจชเฉˆเจ•เฉ‡เจœ เจฌเจฃเจพเจ‰เจฃ เจฒเจˆ
  • vm-srv-build3 - เจตเจฟเฉฐเจกเฉ‹เจœเจผ 10, เจ…เจธเฉˆเจ‚เจฌเจฒเฉ€ เจฒเจˆ, เจคเฉเจธเฉ€เจ‚ เจœเจพเจฃเจฆเฉ‡ เจนเฉ‹ เจ•เจฟ เจ•เจฟเจธ เจฒเจˆ

เจ…เจธเฉ€เจ‚ เจ‡เจ•เฉฑเจ เจพ เจ•เจฐเจพเจ‚เจ—เฉ‡ Rac GUI โ€” เจธเจฐเจตเจฐเจพเจ‚ เจฆเฉ‡ เจ•เจฒเฉฑเจธเจŸเจฐ เจฆเฉ‡ เจชเฉเจฐเจฌเฉฐเจงเจจ เจฒเจˆ 1C rac เจฒเจˆ เจ‡เฉฑเจ• เจ—เฉเจฐเจพเจซเจฟเจ•เจฒ เจ‡เฉฐเจŸเจฐเจซเฉ‡เจธเฅค เจฒเฉ€เจจเจ•เจธ เจฒเจˆ, เจนเจฐเฉ‡เจ• OS เจฒเจˆ เจธเจŸเฉˆเจ‚เจกเจฐเจก เจŸเฉ‚เจฒ เจตเจฐเจคเฉ‡ เจœเจพเจฃเจ—เฉ‡; เจ‡เฉฑเจ• tcl เจธเจ•เฉเจฐเจฟเจชเจŸ เจคเฉ‹เจ‚ เจตเจฟเฉฐเจกเฉ‹เจœเจผ เจฒเจˆ เจ‡เฉฑเจ• exe เจซเจพเจˆเจฒ เจฌเจฃเจพเจ‰เจฃ เจฒเจˆ, เจตเจฐเจคเฉ‹เจ‚ freewrap.

เจธเฉˆเจŸเจฟเฉฐเจ—

GNU / เจฒเฉ€เจจเจ•เจธ

เจ‡เฉฐเจธเจŸเจพเจฒเฉ‡เจธเจผเจจ เจฒเจˆ เจ‡เฉฐเจŸเจฐเจจเฉˆเฉฑเจŸ 'เจคเฉ‡ เจ•เจพเจซเฉ€ เจฆเจธเจคเจพเจตเฉ‡เจœเจผ เจฎเฉŒเจœเฉ‚เจฆ เจนเจจ 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, etc.)

เจฌเจฟเจฒเจก เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจ…เจคเฉ‡ เจฌเจฟเจฒเจกเจฌเฉ‹เจŸ เจธเฉ‡เจตเจพเจตเจพเจ‚ เจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจ—เฉˆเจฐ-เจ…เจงเจฟเจ•เจพเจฐเจค เจ‰เจชเจญเฉ‹เจ—เจคเจพ เจตเจœเฉ‹เจ‚ เจฒเจพเจ‚เจš เจ•เฉ€เจคเจพ เจœเจพเจตเฉ‡เจ—เจพ, เจ‡เจธ เจฒเจˆ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจตเจฟเฉฑเจš เจนเจฟเฉฑเจธเจพ เจฒเฉˆเจฃ เจตเจพเจฒเฉ‡ เจธเจพเจฐเฉ‡ เจฎเฉ‡เจœเจผเจฌเจพเจจเจพเจ‚ 'เจคเฉ‡ เจ‡เฉฑเจ• เจฌเจฃเจพเจ‰เจฃ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆ:


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

เจœเฉ‡ เจธเจญ เจ•เฉเจ เจ•เฉฐเจฎ เจ•เจฐเจฆเจพ เจนเฉˆ (เจตเฉ‡เจ–เฉ‹ log 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)
)

เจตเฉฑเจ–-เจตเฉฑเจ– เจธเฉฐเจธเจ•เจฐเจฃเจพเจ‚ เจฆเฉ‡ เจชเฉˆเจ•เฉ‡เจœเจพเจ‚ เจฆเฉ€ เจ…เจธเฉˆเจ‚เจฌเจฒเฉ€ เจจเฉ‚เฉฐ เจธเจตเฉˆเจšเจฒเจฟเจค เจ•เจฐเจจ เจฒเจˆ, เจคเจพเจ‚ เจ•เจฟ 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"]))

เจธเจนเฉ€ เจฐเฉ€เจฒเฉ€เจœเจผ เจ…เจคเฉ‡ เจธเฉฐเจธเจ•เจฐเจฃ เจจเฉฐเจฌเจฐเจพเจ‚ เจจเฉ‚เฉฐ เจธเฉˆเฉฑเจŸ เจ•เจฐเจจ เจฒเจˆ, เจ‡เฉฑเจ• เจฎเจฟเจ†เจฐเฉ€ sed เจ•เจพเจฒ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเฉ‹, เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ. เจ•เจฎเจพเจ‚เจก เจ–เจพเจธ เจซเจพเจˆเจฒ เจฆเฉ‡ เจ…เฉฐเจฆเจฐ เจฒเฉ‹เฉœเฉ€เจ‚เจฆเฉ‡ เจฎเฉเฉฑเจฒเจพเจ‚ เจจเจพเจฒ เจฌเจฆเจฒเจฆเฉ€ เจนเฉˆ

# ะผะตะฝัะตะผ ะฒะตั€ัะธัŽ
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 เจชเฉˆเจ•เฉ‡เจœ เจฒเจˆ, เจนเฉ‡เจ  เจฒเจฟเจ–เฉ€เจ†เจ‚ เจ•เฉเจ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ†เจตเจพเจ‚ 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 เจตเจฟเฉฐเจกเฉ‹เจœเจผ เจตเจฟเฉฑเจš เจฎเจฟเจ†เจฐเฉ€ เจจเจนเฉ€เจ‚ เจนเจจ (เจœเจพเจ‚ เจ‰เฉฑเจฅเฉ‡ เจนเจจ?), เจ…เจธเฉ€เจ‚ เจชเจพเจตเจฐเจธเจผเฉ‡เจฒ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจพเจ‚เจ—เฉ‡

# ะ”ะพะฑะฐะฒะธะผ ะพะฟั€ะตะดะตะปะตะฝะธะต ะฒะตั€ัะธะธ ะธะท ะพัะฝะพะฒะฝะพะณะพ ั„ะฐะนะปะฐ
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

เจ‡เฉฑเจ• เจŸเจฟเฉฑเจชเจฃเฉ€ เจœเฉ‹เฉœเฉ‹