Buildbot αž€αŸ’αž“αž»αž„αž§αž‘αžΆαž αžšαžŽαŸ

αžαŸ’αž‰αž»αŸ†αžαŸ’αžšαžΌαžœαžšαŸ€αž”αž…αŸ†αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž“αŸƒαž€αžΆαžšαž”αŸ’αžšαž˜αžΌαž›αž•αŸ’αžαž»αŸ† αž“αž·αž„αž…αŸ‚αž€αž…αžΆαž™αž€αž‰αŸ’αž…αž”αŸ‹αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž–αžΈαžƒαŸ’αž›αžΆαŸ†αž„ Git αž‘αŸ…αž€αžΆαž“αŸ‹αž‚αŸαž αž‘αŸ†αž–αŸαžšαŸ” αž αžΎαž™αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αžƒαžΎαž‰αž˜αž·αž“αž™αžΌαžšαž”αŸ‰αž»αž“αŸ’αž˜αžΆαž“αž‘αŸ αž“αŸ…αž‘αžΈαž“αŸαŸ‡αž“αŸ…αž›αžΎHabre αž’αžαŸ’αžαž”αž‘αž˜αž½αž™αž“αŸ…αž›αžΎ buildbot (αžαŸ†αžŽαž—αŸ’αž‡αžΆαž”αŸ‹αž“αŸ…αž…αž»αž„αž”αž‰αŸ’αž…αž”αŸ‹) αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αžŸαž˜αŸ’αžšαŸαž…αž…αž·αžαŸ’αžαžŸαžΆαž€αž›αŸ’αž”αž„αžœαžΆ αž αžΎαž™αž’αž“αž»αžœαžαŸ’αžαžœαžΆαŸ”

αžŠαŸ„αž™αžŸαžΆαžš buildbot αž‚αžΊαž‡αžΆαž”αŸ’αžšαž–αŸαž“αŸ’αž’αž…αŸ‚αž€αž…αžΆαž™ αžœαžΆαž“αžΉαž„αžŸαž˜αž αŸαžαž»αž•αž›αž€αŸ’αž“αž»αž„αž€αžΆαžšαž”αž„αŸ’αž€αžΎαž build host αžŠαžΆαž…αŸ‹αžŠαŸ„αž™αž‘αŸ‚αž€αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžŸαŸ’αžαžΆαž”αžαŸ’αž™αž€αž˜αŸ’αž˜ αž“αž·αž„αž”αŸ’αžšαž–αŸαž“αŸ’αž’αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž“αžΈαž˜αž½αž™αŸ—αŸ” αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαžšαž”αžŸαŸ‹αž™αžΎαž„ αž‘αžΆαŸ†αž„αž“αŸαŸ‡αž“αžΉαž„αž‡αžΆαž’αž»αž„ LXC (αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈ Linux) αž“αž·αž„ qemu (αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈ Windows)αŸ–

  • vm-srv-build1 - centos 7 αž“αžΉαž„αž˜αžΆαž“αž˜αŸ buildbot αž“αž·αž„αž€αž˜αŸ’αž˜αž€αžšαž˜αŸ’αž“αžΆαž€αŸ‹
  • vm-srv-build2 - debian 10 αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž”αž„αŸ’αž€αžΎαžαž€αž‰αŸ’αž…αž”αŸ‹ DEB
  • vm-srv-build3 - windows 10 αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž‡αž½αž”αž”αŸ’αžšαž‡αž»αŸ†αž‚αŸ’αž“αžΆ αž’αŸ’αž“αž€αžŠαžΉαž„αžαžΆαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αžœαžΈ

αž™αžΎαž„αž“αžΉαž„αž”αŸ’αžšαž˜αžΌαž› Rac GUI - αž…αŸ†αžŽαž»αž…αž”αŸ’αžšαž‘αžΆαž€αŸ‹αž€αŸ’αžšαžΆαž αŸ’αžœαž·αž€αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ 1C rac αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αž…αž„αŸ’αž€αŸ„αž˜αž“αŸƒαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαŸ” αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž›αžΈαž“αž»αž… αž§αž”αž€αžšαžŽαŸαžŸαŸ’αžŠαž„αŸ‹αžŠαžΆαžšαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž”αŸ’αžšαž–αŸαž“αŸ’αž’αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž“αžΈαž˜αž½αž™αŸ—αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎαŸ” αžŠαžΎαž˜αŸ’αž”αžΈαž”αž„αŸ’αž€αžΎαžαž―αž€αžŸαžΆαžš exe αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžœαžΈαž“αžŠαžΌαž–αžΈαžŸαŸ’αž‚αŸ’αžšαžΈαž” tcl αžŸαžΌαž˜αž”αŸ’αžšαžΎ 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 αž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡αŸ” αž αžΎαž™αž’αŸ’αž“αž€αž€αŸαž“αžΉαž„αžαŸ’αžšαžΌαžœαžŠαŸ†αž‘αžΎαž„αž€αž‰αŸ’αž…αž”αŸ‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αŸαž€αŸ’αžŸαž“αžΈαž˜αž½αž™αŸ—αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž€αžΆαžšαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž‡αž½αž”αž”αŸ’αžšαž‡αž»αŸ†αž‚αŸ’αž“αžΆ (centos: rpmdevtools, etc.; debian: build-essential, dh-make, pbuilder αŸ”αž›αŸ”)

αž‚αž˜αŸ’αžšαŸ„αž„αžŸαžΆαž„αžŸαž„αŸ‹ αž“αž·αž„αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜ buildbot αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αžΎαž€αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž€αŸ’αž“αž»αž„αž“αžΆαž˜αž‡αžΆαž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžŠαŸ‚αž›αž‚αŸ’αž˜αžΆαž“αžŸαž·αž‘αŸ’αž’αž· αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž”αž„αŸ’αž€αžΎαžαžœαžΆαž“αŸ…αž›αžΎαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αžŠαŸ‚αž›αž…αžΌαž›αžšαž½αž˜αž€αŸ’αž“αž»αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž“αŸαŸ‡αŸ–


adduser buildbot

αž”αž“αŸ’αž‘αžΆαž”αŸ‹ αž™αžΎαž„αž“αžΉαž„αž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž€αžΆαžšαž”αžΎαž€αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŠαŸ„αž™αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž·αž“αŸƒαžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αžšαŸ€αž„αŸ—αžαŸ’αž›αž½αž“αž“αŸ…αž›αžΎαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž“αžΈαž˜αž½αž™αŸ— (αž€αž»αž„αžαžΊαž“αŸαžš)αŸ–

αž―αž€αžαžΆαž”αŸ’αžšαž–αŸαž“αŸ’αž’αžŠαžΎαž˜αŸ’αž”αžΈαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž’αŸ’αž“αž€αž‡αŸ†αž“αž½αž™αž€αžΆαžšαŸ–

touch /etc/systemd/buildbot-master.service 

[Unit]
Description=BuildBot master service
After=network.target

[Service]
User=buildbot
Group=buildbot
WorkingDirectory=/home/buildbot/master
ExecStart=/usr/local/bin/buildbot start --nodaemon
ExecReload=/bin/kill -HUP $MAINPID

[Install]
WantedBy=multi-user.target

αž“αž·αž„ "αž€αž˜αŸ’αž˜αž€αžš"

touch /etc/systemd/buildbot-worker.service 

[Unit]
Description=BuildBot worker service
After=network.target

[Service]master
User=buildbot
Group=buildbot
WorkingDirectory=/home/buildbot/worker
ExecStart=/usr/local/bin/buildbot-worker start --nodaemon

[Install]
WantedBy=buildbot-master.service

αžŠαŸ„αž™αžŸαžΆαžšαžŸαŸ’αž‚αŸ’αžšαžΈαž”αž‘αžΆαŸ†αž„αž’αžŸαŸ‹ (αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαžšαž”αžŸαŸ‹αž™αžΎαž„) αž˜αžΆαž“αž‘αžΈαžαžΆαŸ†αž„αž“αŸ… /usr/local/ αž’αŸ’αž“αž€αž‚αž½αžšαžαŸ‚αž€αŸ†αžŽαžαŸ‹αž•αŸ’αž›αžΌαžœαž‘αŸ…αž€αžΆαž“αŸ‹αž–αž½αž€αžœαžΆαž“αŸ…αž€αŸ’αž“αž»αž„αž’αžαŸαžšαž”αžšαž·αžŸαŸ’αžαžΆαž“αŸ–

nano /root/.bash_profile

PATH=$PATH:$HOME/.local/bin:$HOME/bin:/usr/local/bin

αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž“αŸαŸ‡ αž’αŸ’αž“αž€αž’αžΆαž…αž”αž„αŸ’αž€αžΎαžαž αŸαžŠαŸ’αž‹αžΆαžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžαžαžŸαž˜αŸ’αžšαžΆαž”αŸ‹ "αž€αž˜αŸ’αž˜αž€αžš" (αž“αŸ…αž›αžΎαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž‘αžΆαŸ†αž„αž’αžŸαŸ‹) αžŠαžΎαž˜αŸ’αž”αžΈαž’αŸ’αžœαžΎαžŠαžΌαž…αŸ’αž“αŸαŸ‡ αžŸαžΌαž˜αž…αž»αŸ‡αžˆαŸ’αž˜αŸ„αŸ‡αž“αŸ…αž€αŸ’αžšαŸ„αž˜αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ buildbot αž αžΎαž™αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαžαžΆαž„αž€αŸ’αžšαŸ„αž˜αŸ–

αž“αŸ…αž›αžΎαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αžŠαŸ†αž”αžΌαž„ 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

αž“αŸ…αž›αžΎαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜ buildbot-worker αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜

systemctl start buildbot-worker

MS αžœαžΈαž“αžŠαžΌ

αž€αŸ’αž“αž»αž„αž“αžΆαž˜αž‡αžΆ "αž€αž˜αŸ’αž˜αž€αžš" αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž‡αž½αž”αž”αŸ’αžšαž‡αž»αŸ†αž‚αŸ’αž“αžΆαž“αŸ…αž€αŸ’αžšαŸ„αž˜αžœαžΈαž“αžŠαžΌ αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž“αž·αž˜αŸ’αž˜αž·αžαž‡αžΆαž˜αž½αž™αž“αžΉαž„αž€αžΆαžšαž…αŸαž‰αž•αŸ’αžŸαžΆαž™αž…αž»αž„αž€αŸ’αžšαŸ„αž™αž”αŸ†αž•αž»αžαž“αŸƒ Win10 αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎαŸ”
αžŠαžΎαž˜αŸ’αž”αžΈαž’αŸ’αžœαžΎαž€αžΆαžšαž’αŸ’αž“αž€αž“αžΉαž„αžαŸ’αžšαžΌαžœαž€αžΆαžš:

αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαžŠαŸ†αž‘αžΎαž„αžšαž½αž… αž’αŸ’αž“αž€αž’αžΆαž…αžŠαŸ†αž‘αžΎαž„ buildbot αžŠαŸ„αž™αžαŸ’αž›αž½αž“αž―αž„αž”αžΆαž“αŸ–

pip install buildbot-worker

αžαŸ„αŸ‡αž”αž„αŸ’αž€αžΎαžαžαžαž€αžΆαžšαž„αžΆαžš

md c:worker

αž αžΎαž™αžŸαžΌαž˜αž”αžΎαž€αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš

buildbot-worker start c:worker

αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αŸ’αžœαžΈαŸ—αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž”αžΆαž“ (αžŸαžΌαž˜αž˜αžΎαž› log c:workertwistd.log) αž“αŸ„αŸ‡αž’αŸ’αž“αž€αž’αžΆαž…αž…αž»αŸ‡αžˆαŸ’αž˜αŸ„αŸ‡ "αž€αž˜αŸ’αž˜αž€αžš" αžšαž”αžŸαŸ‹αž™αžΎαž„αž‡αžΆαžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αžŠαŸ„αž™αž”αž“αŸ’αžαŸ‚αž˜αž’αžΆαžαž»αž‡αžΆαž˜αž½αž™αž“αžΉαž„αžαžαž€αžΆαžšαž„αžΆαžšαž‘αŸ…αž”αž‰αŸ’αž‡αžΈαžˆαŸ’αž˜αŸ„αŸ‡ (αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αŸ’αž“αž»αž„ powershell αžŠαŸ‚αž›αž€αŸ†αž–αž»αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž‡αžΆαž’αŸ’αž“αž€αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„)αŸ–

buildbot_worker_windows_service.exe --user VM-SRV-BUILD3buildbot --password 123456 --startup auto install
New-ItemProperty -path Registry::HKEY_LOCAL_MACHINESYSTEMCurrentControlSetservicesBuildBotParameters -Name directories -PropertyType String -Value c:worker

αž αžΎαž™αž’αŸ’αž“αž€αž’αžΆαž…αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜

Start-Service buildbot

αž“αŸ„αŸ‡αž αžΎαž™αž‡αžΆαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž‡αžΆαž˜αž½αž™αž“αžΉαž„ "αž€αž˜αŸ’αž˜αž€αžš" αž’αŸ’αž“αž€αž˜αž·αž“αž…αžΆαŸ†αž”αžΆαž…αŸ‹αž”αŸ‰αŸ‡αž–αž½αž€αž‚αŸαž”αž“αŸ’αžαŸ‚αž˜αž‘αŸ€αžαž‘αŸαž€αžΆαžšαž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž‚αžΊαž˜αž€αž–αžΈαž˜αŸαŸ”

αž€αžΆαžšαžŠαŸ†αž‘αžΎαž„αž’αŸ’αž“αž€αž‡αŸ†αž“αž½αž™αž€αžΆαžš

αžŠαžΎαž˜αŸ’αž”αžΈαž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜ αž…αžΌαžšαž™αžΎαž„αž”αž„αŸ’αž€αžΎαžαž αŸαžŠαŸ’αž‹αžΆαžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž˜αŸ (αž“αŸ…αž›αžΎαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ) αžŠαžΎαž˜αŸ’αž”αžΈαž’αŸ’αžœαžΎαžŠαžΌαž…αŸ’αž“αŸαŸ‡ αžŸαžΌαž˜αž…αž»αŸ‡αžˆαŸ’αž˜αŸ„αŸ‡αž“αŸ…αž€αŸ’αžšαŸ„αž˜αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ buildbot αž αžΎαž™αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαžαžΆαž„αž€αŸ’αžšαŸ„αž˜αŸ–

su - buildbot
mkdir /home/buildbot/master
cd ~
buildbot create-master master

αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αž‰αŸ’αž…αž”αŸ‹αžŠαŸ‚αž›αžαŸ’αžšαŸ€αž˜αžšαž½αž…αž‡αžΆαžŸαŸ’αžšαŸαž… αž”αž„αŸ’αž€αžΎαžαžαžαž―αž€αžŸαžΆαžšαž”αž„αŸ’αž€αžΎαž

mkdir /home/buildbot/builds

αž―αž€αžŸαžΆαžš master.cfg αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαž“αŸ…αž€αŸ’αž“αž»αž„αžαž /home/buildbot/master/ αŸ” αž―αž€αžŸαžΆαžšαž“αŸαŸ‡αž‚αžΊαž‡αžΆαž€αžΌαžŠ python αž“αž·αž„αž˜αžΆαž“αž€αžΆαžšαž–αž·αž–αžŽαŸŒαž“αžΆαž’αŸ†αž–αžΈαž™αž“αŸ’αžαž€αžΆαžšαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž“αŸƒαž”αŸ’αžšαž–αŸαž“αŸ’αž’ αž™αžΎαž„αž“αžΉαž„αž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™αžœαžΆαž“αŸ…αž–αŸαž›αž’αž“αžΆαž‚αžαŸ”

nano /home/buildbot/master/master.cfg

import os, re
from buildbot.plugins import steps, util, schedulers, worker, changes, reporters

c= BuildmasterConfig ={}

# ОписаниС Π½Π°ΡˆΠΈΡ… Ρ€Π°Π±ΠΎΡ‡ΠΈΡ….
c['workers'] = [ worker.Worker('CentOS', '123456'), worker.Worker('Debian-10', '123456'), worker.Worker('Windows-10', '123456')]
c['protocols'] = {'pb': {'port': 4000}} 

# Π£ΠΊΠ°Π·Π°Π½ΠΈΠ΅ мастСру ΠΊΠ°ΠΊΠΎΠΉ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ
c['change_source'] = []
c['change_source'].append(changes.GitPoller(
       repourl = 'https://bitbucket.org/svk28/rac-gui.git',
       project = 'Rac-GUI',
       branches = True,
       pollInterval = 60
      )
)

# слуТба запуска сборки
c['schedulers'] = []
c['schedulers'].append(schedulers.SingleBranchScheduler(
       name="Rac-GUI-schedulers",
       change_filter=util.ChangeFilter(branch='master'),
       builderNames=["Rac-GUI-RPM-builder", "Rac-GUI-DEB-builder", "Rac-GUI-WIN-builder"],
       properties = {'owner': 'admin'}
       )
)
@util.renderer

######################################3
# Π‘Π±ΠΎΡ€ΠΊΠ° RPM-ΠΏΠ°ΠΊΠ΅Ρ‚Π°
 rac_gui_build_RPM = util.BuildFactory()

rac_gui_build_RPM.addStep(steps.Git(
       repourl = 'https://bitbucket.org/svk28/rac-gui.git',
       workdir = 'rac-gui',
       haltOnFailure = True,
       submodules = True,
       mode='full',
       progress = True)
)

αžŠαžΎαž˜αŸ’αž”αžΈαž’αŸ’αžœαžΎαžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž·αž€αž˜αŸ’αž˜αž€αžΆαžšαž‡αž½αž”αž”αŸ’αžšαž‡αž»αŸ†αž‚αŸ’αž“αžΆαž“αŸƒαž€αž‰αŸ’αž…αž”αŸ‹αž“αŸƒαž€αŸ†αžŽαŸ‚αž•αŸ’αžŸαŸαž„αŸ—αž‚αŸ’αž“αžΆ αžŠαžΎαž˜αŸ’αž”αžΈαž€αž»αŸ†αž±αŸ’αž™αž˜αžΆαž“αž€αžΆαžšαž‡αŸ’αžšαŸ€αžαž…αžΌαž›αž‘αŸ…αž€αŸ’αž“αž»αž„αž€αžΌαžŠαž“αŸƒαž―αž€αžŸαžΆαžš master.cfg αž“αŸ…αž€αŸ’αž“αž»αž„αžŸαŸ’αž‚αŸ’αžšαžΈαž”αž…αž˜αŸ’αž”αž„αž“αŸƒαž€αž˜αŸ’αž˜αžœαž·αž’αžΈ rac_gui.tcl αž”αž“αŸ’αž‘αžΆαžαŸ‹αžŠαŸ‚αž›αž˜αžΆαž“αž€αŸ†αžŽαŸ‚αž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“ αž“αž·αž„αž€αžΆαžšαž…αŸαž‰αž•αŸ’αžŸαžΆαž™αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž“αŸ’αžαŸ‚αž˜αž“αŸ…αž€αŸ’αž“αž»αž„αž”αž‹αž˜αž€αžαžΆ :

######################################################
#        Rac GUI
...
# version: 1.0.3
# release: 1

αž αžΎαž™αž•αŸ’αž’αŸ‚αž€αž›αžΎαž”αž“αŸ’αž‘αžΆαžαŸ‹αž‘αžΆαŸ†αž„αž“αŸαŸ‡ buildbot αž“αžΉαž„αžŠαžΆαž€αŸ‹αž›αŸαžαž€αž‰αŸ’αž…αž”αŸ‹αŸ” αžŠαžΎαž˜αŸ’αž”αžΈαž‘αžΆαž‰αž™αž€αž‘αž·αž“αŸ’αž“αž“αŸαž™ αžŸαžΌαž˜αž”αŸ’αžšαžΎαž€αžΆαžšαž αŸ… grep αž€αž»αž„αžŸαžΌαž›αŸ” αž“αŸ…αž€αŸ’αž“αž»αž„ buildbot αž’αŸ’αž“αž€αž‚αŸ’αžšαžΆαž“αŸ‹αžαŸ‚αž˜αž·αž“αž’αžΆαž…αž€αŸ†αžŽαžαŸ‹αž’αžαŸαžšαžŸαž˜αŸ’αžšαžΆαž”αŸ‹ "αž€αž˜αŸ’αž˜αž€αžš" αž”αžΆαž“αž‘αŸ (αž™αŸ‰αžΆαž„αž αŸ„αž…αžŽαžΆαžŸαŸ‹ αžαŸ’αž‰αž»αŸ†αž˜αž·αž“αž”αžΆαž“αžšαž€αžƒαžΎαž‰αž–αžΈαžšαž”αŸ€αž”)αŸ” αž“αŸαŸ‡αž‚αžΊαž‡αžΆαž’αŸ’αžœαžΈαžŠαŸ‚αž›αž›αž€αŸ’αžαžŽαŸˆαžŸαž˜αŸ’αž”αžαŸ’αžαž·αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎαŸ” αž‘αžΆαŸ†αž„αž“αŸ„αŸ‡αŸ” αž“αŸ…αž€αŸ’αž“αž»αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž“αŸƒαž€αžΆαžšαž‡αž½αž”αž”αŸ’αžšαž‡αž»αŸ†αž‚αŸ’αž“αžΆ αž™αžΎαž„αž”αž“αŸ’αžαŸ‚αž˜αž‡αŸ†αž αžΆαž“αžŠαžΎαž˜αŸ’αž”αžΈαž€αŸ†αžŽαžαŸ‹αž€αŸ†αžŽαŸ‚ αž“αž·αž„αž€αžΆαžšαž…αŸαž‰αž•αŸ’αžŸαžΆαž™ αž αžΎαž™αžαžΆαž˜αž“αŸ„αŸ‡ αž€αŸ†αžŽαžαŸ‹αž€αŸ†αžŽαŸ‚ αž“αž·αž„αž€αžΆαžšαž…αŸαž‰αž•αŸ’αžŸαžΆαž™αž›αž€αŸ’αžαžŽαŸˆαžŸαž˜αŸ’αž”αžαŸ’αžαž·αŸ” αž›αž€αŸ’αžαžŽαžŸαž˜αŸ’αž”αžαŸ’αžαž·αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž€αŸ†αžŽαžαŸ‹αžαžΆαž˜αžœαž·αž’αžΈαž•αŸ’αžŸαŸαž„αŸ— αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαž“αŸαŸ‡αžŠαŸ„αž™αž αŸ…αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαž€αž»αž„αžŸαžΌαž›αŸ–

# Π”ΠΎΠ±Π°Π²ΠΈΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ вСрсии ΠΈΠ· основного Ρ„Π°ΠΉΠ»Π°
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 αžŸαŸ’αžαž„αŸ‹αžŠαžΆαžš i.e. αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαž‡αŸ†αž“αž½αžŸαžαž˜αŸ’αž›αŸƒαž“αŸ…αž€αŸ’αž“αž»αž„αž―αž€αžŸαžΆαžš spec αž‡αžΆαž˜αž½αž™αž“αžΉαž„αžαž˜αŸ’αž›αŸƒαžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž€αžΆαžš

# мСняСм Π²Π΅Ρ€ΡΠΈΡŽ
rac_gui_build_RPM.addStep(steps.ShellCommand(
       command=["sed", "-i", util.Interpolate("s/.*Version:.*/Version:t%(prop:version)s/"), "/home/buildbot/rpmbuild/SPECS/rac_gui.spec"]))
# мСняСм Ρ€Π΅Π»ΠΈΠ·
rac_gui_build_RPM.addStep(steps.ShellCommand(
       command=["sed", "-i", util.Interpolate("s/.*Release:.*/Release:t%(prop:release)s/"), "/home/buildbot/rpmbuild/SPECS/rac_gui.spec"]))

# запускаСм процСсс сборки
rac_gui_build_RPM.addStep(steps.RpmBuild(
       specfile="/home/buildbot/rpmbuild/SPECS/rac_gui.spec",
       dist='.el5',
       topdir='/home/buildbot/rpmbuild',
       builddir='/home/buildbot/rpmbuild/build',
       rpmdir='/home/buildbot/rpmbuild/RPMS',
       sourcedir='/home/buildbot/rpmbuild/SOURCES'
      )
)

αž™αžΎαž„αž…αž˜αŸ’αž›αž„αž€αž‰αŸ’αž…αž”αŸ‹αžŠαŸ‚αž›αž”αžΆαž“αž‡αž½αž”αž”αŸ’αžšαž‡αž»αŸ†αž‚αŸ’αž“αžΆαžŠαŸ‚αž›αž”αžΆαž“αž”αž‰αŸ’αž…αž”αŸ‹ αž“αž·αž„αž”αŸαžŽαŸ’αžŽαžŸαžΆαžšαžŠαŸ‚αž›αž˜αžΆαž“αž”αŸ’αžšαž—αž–αž‘αŸ…αž˜αŸαŸ” αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž’αŸ’αž“αž€αž’αžΆαž…αž…αž˜αŸ’αž›αž„αž―αž€αžŸαžΆαžšαž–αžΈαž―αž€αžŸαžΆαžšαž€αžΆαžšαž„αžΆαžšαžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž—αŸ’αž›αžΆαž˜αŸ—αž‘αŸ…αž€αžΆαž“αŸ‹αžƒαŸ’αž›αžΆαŸ†αž„ αž¬αž‚αŸαž αž‘αŸ†αž–αŸαžšαžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αŸ”

# Π‘ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅ΠΌ Ρ„Π°ΠΉΠ» Π½Π° мастСр
rac_gui_build_RPM.addStep(
       steps.FileUpload(
          workersrc=util.Interpolate("/home/buildbot/rpmbuild/RPMS/noarch/rac-gui-%(prop:version)s-%(prop:release)s.noarch.rpm"),
          masterdest=util.Interpolate("/home/buildbot/builds/rac-gui-%(prop:version)s-%(prop:release)s.noarch.rpm")
      )
)

rac_gui_build_RPM.addStep(
       steps.FileUpload(
       workersrc=util.Interpolate("/home/buildbot/rpmbuild/SOURCES/rac-gui-%(prop:version)s-%(prop:release)s.tar.gz"),
          masterdest=util.Interpolate("/home/buildbot/builds/rac-gui-%(prop:version)s-%(prop:release)s.tar.gz")
       )
)

αž…αžΌαžšαž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž…αž˜αŸ’αž›αž„αž€αž‰αŸ’αž…αž”αŸ‹αžŠαŸ‚αž›αž”αŸ’αžšαž˜αžΌαž›αž”αžΆαž“αž‘αŸ…αž”αž„αŸ’αž αŸ„αŸ‡αžαžΆαž˜αžšαž™αŸˆ 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 αžαŸ’αž›αž½αž“αžœαžΆαž€αŸ’αž“αž»αž„αž’αŸ†αž‘αž»αž„αž–αŸαž›αž‡αž½αž”αž”αŸ’αžšαž‡αž»αŸ†αž‚αŸ’αž“αžΆ αž αžΎαž™αžαŸ’αžšαžΌαžœαž”αžΆαž“αž–αž·αž–αžŽαŸŒαž“αžΆαž“αŸ…αžαžΆαž„αž€αŸ’αž“αž»αž„ spec; αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ Debian αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž’αŸ’αžœαžΎαžœαžΆαž“αŸ…αž‘αžΈαž“αŸαŸ‡αŸ–

# ПомСняСм ΠΏΡƒΡ‚ΠΈ ΠΊ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°ΠΌ
rac_gui_build_DEB.addStep(steps.ShellCommand(
       command=["sed", "-i", "s+^set dir(lib)+set dir(lib) /usr/share/rac-gui/lib ;#+g", "racgui"]))

# ПомСняСм ΠΏΡƒΡ‚ΠΈ ΠΊ Ρ„Π°ΠΉΠ»Π°ΠΌ
rac_gui_build_DEB.addStep(steps.ShellCommand(
       command=["sed", "-i", "s+[pwd]+/usr/share/rac-gui+g", "racgui"]))

# Π·Π°Π°Ρ€Ρ…ΠΈΠ²ΠΈΡ€ΡƒΠ΅ΠΌ исходники
rac_gui_build_DEB.addStep(steps.ShellCommand(
       command=["tar", "czf", util.Interpolate("../rac-gui_%(prop:version)s.orig.tar.gz"), "."]))

# Π‘ΠΎΠ±Π΅Ρ€Ρ‘ΠΌ ΠΏΠ°ΠΊΠ΅Ρ‚
rac_gui_build_DEB.addStep(steps.ShellCommand(
       command=["dpkg-buildpackage"]))

# Π‘ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅ΠΌ Ρ„Π°ΠΉΠ» Π½Π° мастСр
rac_gui_build_DEB.addStep(
       steps.FileUpload(
       workersrc=util.Interpolate("../rac-gui_%(prop:version)s-%(prop:release)s_amd64.deb"),
           masterdest=util.Interpolate("/home/buildbot/builds/rac-gui_%(prop:version)s-%(prop:release)s_amd64.deb")
       )
)
rac_gui_build_DEB.addStep(
        steps.MasterShellCommand(
            command=["/usr/local/bin/deploy-ftp.tcl",
             util.Interpolate("--local-file=/home/buildbot/builds/rac-gui_%(prop:version)s-%(prop:release)s_amd64.deb"),
             util.Interpolate("--remote-file=uploads/rac-gui/rac-gui_%(prop:version)s-%(prop:release)s_amd64.deb")]
        )
)

αž αžΎαž™αžšαž½αž…αžšαžΆαž›αŸ‹αž‡αžΆαž˜αž½αž™ DEB αž₯αž‘αžΌαžœαž“αŸαŸ‡ windows!

rac_gui_build_WIN = util.BuildFactory()

rac_gui_build_WIN.addStep(steps.Git(
       repourl = 'https://bitbucket.org/svk28/rac-gui.git',
       haltOnFailure = True,
       submodules = True,
       mode='full',
       workdir='build',
       progress = True)
)

αžŠαŸ„αž™αžŸαžΆαžš grep αž“αž·αž„ sed αž˜αž·αž“αž˜αžΆαž“αž›αž€αŸ’αžαžŽαŸˆαžŸαŸ’αžαž„αŸ‹αžŠαžΆαžšαž“αŸ…αž€αŸ’αž“αž»αž„ Windows (αž¬αž˜αžΆαž“?) αž™αžΎαž„αž“αžΉαž„αž”αŸ’αžšαžΎ powershell

# Π”ΠΎΠ±Π°Π²ΠΈΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ вСрсии ΠΈΠ· основного Ρ„Π°ΠΉΠ»Π°
rac_gui_build_WIN.addStep(
       steps.SetPropertyFromCommand(
       command="powershell -command "((Get-Content .rac_gui.tcl | Select-String -Pattern 'version:') -split 's')[2]",
       property="version"
       )
    )

# Π”ΠΎΠ±Π°Π²ΠΈΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ€Π΅Π»ΠΈΠ·Π° ΠΈΠ· основного Ρ„Π°ΠΉΠ»Π°
rac_gui_build_WIN.addStep(
       steps.SetPropertyFromCommand(
       command="powershell -command "((Get-Content .rac_gui.tcl | Select-String -Pattern 'release:') -split 's')[2]",
       property="release"
       )
)

# Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ запускаСмый Ρ„Π°ΠΉΠ»
rac_gui_build_WIN.addStep(steps.ShellCommand(
       command=["c:binfreewrap.exe", "rac_gui.tcl"]))

# Π·Π°ΠΏΠ°ΠΊΡƒΠ΅ΠΌ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ
rac_gui_build_WIN.addStep(steps.ShellCommand(
       command=["c:Program Files7-zip7z.exe", "a", "-r", util.Interpolate("..rac-gui_%(prop:version)s-%(prop:release)s.win.zip"), "..build"]))

# скопируСм Π½Π° мастСр
rac_gui_build_WIN.addStep(
       steps.FileUpload(
       workersrc=util.Interpolate("..rac-gui_%(prop:version)s-%(prop:release)s.win.zip"),
           masterdest=util.Interpolate("/home/buildbot/builds/rac-gui_%(prop:version)s-%(prop:release)s.win.zip")
       )
)
# Π‘ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅ΠΌ Ρ„Π°ΠΉΠ» Π½Π° хостинг
rac_gui_build_WIN.addStep(
        steps.MasterShellCommand(
            command=["/usr/local/bin/deploy-ftp.tcl",
            util.Interpolate("--local-file=/home/buildbot/builds/rac-gui_%(prop:version)s-%(prop:release)s.win.zip"),
            util.Interpolate("--remote-file=uploads/rac-gui/rac-gui_%(prop:version)s-%(prop:release)s.win.zip")]
       )
)

# Π’ΡƒΡ‚ опрСдСляСм ΠΊΠ°ΠΊΠΈΠ΅ сборщики Ρƒ нас Π΅ΡΡ‚ΡŒ
c['builders'] = [
        util.BuilderConfig(name="Rac-GUI-RPM-builder", workername='CentOS', factory=rac_gui_build_RPM),
        util.BuilderConfig(name="Rac-GUI-DEB-builder", workername='Debian-10', factory=rac_gui_build_DEB),
        util.BuilderConfig(name="Rac-GUI-WIN-builder", workername='Windows-10', factory=rac_gui_build_WIN),
]

αž™αžΎαž„αž“αžΉαž„αž”αŸ’αžšαžΎαž’αŸŠαžΈαž˜αŸ‚αž›αžŠαžΎαž˜αŸ’αž”αžΈαž‡αžΌαž“αžŠαŸ†αžŽαžΉαž„αž’αŸ’αž“αž€αž’αŸ†αž–αžΈαžŸαŸ’αžαžΆαž“αž—αžΆαž–αž“αŸƒαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŸαžΆαž„αžŸαž„αŸ‹αŸ”


c['services'] = []

template=u'''
    <h4>Build status: {{ summary }}</h4>
    <p> Worker used: {{ workername }}</p>
    {% for step in build['steps'] %}
    <p> {{ step['name'] }}: {{ step['result'] }}</p>
    {% endfor %}
    <p><b> -- The Buildbot</b></p>
    '''

mailNotifier = reporters.MailNotifier(fromaddr="[email protected]",
             sendToInterestedUsers=False,
             mode=('all'),
             extraRecipients=["[email protected]"],
             relayhost="mail.domain.ru",
             smtpPort=587,
             smtpUser="[email protected]",
             smtpPassword="******",
             messageFormatter=reporters.MessageFormatter(
                                 template=template, template_type='html',
                                 wantProperties=True, wantSteps=True))

c['services'].append(mailNotifier)

# ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ настройки мастСра
c['title'] = "The process of bulding"
c['titleURL'] = "http://vm-srv-build1:80/"
c['buildbotURL'] = "http://vm-srv-build1/"
c['www'] = dict(port=80,
                plugins=dict(waterfall_view={}, console_view={}, grid_view={}))
c['db'] = {
       'db_url' : "sqlite:///state.sqlite"
}

αžšαž€αŸ’αžŸαžΆαž‘αž»αž€αž―αž€αžŸαžΆαžš αž αžΎαž™αž’αŸ’αž“αž€αž’αžΆαž…αž–αŸ’αž™αžΆαž™αžΆαž˜αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž’αŸ’αž“αž€αž‡αŸ†αž“αž½αž™αž€αžΆαžšαŸ–

systemctl restart buildbot-master

αž“αŸ…αž€αŸ’αž“αž»αž„αž€αŸ†αžŽαžαŸ‹αž αŸαžαž» αž™αžΎαž„αž“αžΉαž„αž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αžαžΆαž’αŸ’αžœαžΈαž‚αŸ’αžšαž”αŸ‹αž™αŸ‰αžΆαž„αž‚αžΊαžŸαŸ’αžαž·αžαž“αŸ…αž€αŸ’αž“αž»αž„αž›αŸ†αžŠαžΆαž”αŸ‹αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹ αž αžΎαž™αž’αŸ’αžœαžΈαŸ—αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŠαžΌαž…αž’αž˜αŸ’αž˜αžαžΆαŸ” αž€αž˜αŸ’αž˜αž€αžšαžšαž”αžŸαŸ‹αž™αžΎαž„αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž‚αž½αžšαžαŸ‚αž—αŸ’αž‡αžΆαž”αŸ‹αž‚αŸ’αž“αžΆαž₯αž‘αžΌαžœαž“αŸαŸ‡ αžŠαŸ‚αž›αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαžΆαž™αž€αžΆαžšαžŽαŸαžŠαŸ„αž™αžšαžΈαž€αžšαžΆαž™αž“αŸ…αž€αŸ’αž“αž»αž„αž€αŸ†αžŽαžαŸ‹αž αŸαžαž» »»'/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

αž“αŸαŸ‡αž”αž‰αŸ’αž…αž”αŸ‹αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŠαŸ†αž‘αžΎαž„αŸ” αž’αŸ’αž“αž€αž’αžΆαž…αž˜αžΎαž›αžŸαŸ’αžαžΆαž“αž—αžΆαž–αž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αžαžΆαž˜αžšαž™αŸˆαž…αŸ†αžŽαž»αž…αž”αŸ’αžšαž‘αžΆαž€αŸ‹αž”αžŽαŸ’αžŠαžΆαž‰αŸ” αž“αŸ…αž€αž“αŸ’αž›αŸ‚αž„αžŠαŸ‚αž›αž’αŸ’αž“αž€αž€αŸαž’αžΆαž…αžƒαžΎαž‰αž€αŸ†αž αž»αžŸαž€αŸ’αž“αž»αž„αž€αžΆαžšαž”αž„αŸ’αž€αžΎαž αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŠαŸ‚αž›αž”αž„αŸ’αž€αž€ αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž˜αžΆαž“αž’αŸ’αžœαžΈαž˜αž½αž™αžαž»αžŸ αž›αŸ”

αž—αŸ’αž›αžΆαž˜αŸ—αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž€αžΆαžšαž”αžΎαž€αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš αž€αž˜αŸ’αž˜αž€αžšαž–αž·αž”αžΆαž€αžšαž”αžŸαŸ‹αž™αžΎαž„αž’αžΆαž…αž˜αžΎαž›αž”αžΆαž“αžαžΆαž˜αžšαž™αŸˆαž˜αŸ‰αžΊαž“αž»αž™ β€œBuilds” -> β€œWorkers”

Buildbot αž€αŸ’αž“αž»αž„αž§αž‘αžΆαž αžšαžŽαŸ

αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŸαžΆαž„αžŸαž„αŸ‹αžŠαŸ†αž”αžΌαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž‰αŸ’αž…αž”αŸ‹ (ឧ. αž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž‘αŸ…αžƒαŸ’αž›αžΆαŸ†αž„ Git) αžŸαŸ’αžαžΆαž“αž—αžΆαž–αž“αŸƒαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž“αžΉαž„αž”αž„αŸ’αž αžΆαž‰αž“αŸ…αž›αžΎαž‘αŸ†αž–αŸαžšαž‘αžΈαž˜αž½αž™αŸ”

Buildbot αž€αŸ’αž“αž»αž„αž§αž‘αžΆαž αžšαžŽαŸ

αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αŸ’αž“αž€αž…αž»αž…αž›αžΎαž”αž“αŸ’αž‘αžΆαžαŸ‹αžŠαŸ‚αž›αž’αŸ’αž“αž€αž…αž„αŸ‹αž”αžΆαž“αžŠαŸ„αž™αž”αŸ’αžšαžΎαž€αžŽαŸ’αžŠαž»αžš αž‘αŸ†αž–αŸαžšαž˜αž½αž™αž“αžΉαž„αž”αžΎαž€αž‡αžΆαž˜αž½αž™αž“αžΉαž„αžŸαŸ’αžαžΆαž“αž—αžΆαž–αž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αž“αŸƒαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž“αŸαŸ‡ αžŠαŸ‚αž›αž’αŸ’αž“αž€αž’αžΆαž…αž˜αžΎαž›αžƒαžΎαž‰αž’αŸ’αžœαžΈαžŠαŸ‚αž›αž€αŸ†αž–αž»αž„αž€αžΎαžαž‘αžΎαž„ αž€αŸ†αž αž»αžŸαž’αŸ’αžœαžΈαžαŸ’αž›αŸ‡αŸ”αž›αŸ”

Buildbot αž€αŸ’αž“αž»αž„αž§αž‘αžΆαž αžšαžŽαŸ

αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž’αŸ’αž“αž€αž‡αŸ†αž“αž½αž™αž€αžΆαžšαž‘αžΆαŸ†αž„αž˜αžΌαž›αž’αžΆαž…αžšαž€αž”αžΆαž“αž“αŸ…αž‘αžΈαž“αŸαŸ‡

import os, re
from buildbot.plugins import steps, util, schedulers, worker, changes, reporters
c= BuildmasterConfig ={}
c['workers'] = [ worker.Worker('CentOS', '123456'), worker.Worker('Debian-10', '123456'), worker.Worker('Windows-10', '123456')]
c['protocols'] = {'pb': {'port': 4000}} 
c['change_source'] = []
c['change_source'].append(changes.GitPoller(
repourl = 'https://bitbucket.org/svk28/rac-gui.git',
project = 'Rac-GUI',
branches = True,
pollInterval = 600
))
# слуТба запуска сборки
c['schedulers'] = []
c['schedulers'].append(schedulers.SingleBranchScheduler(
name="Rac-GUI-schedulers",
change_filter=util.ChangeFilter(branch='master'),
builderNames=["Rac-GUI-RPM-builder", "Rac-GUI-DEB-builder", "Rac-GUI-WIN-builder"],
properties = {'owner': 'admin'}
))
@util.renderer
def get_name_version_release(props):
prog_name = "rac-gui"
prog_version = "1.0.3"
prog_release = "3"
return {
"prog_name": prog_name
#"prog_version": prog_version,
#"prog_release": prog_release
}
rac_gui_build_RPM = util.BuildFactory()
rac_gui_build_RPM.addStep(steps.Git(
repourl = 'https://bitbucket.org/svk28/rac-gui.git',
workdir = 'rac-gui',
haltOnFailure = True,
submodules = True,
mode='full',
progress = True)
)
# Π”ΠΎΠ±Π°Π²ΠΈΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ вСрсии ΠΈΠ· основного Ρ„Π°ΠΉΠ»Π°
rac_gui_build_RPM.addStep(
steps.SetPropertyFromCommand(
command="grep version ../rac-gui/rac_gui.tcl | grep -oE 'b[0-9]{1,2}.[0-9]{1,2}.[0-9]{1,2}b'", property="version"
)
)
# Π”ΠΎΠ±Π°Π²ΠΈΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ€Π΅Π»ΠΈΠ·Π° ΠΈΠ· основного Ρ„Π°ΠΉΠ»Π°
rac_gui_build_RPM.addStep(
steps.SetPropertyFromCommand(
command="grep release ../rac-gui/rac_gui.tcl | grep -oE 'b[0-9]{1,3}b'", property="release"
)
)
rac_gui_build_RPM.addStep(steps.ShellCommand(
command=["tar", "czf", util.Interpolate("/home/buildbot/rpmbuild/SOURCES/rac-gui-%(prop:version)s-%(prop:release)s.tar.gz"), "../rac-gui"]))
rac_gui_build_RPM.addStep(steps.ShellCommand(
command=["cp", "../rac-gui/rac_gui.spec", "/home/buildbot/rpmbuild/SPECS/rac_gui.spec"]))
rac_gui_build_RPM.addStep(steps.ShellCommand(
command=["sed", "-i", util.Interpolate("s/.*Version:.*/Version:t%(prop:version)s/"), "/home/buildbot/rpmbuild/SPECS/rac_gui.spec"]))
rac_gui_build_RPM.addStep(steps.ShellCommand(
command=["sed", "-i", util.Interpolate("s/.*Release:.*/Release:t%(prop:release)s/"), "/home/buildbot/rpmbuild/SPECS/rac_gui.spec"]))
rac_gui_build_RPM.addStep(steps.RpmBuild(
specfile="/home/buildbot/rpmbuild/SPECS/rac_gui.spec",
dist='.el5',
topdir='/home/buildbot/rpmbuild',
builddir='/home/buildbot/rpmbuild/build',
rpmdir='/home/buildbot/rpmbuild/RPMS',
sourcedir='/home/buildbot/rpmbuild/SOURCES'
))
# Π‘ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅ΠΌ Ρ„Π°ΠΉΠ» Π½Π° мастСр
rac_gui_build_RPM.addStep(
steps.FileUpload(
workersrc=util.Interpolate("/home/buildbot/rpmbuild/RPMS/noarch/rac-gui-%(prop:version)s-%(prop:release)s.noarch.rpm"),
masterdest=util.Interpolate("/home/buildbot/builds/rac-gui-%(prop:version)s-%(prop:release)s.noarch.rpm")
)
)
rac_gui_build_RPM.addStep(
steps.FileUpload(
workersrc=util.Interpolate("/home/buildbot/rpmbuild/SOURCES/rac-gui-%(prop:version)s-%(prop:release)s.tar.gz"),
masterdest=util.Interpolate("/home/buildbot/builds/rac-gui-%(prop:version)s-%(prop:release)s.tar.gz")
)
)
rac_gui_build_RPM.addStep(
steps.MasterShellCommand(
command=["/usr/local/bin/deploy-ftp.tcl",
util.Interpolate("--local-file=/home/buildbot/builds/rac-gui-%(prop:version)s-%(prop:release)s.noarch.rpm"),
util.Interpolate("--remote-file=uploads/rac-gui/rac-gui-%(prop:version)s-%(prop:release)s.noarch.rpm")]
)
)
rac_gui_build_RPM.addStep(
steps.MasterShellCommand(
command=["/usr/local/bin/deploy-ftp.tcl",
util.Interpolate("--local-file=/home/buildbot/builds/rac-gui-%(prop:version)s-%(prop:release)s.tar.gz"),
util.Interpolate("--remote-file=uploads/rac-gui/rac-gui-%(prop:version)s-%(prop:release)s.tar.gz")]
)
)
####################################
##      DEB 
####################################
rac_gui_build_DEB = util.BuildFactory()
rac_gui_build_DEB.addStep(steps.Git(
repourl = 'https://bitbucket.org/svk28/rac-gui.git',
haltOnFailure = True,
submodules = True,
mode='full',
workdir='build',
progress = True)
)
# Π”ΠΎΠ±Π°Π²ΠΈΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ вСрсии ΠΈΠ· основного Ρ„Π°ΠΉΠ»Π°
rac_gui_build_DEB.addStep(
steps.SetPropertyFromCommand(
command="grep version rac_gui.tcl | grep -oE 'b[0-9]{1,2}.[0-9]{1,2}.[0-9]{1,2}b'", property="version"
)
)
# Π”ΠΎΠ±Π°Π²ΠΈΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ€Π΅Π»ΠΈΠ·Π° ΠΈΠ· основного Ρ„Π°ΠΉΠ»Π°
rac_gui_build_DEB.addStep(
steps.SetPropertyFromCommand(
command="grep release rac_gui.tcl | grep -oE 'b[0-9]{1,3}b'", property="release"
)
)
# ΠŸΠ΅Ρ€Π΅ΠΈΠΌΠ΅Π½ΡƒΠ΅ΠΌ запускаСмый Ρ„Π°ΠΉΠ»
rac_gui_build_DEB.addStep(steps.ShellCommand(
command=["mv", "rac_gui.tcl", "racgui"]))
# ПомСняСм ΠΏΡƒΡ‚ΠΈ ΠΊ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°ΠΌ
rac_gui_build_DEB.addStep(steps.ShellCommand(
command=["sed", "-i", "s+^set dir(lib)+set dir(lib) /usr/share/rac-gui/lib ;#+g", "racgui"]))
# ПомСняСм ΠΏΡƒΡ‚ΠΈ ΠΊ Ρ„Π°ΠΉΠ»Π°ΠΌ
rac_gui_build_DEB.addStep(steps.ShellCommand(
command=["sed", "-i", "s+[pwd]+/usr/share/rac-gui+g", "racgui"]))
# Π·Π°Π°Ρ€Ρ…ΠΈΠ²ΠΈΡ€ΡƒΠ΅ΠΌ исходники
rac_gui_build_DEB.addStep(steps.ShellCommand(
command=["tar", "czf", util.Interpolate("../rac-gui_%(prop:version)s.orig.tar.gz"), "."]))
# Π‘ΠΎΠ±Π΅Ρ€Ρ‘ΠΌ ΠΏΠ°ΠΊΠ΅Ρ‚
rac_gui_build_DEB.addStep(steps.ShellCommand(
command=["dpkg-buildpackage"]))
# Π‘ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅ΠΌ Ρ„Π°ΠΉΠ» Π½Π° мастСр
rac_gui_build_DEB.addStep(
steps.FileUpload(
workersrc=util.Interpolate("../rac-gui_%(prop:version)s-%(prop:release)s_amd64.deb"),
masterdest=util.Interpolate("/home/buildbot/builds/rac-gui_%(prop:version)s-%(prop:release)s_amd64.deb")
)
)
rac_gui_build_DEB.addStep(
steps.MasterShellCommand(
command=["/usr/local/bin/deploy-ftp.tcl",
util.Interpolate("--local-file=/home/buildbot/builds/rac-gui_%(prop:version)s-%(prop:release)s_amd64.deb"),
util.Interpolate("--remote-file=uploads/rac-gui/rac-gui_%(prop:version)s-%(prop:release)s_amd64.deb")]
)
)
############################################
#       WIN
############################################
rac_gui_build_WIN = util.BuildFactory()
rac_gui_build_WIN.addStep(steps.Git(
repourl = 'https://bitbucket.org/svk28/rac-gui.git',
haltOnFailure = True,
submodules = True,
mode='full',
workdir='build',
progress = True)
)
# Π”ΠΎΠ±Π°Π²ΠΈΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ вСрсии ΠΈΠ· основного Ρ„Π°ΠΉΠ»Π°
rac_gui_build_WIN.addStep(
steps.SetPropertyFromCommand(
command="powershell -command "((Get-Content .rac_gui.tcl | Select-String -Pattern 'version:') -split 's')[2]",
property="version"
)
)
# Π”ΠΎΠ±Π°Π²ΠΈΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ€Π΅Π»ΠΈΠ·Π° ΠΈΠ· основного Ρ„Π°ΠΉΠ»Π°
rac_gui_build_WIN.addStep(
steps.SetPropertyFromCommand(
command="powershell -command "((Get-Content .rac_gui.tcl | Select-String -Pattern 'release:') -split 's')[2]",
property="release"
)
)
# Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ запускаСмый Ρ„Π°ΠΉΠ»
rac_gui_build_WIN.addStep(steps.ShellCommand(
command=["c:binfreewrap.exe", "rac_gui.tcl"]))
# Π·Π°ΠΏΠ°ΠΊΡƒΠ΅ΠΌ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ
rac_gui_build_WIN.addStep(steps.ShellCommand(
command=["c:Program Files7-zip7z.exe", "a", "-r", util.Interpolate("..rac-gui_%(prop:version)s-%(prop:release)s.win.zip"), "..build"]))
# скопируСм Π½Π° мастСр
rac_gui_build_WIN.addStep(
steps.FileUpload(
workersrc=util.Interpolate("..rac-gui_%(prop:version)s-%(prop:release)s.win.zip"),
masterdest=util.Interpolate("/home/buildbot/builds/rac-gui_%(prop:version)s-%(prop:release)s.win.zip")
)
)
# Π‘ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅ΠΌ Ρ„Π°ΠΉΠ» Π½Π° хостинг
rac_gui_build_WIN.addStep(
steps.MasterShellCommand(
command=["/usr/local/bin/deploy-ftp.tcl",
util.Interpolate("--local-file=/home/buildbot/builds/rac-gui_%(prop:version)s-%(prop:release)s.win.zip"),
util.Interpolate("--remote-file=uploads/rac-gui/rac-gui_%(prop:version)s-%(prop:release)s.win.zip")]
)
)
c['builders'] = [
util.BuilderConfig(name="Rac-GUI-RPM-builder", workername='CentOS', factory=rac_gui_build_RPM),
util.BuilderConfig(name="Rac-GUI-DEB-builder", workername='Debian-10', factory=rac_gui_build_DEB),
util.BuilderConfig(name="Rac-GUI-WIN-builder", workername='Windows-10', factory=rac_gui_build_WIN),
]
c['services'] = []
template=u'''
<h4>Build status: {{ summary }}</h4>
<p> Worker used: {{ workername }}</p>
{% for step in build['steps'] %}
<p> {{ step['name'] }}: {{ step['result'] }}</p>
{% endfor %}
<p><b> -- The Buildbot</b></p>
'''
mailNotifier = reporters.MailNotifier(fromaddr="[email protected]",
sendToInterestedUsers=False,
mode=('all'),
extraRecipients=["[email protected]"],
relayhost="mail.domain.local",
smtpPort=587,
smtpUser="[email protected]",
smtpPassword="**********",
messageFormatter=reporters.MessageFormatter(
template=template, template_type='html',
wantProperties=True, wantSteps=True))
c['services'].append(mailNotifier)
c['title'] = "The process of bulding"
c['titleURL'] = "http://vm-srv-build1:80/"
c['buildbotURL'] = "http://vm-srv-build1/"
c['www'] = dict(port=80,
plugins=dict(waterfall_view={}, console_view={}, grid_view={}))
c['db'] = {
'db_url' : "sqlite:///state.sqlite"
}

αžŸαž˜αŸ’αž—αžΆαžšαŸˆ

αžŸαž˜αŸ’αž—αžΆαžšαŸˆαžαžΆαž„αž€αŸ’αžšαŸ„αž˜αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎαž€αŸ’αž“αž»αž„αž€αžΆαžšαžšαŸ€αž”αž…αŸ†αž’αžαŸ’αžαž”αž‘αŸ–

αž”αŸ’αžšαž—αž–: www.habr.com

αž”αž“αŸ’αžαŸ‚αž˜αž˜αžαž·αž™αŸ„αž”αž›αŸ‹