Buildbot ื‘ื“ื•ื’ืžืื•ืช

ื”ื™ื™ืชื™ ืฆืจื™ืš ืœื”ื’ื“ื™ืจ ืืช ืชื”ืœื™ืš ื”ื”ืจื›ื‘ื” ื•ื”ืืกืคืงื” โ€‹โ€‹ืฉืœ ื—ื‘ื™ืœื•ืช ืชื•ื›ื ื” ืžืžืื’ืจ Git ืœืืชืจ. ื•ื›ืฉืจืื™ืชื™, ืœื ื›ืœ ื›ืš ืžื–ืžืŸ, ื›ืืŸ ื‘-Habrรฉ ืžืืžืจ ืขืœ buildbot (ืงื™ืฉื•ืจ ื‘ืกื•ืฃ), ื”ื—ืœื˜ืชื™ ืœื ืกื•ืช ืื•ืชื• ื•ืœื™ื™ืฉื ืื•ืชื•.

ืžื›ื™ื•ื•ืŸ ืฉ-buildbot ื”ื™ื ืžืขืจื›ืช ืžื‘ื•ื–ืจืช, ื–ื” ื™ื”ื™ื” ื”ื’ื™ื•ื ื™ ืœื™ืฆื•ืจ ืžืืจื— ื‘ื ื™ื™ื” ื ืคืจื“ ืขื‘ื•ืจ ื›ืœ ืืจื›ื™ื˜ืงื˜ื•ืจื” ื•ืžืขืจื›ืช ื”ืคืขืœื”. ื‘ืžืงืจื” ืฉืœื ื•, ืืœื• ื™ื”ื™ื• ืžื›ื•ืœื•ืช LXC (ื‘ืžืงืจื” ืฉืœ ืœื™ื ื•ืงืก) ื•-qemu (ื‘ืžืงืจื” ืฉืœ Windows):

  • vm-srv-build1 - centos 7, ื™ื”ื™ื” ืžืืกื˜ืจ buildbot ื•ืื—ื“ ืžื”ืขื•ื‘ื“ื™ื
  • vm-srv-build2 - debian 10, ืœื‘ื ื™ื™ืช ื—ื‘ื™ืœื•ืช DEB
  • vm-srv-build3 - ื—ืœื•ื ื•ืช 10, ืœื”ืจื›ื‘ื”, ืืชื” ื™ื•ื“ืข ื‘ืฉื‘ื™ืœ ืžื”

ืื ื—ื ื• ื ืืกื•ืฃ GUI ืฉืœ Rac - ืžืžืฉืง ื’ืจืคื™ ืขื‘ื•ืจ 1C rac ืœื ื™ื”ื•ืœ ืืฉื›ื•ืœ ืฉืจืชื™ื. ืขื‘ื•ืจ ืœื™ื ื•ืงืก, ื›ืœื™ื ืกื˜ื ื“ืจื˜ื™ื™ื ืขื‘ื•ืจ ื›ืœ ืžืขืจื›ืช ื”ืคืขืœื” ื™ืฉืžืฉื•; ื›ื“ื™ ืœื‘ื ื•ืช ืงื•ื‘ืฅ exe ืขื‘ื•ืจ Windows ืžืกืงืจื™ืคื˜ tcl, ื”ืฉืชืžืฉ ืขื˜ื™ืคื” ื—ื•ืคืฉื™ืช.

ื”ืชืงื ื”

ื’ื ื• / ืœื™ื ื•ืงืก

ื™ืฉ ืžืกืคื™ืง ืชื™ืขื•ื“ ื‘ืื™ื ื˜ืจื ื˜ ืœื”ืชืงื ื” 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

ื›ืžื•ื‘ืŸ ืฉื™ื”ื™ื” ื ื›ื•ืŸ ื™ื•ืชืจ ืœืืกื•ืฃ ื—ื‘ื™ืœื•ืช ืขื‘ื•ืจ ื›ืœ ืžืขืจื›ืช ื”ืคืขืœื”, ืื‘ืœ ื–ื” ืžืขื‘ืจ ืœืชื—ื•ื ื”ืžืืžืจ. ื ืฉืžื™ื˜ ื’ื ืืช ื”ืชื™ืื•ืจ ืฉืœ ื”ื’ื“ืจืช ืงื•ื ื˜ื™ื™ื ืจื™ื ืœืขื‘ื•ื“ื”, ืจืง ืืฆื™ื™ืŸ ืฉืื ื™ ืžืฉืชืžืฉ ื‘-ProxMox VE. ื•ื’ื ืชืฆื˜ืจืš ืœื”ืชืงื™ืŸ ื—ื‘ื™ืœื•ืช ืขื‘ื•ืจ ื›ืœ ืฆื™ืจ ื”ื ื“ืจืฉ ืœื”ืจื›ื‘ื” (centos: rpmdevtools ื•ื›ื•'; debian: build-essential, dh-make, pbuilder ื•ื›ื•')

ืคืจื•ื™ืงื˜ื™ Build ื•ืฉื™ืจื•ืชื™ 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 Windows

ื›"ืขื•ื‘ื“" ืœื”ืจื›ื‘ื” ืชื—ืช Windows, ื™ืฉืžืฉ ืžื›ื•ื ื” ื•ื™ืจื˜ื•ืืœื™ืช ืขื ื”ืžื”ื“ื•ืจื” ื”ืื—ืจื•ื ื” ืฉืœ 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

ืขื‘ื•ืจ ื—ื‘ื™ืœื•ืช ืžื•ื›ื ื•ืช, ืฆื•ืจ ืกืคืจื™ื™ืช builds

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

ื•ืขืœ ืกืžืš ืฉื•ืจื•ืช ืืœื•, buildbot ื™ืžืกืคืจ ืืช ื”ื—ื‘ื™ืœื•ืช. ื›ื“ื™ ืœื—ืœืฅ ื ืชื•ื ื™ื, ื”ืฉืชืžืฉ ื‘-Console grep call. ื‘-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 ืจื’ื™ืœื”, ื›ืœื•ืžืจ. ื”ืคืงื•ื“ื” ืžื—ืœื™ืคื” ืืช ื”ืขืจื›ื™ื ื‘ืชื•ืš ืงื•ื‘ืฅ ื”ืžืคืจื˜ ื‘ืขืจื›ื™ื ื”ื ื“ืจืฉื™ื

# ะผะตะฝัะตะผ ะฒะตั€ัะธัŽ
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")]
        )
)

ื–ื”ื• ื–ื” ืขื ืกืœ"ื“. ื›ืขืช ื ืชื—ื™ืœ ืœืชืืจ ืืช ื”ืืœื’ื•ืจื™ืชื ืœื‘ื ื™ื™ืช ื—ื‘ื™ืœืช 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 ืขืฆืžื• ื‘ืžื”ืœืš ื”ื”ืจื›ื‘ื” ื•ืžืชื•ืืจื™ื ื‘ืชื•ืš ื”ืžืคืจื˜; ืขื‘ื•ืจ 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, ืขื›ืฉื™ื• ื—ืœื•ื ื•ืช!

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

ื–ื” ืžืฉืœื™ื ืืช ืชื”ืœื™ืš ื”ื”ื’ื“ืจื”. ืืชื” ื™ื›ื•ืœ ืœืจืื•ืช ืืช ื”ืžืฆื‘ ื”ื ื•ื›ื—ื™ ื“ืจืš ืžืžืฉืง ื”ืื™ื ื˜ืจื ื˜. ืื™ืคื” ืืชื” ื™ื›ื•ืœ ื’ื ืœืจืื•ืช ืฉื’ื™ืื•ืช ื‘ื ื™ื™ื”, ืœื‘ืขื•ื˜ ื‘ืชื”ืœื™ืš ืงืคื•ื ืื ืžืฉื”ื• ื”ืฉืชื‘ืฉ ื•ื›ื•'.

ืžื™ื“ ืœืื—ืจ ื”ื”ืฉืงื”, ื ื™ืชืŸ ืœืจืื•ืช ืืช ื”ืขื•ื‘ื“ื™ื ื”ืงืฉื™ื ืฉืœื ื• ื“ืจืš ื”ืชืคืจื™ื˜ "ื‘ื•ื ื™ื" -> "ืขื•ื‘ื“ื™ื"

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

ื”ื•ืกืคืช ืชื’ื•ื‘ื”