(ááľá á
á áá!
áľá áá Evgeny CherkináĽá á áááľá áá፠áŠáŁá፠ááľáĽ ááááľ áĄáľá ááŽááŤáá áá ááááłá.
áááááá áľáá ááŽáááľ á áááá âáááá¨áŁá¨áĽ áá áśááľáá áá áá á¨á°áťá áá?â áĽáá áá°áĽ ááááŤáᢠᨠIT ááŽáááľ ááŁáŠá áĽáľá á¨áááŁáą á ááľ á°á¨áłáłá á°á¨ááá˝á áŤáááᢠá¨áĽááá á°á¨ááá˝ á°áá°ááľ á áŤáľ-á°á á˛á°áŤ áĽáŠ áá. á áŤáąáŁ á¨á áᲠááŽáááľ á á˛áľ áĽáľá á¨áááá á ááśáá˛á áá°áľ ááŁáá á°á¨áłáłá ááááľ. buildbot áá áá áá°áľ á ááááἠááĽá áĽáŠ á¨áłáľ ááá á˘
á áá
á˝áá ááľáĽ áľá ááľáá˝ á á ááá áĽááł ááá
á¨áĽ áá°áአbuildbot. áá
áśááľáá áá á á
á á áá? áĽáá´áľ áá° áĽáą áá
á¨áĽ áĽá á¨áĽáą áá áá°á á áĽá áá¤áłá á¨áľáŤ áááááľ áĽáá´áľ áĽáá°ááááŁ? á áá˝áá áá áááŽáááľá á¨áá°áŤ á¨áá°áĽá°á˘áŤ áĽá á¨áá¨áŤ á áááááľ á ááá á áááłá˝áá á áŤáľá áá°áá á áá˝ááá˘
áááśá˝
áááśá˝
1. ááá BuildBot?
áá°á á˛á á habr-e áá áľá áľáá áŤá ááŁáĽáá˝á á áááťáá á°á¨áłáłá ááááľ á áá áá buildbot. áááłá áŁ
á°á! á áĽáááą á ááŽáááśáťá¸á ááľáĽ ááá á°á á°á á
áá áłá? á á áá á°áá
áľááá á°áá˝ á¨áá ááá áľ á áááᎠáááľáá? buildbot? á¨ááá á áá, ááá˝ ááłáŞáŤáá˝ á á: á¨ááá¨áĽ áááŁá áŞáŤ и ááá¨áá. áĽáá°áá áĽáááľá áłááᢠáá áĽááááš á°ááŁáŤáľ ááá¨áá áĽáááľá áá áááᢠá á°áŤáᣠbuildbot - á¨á áá áááᾠᣠá°ááŁáŤáľ áĽá፠áá áĽáá° ááľáĽ á°ááľá°áá ááá¨áá. á áá° áá¨áĽ. ááá áá áĽá¨áááá ááá á˘áá ááŽáááľ ááłáŞáŤ áľáááááá á¨ááá á°á¨ááá˝ ááᎠá ááá°ááá áĽá áአá¨áá á áááá˝ áŤáá á¨áááŁáł áľáááľ áááááľ ááá á ááááĽáá˘
á¨áááá ááŽáááłá¸á á áááśá ááľáĽ áá°áá, áĽáŤáá á¨áááłá "á ááŽáááą ááľáĽ áĽá á áá á áááá áľ ááá áá ááá˝ á¨áá á áááá˝ áŤáá ááááľáá á¨ááááľ áľáááľ ááá á ááááĄá?". áĽá á áá áĽá áášá ááá á¨áĽ ááá á áá áá buildbot.
áľááá á¨áĽá "á¨ááłáŞáŤ áłááľ"ᢠááŤá´, á áŤáľ áŁá áŞáŤáľá áááťáá buildbot:
- á ááá¤á áááľ áľá áŤá áááľ ááá áááá ááá˘
- á áľááááášá áľáááśá˝ ááááá áĽá ááááá áá áááśáá áĽáá° ááłáŞáŤ áá áá ááá˘
- áá áľáĽá°áŁá á ááŤááľá áľ áá˝á áá ááá˝ á¨ááá á á˝ááł áá
- á áá¨á¨áťáᣠáĽááá áá ááľ á áľá°ááá áá á°á ááľáááśá˝ áá¸áᢠáá°ááŤáľ áááśá áĽá á áá áŤáľááááá áĽá áŞá¤á áĽá á፠áá˝á á áŤáľááááá˘
2. á BuildMaster á¨áá፠á˝áá°-ááłáĽ
á¨á°ááŁá áľáááľ á ááá´áá¸á ááá¨áá ááᢠBuildMaster. á áááááľ áááĄ-
- áá¨áłá°áá á ááŽáááą ááá áá áá áááŚá˝
- áááŤá ááŽáááąá áááááŁáľ áĽá áááá°á˝ á á áŤá°á á áááááľ áĽáá˛ááá áŤáá
- áŤáłááá á°á áááá˝ áľá áľáááłá¸á áá¤áśá˝
BuildMaster á ááá á¨á°ááᨠmaster.cfg. áá ááá á áĽáŠ ááľáĽ ááᢠBuildMaster. á áá áá áá áĽá áĽáá´áľ áĽáá°ááá á á áłáŤáá. ááá áŤáą master.cfg python ááá - áĽáŞáá˝á á¨áá áá áľááŞááľ buildbot.
á¨áááĽáá á áŁá á áľááá ááá buildbot á¨áá áľá á ááᢠá áŤá°á. áá á áááááľ á áá á áľá°ááá á á°áᨠáľááá° ááá ááá ááááŁáľ á á¨áľ áááľ áá˝ááᢠBuildMaster. áĽáá˛áá á¨áŤáą ááŹáá˝ áĽá á°ááááŽá˝ áŤááľ á áአáááł á á°ááá áááŁá á áŤáŁá˘ ááľáĽ ááá áá˝ááᢠáĽááá áááŁá á áŤáŁá˘áá˝ áĽáá° python áááááŤáá˝á á áá áá áááá áá˝ááᢠverticalenv, venv.
BuildMaster áľáááá˝á áááá á°á áŤá°áŤáŠ á áŤá°á-y, áĽá áĽáą á á°áŤá, áŤá¨áááá¸áá. áŤá áááľ á ááľ ááŽáááľ á¨ááááŁáľ áĽá á¨ááá¨á áá°áľ áááĽá áá˝áá á áŤá°á-e á áááśááľ áĽá á ááááľ áľá á áá á°áŤá°á ááá˘
á¨áá°á áᣠá¨ááŽáááľ ááá áŽáľ á áĽáŤááłááą áá áá¨á°áłá á áŤá°á- á .
3. ááŤá
áľááá áĽáááľ. áĄáĄááą 18.04á áĽáá° á áľá°ááá áĽá ááááᢠá áĽáą áá á ááąá á ááŤáá BuildMaster- á ááľ áĽá á ááľ á áŤá°á- á. áá ááááŞáŤ python3.7 á ááŤá áŤáľáááááłá:
sudo apt-get update
sudo apt-get install python3.7
ᨠ3.7.2 ááá python3.7.1 ááááááľ á¨áá¨á°ááľá ááľá¨á áá˝áááĄ
sudo apt-get update
sudo apt-get software-properties-common
sudo add-apt-repository ppa:deadsnakes/ppa
sudo apt-get install python3.7
sudo ln -fs /usr/bin/python3.7 /usr/bin/python3
pip3 install --upgrade pip
ááŁáŠ á°á¨á áááááľ áá á áľáá°á á áľááŻáᢠи buildbot, áĽáá˛áá á°á¨á᪠á°ááŁáŤáľá áĽáá˛á áá á¨ááŤáľá˝áá áĽá áá˝ buildbot- á¨.
/*ĐŃĐľ ŃŃĐž пОд sudo ĐąŃĐ´ĐľŃ ŃŃŃанОвНоннО Đ´ĐťŃ Đ˛ŃĐľŃ
пОНŃСОваŃоНоК в диŃокŃĐžŃĐ¸Ń /usr/local/lib/python3.7/dist-packages*/
#ĐĐ° Ń
ĐžŃŃĐľ кОŃĐžŃŃĐš ĐżŃĐžĐ¸ĐˇĐ˛ĐžĐ´Đ¸Ń ĐźĐžĐ˝Đ¸ŃĐžŃинг Worker-Ов
sudo pip install twisted #ĐийНиОŃока twisted
sudo pip install buildbot #BuildMaster
#ĐОпОНниŃоНŃĐ˝ŃĐš ŃŃнкŃиОнаН
pip install pysqlite3 #ĐŁŃŃанавНиваоП ĐąĐ°ĐˇŃ sqllite в ŃŃойнŃŃ
ŃоНŃŃ
pip install jinja2 #framework напОдОйио django, Đ´ĐťŃ web и Đ´ĐťŃ ĐżĐžŃŃОвŃŃ
ŃĐ°ŃŃŃННОк
pip install autobahn #Web cОкоŃŃ Đ´ĐťŃ ŃвŃСи BuildMaster->Worker
pip install sqlalchemy sqlalchemy-migrate #ĐĐťŃ ĐžŃОйŃĐ°ĐśĐľĐ˝Đ¸Ń ŃŃ
ĐľĐźŃ ĐąĐ°ĐˇŃ Đ´Đ°Đ˝Đ˝ŃŃ
#ĐĐťŃ Web ĐžŃОйŃĐ°ĐśĐľĐ˝Đ¸Ń BuildBot-a
pip install buildbot-www buildbot-grid-view buildbot-console-view buildbot-waterfall-view
pip install python-dateutil #ĐŃОйŃаМонио Đ´Đ°Ń Đ˛ web
#ĐĐ° ŃŃĐžŃОно Ń
ĐžŃŃĐ° кОŃĐžŃŃĐš нопОŃŃодŃŃвоннО ĐžŃŃŃĐľŃŃвНŃĐľŃ ŃйОŃĐşŃ Đ¸ ŃĐľŃŃиŃОванио
pip install buildbot-worker #Worker
#ĐОпОНниŃоНŃĐ˝ŃĐš ŃŃнкŃиОнаН
sudo pip install virtualenv #ĐиŃŃŃĐ°ĐťŃĐ˝Đ°Ń ŃŃода
4. á¨ááááŞáŤ á°á¨ááá˝
áááá á áá BuildMaster. á á ááá˝á ááľáĽ ááááᢠ/á¤áľ/ááĽá/ááľá°á.
mkdir master
buildbot create-master master # ХОйŃŃвоннО ŃĐ´ĐľŃŃ Đ¸ ŃОСдаоП
mkdir worker
buildbot-worker create-worker --umask=0o22 --keepalive=60 worker localhost:4000 yourWorkerName password
áľáľáŽáĽ á áŤá°á, á¨ááŤá á ááŁáŞ áá° ááľáĽ áááĽáŤá /á¤áľ/ááĽá/á°áŤá°á á ááľáĽ á¨á°áááá á¨ááŽáááą áľá áŤáá á áá master.cfg. áĽá á¨ááŽáááą áľá áŁáá á áá ááľáĽ áááŤá áááĽáŤá ááááŁáľ, áĽá á¨á፠áŤá°ááá á¨áá°á ááŁ. á¨áľáŤ áá፠á á áŤá°á- áá፠áááá /á¤áľ/ááĽá/á¨áĽááľá ááŽáááľ/áááŁáł.
"ááááá ááá
áĽá á áá á¨áá°ááá á ááá˝ ááťááŠáľáĄ áľááŞáᾠ፠áŁáá¤áľ áá ááá á áŤá°á- á áá
áá፠ááľáĽ áŤáá á¨áááľ áááŁá áŞáŤ á áá°áá áá ááááŤáąá áľááŞááą á¨áááľ áááľ áľááááᢠáááłáá áááľá°áŤá¨á, ááá áŤáľáááááłá
BuildMaster и á áŤá°á áĽááľ á ááľ áááááľ áááľá¨áľ. áá°áĽáŤá áĽá áá¨á°áłá á áŤá°á ááá˝ á áá áŁá á áá BuildMaster- á . ááá ááá˝ á¨áá áááááą áĽáá°áá á°áááŻá. ááá --Kepalive=60 á¨á፠á áá áŤááá áá ááááá¨áľ áĽáť áŤáľáááá áááááľ áłáá áááłá.
5. áááá. á°á¨á á á°á¨á á¨ááἠá áááááľ
áá á BuildMaster áľáááá á áá¸ááá áľ áá˝á áá áá áá¨áááá ááá á-ááľá°á. á áĽá áááł, áá áá፠áá /á¤áľ/ááĽá/ááľá°á. á¨áááá ááá master.cfg áĽáľáŤáá á¨áá, áá áľááá áŤáą á áľááľá áááá ááĽáŻá master.cmg.ááá. áĽáá°áá áá°á¨á á ááĽá master.cfg.ááá в master.cfg
mv master.cfg.sample master.cfg
áá áá áĽáááá°á master.cfg. áĽá áá áĽáá°ááŤáŤáľáľ áĽáá. áĽá á¨á፠á áá á¨áĽáá á¨ááááŞáŤ ááá áááľá¨á áĽááááŤáá.
master.cfg
c['change_source'] = []
c['change_source'].append(changes.GitPoller(
'git://github.com/buildbot/hello-world.git',
workdir='gitpoller-workdir', branch='master',
pollInterval=300))
c['schedulers'] = []
c['schedulers'].append(schedulers.SingleBranchScheduler(
name="all",
change_filter=util.ChangeFilter(branch='master'),
treeStableTimer=None,
builderNames=["runtests"]))
c['schedulers'].append(schedulers.ForceScheduler(
name="force",
builderNames=["runtests"]))
factory = util.BuildFactory()
factory.addStep(steps.Git(repourl='git://github.com/buildbot/hello-world.git', mode='incremental'))
factory.addStep(steps.ShellCommand(command=["trial", "hello"],
env={"PYTHONPATH": "."}))
c['builders'] = []
c['builders'].append(
util.BuilderConfig(name="runtests",
workernames=["example-worker"],
factory=factory))
c['services'] = []
c['title'] = "Hello World CI"
c['titleURL'] = "https://buildbot.github.io/hello-world/"
c['buildbotURL'] = "http://localhost:8010/"
c['www'] = dict(port=8010,
plugins=dict(waterfall_view={}, console_view={}, grid_view={}))
c['db'] = {
'db_url' : "sqlite:///state.sqlite",
}
5.1 BuildmasterConfig
c = BuildmasterConfig = {}
BuildmasterConfig - á¨áá
á ááá áá°á¨áłá áááá áááľá˘ á ááááŞáŤá ááá ááľáĽ ááŤá°áľ á áá áľ. áá á ááá áášááľáŁ á°ááá áľá á áááá áŽáľ ááľáĽ ááĽáˇáᢠ"á". áááśá˝
5.2 á°áŤá°áá˝
c['workers'] = [worker.Worker("example-worker", "pass")]
á áá
áá áĽáá áááá BuildMaster- áááá á áŤá°á-áŚá. áŤá´ á áŤá°á áĽá áá áá
5.3 á¨áááĽ_ááá
c['change_source'] = []
c['change_source'].append(changes.GitPoller(
'git://github.com/buildbot/hello-world.git',
workdir='gitpoller-workdir', branch='master',
pollInterval=300))
á ááá ááá_ááá áááá -áááľ c áá° áá¨ááťá á¨áá áááá ááá á¨ááŽáááą ááá áŽáľ áá áááľááἠáá°áááááľ áááá ááľáĽ áĽáááŁááᢠááłáá á áá°á á ááá°áśá˝ á¨á°áááá ᨠGit áá¨ááťá áá áááá˘
á¨ááááŞáŤá áá¨áŤá¨áŞáŤ áá° áá¨ááťá á¨áááľá°á ááááľ ááá˘
workdir á áá á áŠá áá° á ááá á¨áááľá°áá ááááľ ááááá á áŤá°á- á¨ááááą áá áááľ /á¤áľ/ááĽá/á áŤá°á/á¨áĽááľá ááŽáááľ/áááŁáł git á¨áá¨ááťáá á áŤáŁá˘áŤá áĽáŞáľ áŤá¨ááťáá˘
á áááŤá ááá¨á°á á áá¨ááťá ááľáĽ á¨á°áá°á á áááŤá ááá.
á¨áá፠ááá°áľ á¨á፠á áá á¨á°á¨ááśá˝ áĽááľ áááá BuildMaster ááááŚá˝ áá¨ááťáá ááá¨ááŤáá˘
á ááŽáááą áá¨ááť ááľáĽ áááŚá˝á ááá¨áłá°á áĽá áá´áá˝ á á.
á áŁá ááá áá´ áá áľáá˝ ááľá áľ, áá
á á¨ááŤáááá°á BuildMaster á á¨ááá á ááááŠá á¨áá¨ááťá áá ááááŁáᢠá¨áá áá°á áľ á áá áŤáááŤá ááľáĽ áŤááľá áááŚá˝ á áááŁááá ᣠá¨á፠BuildMaster á á°áá°á áááá¨áľ á¨ááľáŁááá ááá áááĽáŤá ááἠáĽá áá° ááá
áą á°ááŁáŁáŞá áááŠáľ áááááĽá, áá
á ááŽáááąá áááááŁáľ áĽá áááá¨á á°á¨ááá˝á ááááŤá á áŤá°á- á . áĽááá
áĽááááá˝ áŤáŤáľáłá ááá áá¨ááť. á áľááá á ááˇáᢠá áŤá°á-e á¨áá¨ááťá á áŤáŁá˘áŤá á
á áááĽáŤá. á¨áá
áá°áľ ááááŽá˝ á áááĽááľ áááľ áááá˝ á¨áá
á áłá˝ ááĽáŤáŤá. (
á áá¨ááťá áá á¨áá°á¨á áááŚá˝á á¨áá¨áłá°áŤ áá´ áá áἠá¨ááŤáá áá´ á ááĽáł á¨ááŤáľá°ááá°á á áááá áááĽááľ ááá ááᢠBuildMaster-y á¨ááŽáááąá ááá áŽáľ áľáááá¨áᢠá áá áááł, ááá˘á áĽáá°á°áŤ áá°á áľáŁ á¨ááŽáááľ áá¨ááť áŤáá á áááá áááĽááľ áááŤá BuildMaster- y. áĽá áŤ, á á°áŤá, á ááľ ááá á ááá á áŤááá áá áá˘áŤáá ááá. áá ááá á¨á፠áá° áá°áááá áááááĽá, ááŽáááąá áááááŁáľ áĽá áááá°á˝ á°á¨ááá˝á á¨ááŤáááłá á°á. á¨áá áá´ á áľááá á áŤá áá áľáŤ áá áááŚ- á áá áŤáááŤá ááľáĽ á¨á áááá áľááŞááśá˝á˘ á áľááŞááľ ááľáĽ áááŚ-áᣠááź áĽááááá˝á á¨ááľáŹáľ áááááľ á áá áľá˘ áá°á áľ- á , áááááŤáá áá°áá áŤáľáááááłá áááŞáŤ áĽá á¨á ááłá á áľáŤáťáá ááááš BuildMaster- á . á¨ááŤáłáá áá á¨á ááłá¨ áá¨áĽ áá°áĽ áááá áŤáľáááááłá áá˘áŤáá ááá. áá˘áŤáá áááá áááŤá˝á áá á áŤá áá BuildMaster- á . áá áá´ ááĽáľá áá ááá á áľá°áłáłáŞ- á¨ááŽáááą áá¨ááť áŁáá áľ á áááá ááᢠá ááááŞáŤ á¨áá áŤáááŤáá ááľáŹ ááľáŤáľ áŤáľáááááłá.
5.4 áááááĽá á ááŞáá˝
c['schedulers'] = []
c['schedulers'].append(schedulers.SingleBranchScheduler(
name="all",
change_filter=util.ChangeFilter(branch='master'),
treeStableTimer=None,
builderNames=["runtests"]))
c['schedulers'].append(schedulers.ForceScheduler(
name="force",
builderNames=["runtests"]))
áááááĽá á ááŞáá˝ - áá
á¨ááŽáááąá á á ááá á¨áá°áĽá°áĽ áĽá á¨ááá¨á á°áá°ááľ á¨áááá áĽáá° ááľá
á´ áá á¨ááŤáááá á áŤá ááá˘
á¨á°á°á¨á áááŚá˝ ááá_ááá, á áĽáŤ áá°áľ ááľáĽ á°ááá buildbot- ááááá ááἠáĽá á áá áĽáŤááłááą á¸áąáá á áĽááą áá á áááľá¨áľ á¨ááŽáááąá á¨áááŁáł áá°áľ ááááá áĽáŤááá˝á ááááŁá. áááᣠáĽááá
áĽáŤááá˝ áá° áá¨áá ááź áĽáá°áá°áááá áááľááᢠáá
áŤáá á áá áŁáá ááłá ááľáĽ áĽááŤáá áááááĽá á ááŞáá˝ 2 á°ááĽá¨ááᢠá¨áá
á á áá áĽáŤááłááą á¨áŤáą ááááľ á áá.
áá á á áááŤá áááááĽá á á᪠á áŁá áłáá á¨áá á¨áááááĽá áááá˝ á ááą áá. á ááľ á áááŤá áááá¨áłá¸áá áĽá á áĽáą ááľáĽ ááá á ááἠáŤáľááłáᢠáááŚášá á˛ááá¨áľ á¨áááŁáł áĽáŤááá ááá áá ááľá°ááá áá˝áá (á áአáá¤áľ ááľáĽ áá°á áá°á áá ááá áá ááľá°ááá) treeStableTimer) ááľáĽ áľá ááľáĽ á¨ááłá¨áá á¨áá á°ááł áľá ááááťá buildbot- á¨áľá á áááá˝. ááľáĽ ááŁáŞáŤá ááá ááŁáŞáŤ á°ááá áˇáᣠá á áááŤá áá á¨áá°á¨á áááŚá˝ á¨áááŁáł áĽáŤáá áááá ááá ááĽáŠá á¨ááŤááłáą áá¸áᢠááľáĽ á¨ááᢠáľáá˝ á¨ááá áľá á°á á áˇá á°áŞ-á, áľáá˝ ááá°á áĽáááááá. á áĽá áááł ááľáĽ áŤáá áľá á¨ááŽáááą áľá áá á°ááłáłá áááááĄ- á¨áĽááľá ááŽáááľ.
á áľááľáľ áááááĽá á áŁá ááá ááá. á¨áá á áááľ áááááĽá á¨ááá°áá°á á ááłááľ á á áł ááᢠbuildbot- á¨áľá á áááá˝. áááŞáŤáá˝ á ááľáĽ á°ááłáłá áá¸á áá á á áááŤá áááááĽá á ááŞ.
PS #3. á áľáááľ ááĄ
áá
áłá - áá
á¨á°áá°á á¨áá ááá°áľ áá á áĽáŽ á¨áá°áŤ á¨áá á°ááł áá. áĽáŞá áá
á áááľáá
from buildbot.plugins import schedulers
nightly = schedulers.Periodic(name="daily",
builderNames=["full-solaris"],
periodicBuildTimer=24*60*60)
c['schedulers'] = [nightly]
5.5 BuildFactory
factory = util.BuildFactory()
factory.addStep(steps.Git(repourl='git://github.com/buildbot/hello-world.git', mode='incremental'))
factory.addStep(steps.ShellCommand(command=["trial", "hello"],
env={"PYTHONPATH": "."}))
periodicBuildTimer á¨áá áá áłáááľ áá á á°á¨ááśá˝ ááľáĽ ááááťáá˘
BuildFactory á¨á°áá°á áááĽáŤá ááááŁáľáŁ á¨á፠á áá á°áŞ áááłá¨á á áŤá°á. á BuildFactory á¨ááá°áą áĽááááá˝á áá ááá á áŤá°á- y. áá´á á ááĽáŤáľ á°á¨ááá˝ ááłá¨áá addStep
á áá ááłá ááľáĽ á¨ááááŞáŤá á¨á°á¨áá¨á áĽááá áá git áášá -d -f -f âxáĽááá˛á git á°áááጠáááŁáľ. áĽááá áĽááááá˝ á áááŞáŤá ááľáĽ á°áŤáľá°ááᢠáá´, áĽáąá á ááá˝ á áá°ááá¸á ááá áá ááŁáŞ áĽá´áľá áŤááááłá á á˛áľ. áááŞáŤ áááł='á¨á¨áá¨'' ááááš á¨áááŤá ááľáĽ áá¸á ááá áźášáľáŁ á áá¨ááťá ááľáĽ á¨á ááľ áłááአáááŤáá˘
ááá°áá á¨á°á¨áá¨á áĽááá á¨áľááŞááľ áĽáŞ ááᢠá¨áá¨áŤ á¨áááŞáŤ áá áĽá á°áá áá á¨áá á áŤá°á- á¨áá፠/á¤áľ/ááĽá/á áŤá°á/á¨áĽááľá ááŽáááľ/áááŁáł á¨á áŤáŁá˘ á°áááá PATHONPATH=⌠áľááá á¨áŤáľáá áľááŞááśá˝ ááťá áĽá á áá á áŠá ááľáá¸á áá˝ááᢠá áŤá°á- á°á¨á á á°á¨á util.ShellCommand. áĽááá áľááŞááśá˝ á ááĽáł áá° áá¨ááťá ááľáĽ áááᥠáá˝áá. á¨ááŤá á áźášáľ- áĽááą ááľáĽ áááľáá /á¤áľ/ááĽá/á áŤá°á/á¨áĽááľá ááŽáááľ/áááŁáł. ááá ᣠá¨á፠áááľ "áá" á á-
- á áŤá°á á ááá ááá á á áá áľá˘
--ááľá á¨á፠á áá á¨ááľáá¸á፠ááĽáśá˝á áĽááłáŤááľ á¨áá°á ááŁ- á¨. - á git push- á¨áĽááá áľááŞááśá˝ ááľáĽ ááĽá¨áąá áááá˝ á ááŁá¸á ááŁáŁáľ á¨áá˝ááľááá á áá áźášáľ- ᨠGit áľááŞááľ áááľáá¸á áááľ á ááŁáá˘
5.6 ááá áá˝
c['builders'] = []
c['builders'].append(util.BuilderConfig(name="runtests",
workernames=["example-worker"],
factory=factory))
áľá áá áĽáá°áá á¤áľ á ᪠á°áŁá
c['builders'] = []
c['builders'].append(util.BuilderConfig(name="yourProject",
workernames=["yourWorkerName"],
factory=factory))
á áá áľá á ááĽáŽáš áĽááááá. BuilderConfig.
áľá áľáá áŤáááá á°áŞ- á. áĽáá áľá á ááŁáá á¨áĽááľá ááŽáááľ... áá áááľ á áá áááľ áá á áŤá°á- áá ááááľ ááá áŤá /á¤áľ/ááĽá/á áŤá°á/á¨áĽááľá ááŽáááľ/áááŁáł. á¸áąáá ááááá á°áŞ á áá áľá áĽáťá˘
á¨áľáŤ áľá á ááľ áá ááá á áŤá°á-áŚá. áĽáŤááłááłá¸á áá¨áá á ááŁá¸á á [âá áŤá°áá˝â].
ááĽáŞáŤ - á¨á°áá°á ááááŁáľá¨á¨áľáá áá á¨á°áŤáŤá áá á°áŞ. áá áááŤá ááááŁáľ áá á áŤá°á á áá ááľáĽ á¨á°áŤá°áąáľá áááá á°á¨ááá˝ ááá ááá ááááŁáľ- á¨.
6. á¨áŤáą áá á ááłá
á á áŠá ááá°áá á áŤáá¨áĽáŠáľ á¨ááŽáááľ á ááá´áá¸á ááá áĽáá
á áᢠbuildbot
.
áĽáá° áľáŞáľ ááĽáĽá áľáááľ, áĽáá áááá svn. áá¨ááťá áŤáą á á ááłááľ á°áá ááľáĽ ááááŁáᢠá¨áá
á°áá á áľáŤáť áĽáá
á áá˘
BuildMaster и á áŤá°á á á°ááłáłá á áľá°ááá áá á ááľ ááŽáááľ.á áľá°ááá .BuildMaster áááášá á á áá ááľáĽ áŤá¨ááťá /á¤áľ/ááĽá/ááľá°á. á áŤá°á á áá¨á°áá ááááľ á°ááłáłá áá°áĽáŽá˝ /á¤áľ/ááĽá/á°áŤá°á. á¨áááááľ áá°áľ BuildMaster- áĽá á áŤá°á- á ááŽáśáŽá áá á¨áľ á 4000 áá°áĽ á áŠá ááŤááłá buildbot-áᣠáááľá 'áá˘' ááŽáśáŽá.
á¨áááá ááŽáááľ áá á áá á áááśá á¨á°áťá ááᢠáľáŤá áááŚášá áá¨áłá°á, áá°áá á á¨áá˝á ááá ááá á, á°ááśá˝á áááá¨áľ áĽá áá¨áŤá ááŤááľ áá. áŤáá°áłáŤ á¨áá ááá ááá˘áá˝ áŤáá°áłáŤ áĽááá áĽááłá áááááľ áá° á°áĽáłá¤ ááá á ááŁá¸áá˘
á¨áľá ááłáŤ buildbot áá°áĽ 80 áĽáááááá á ááŽáááľ.á áľá°ááá . Apatch á áŤáľááááᢠáĽáá° á¤á°-áá˝áááľ á áŤá á°á áá ááľááá á¨áľá á áááá á á ᣠbuildbot áá áááá˘
á¨ááľáĽ áá¨á ááá¨áá¸áľ buildbot ПоП иŃпОНŃСОваŃŃ áľááŞáľ.
á¨á°áĽáłá¤ áááŞáŤ áááá á áľá°ááá áŤáľááááá smtp.á¨áĽááľá.á፠- á¨á°áĽáłá¤ á°áĽáłá¤áá˝á áááá á°áá áśááłá [á˘áá á¨á°á á á] áŤá áá¨áááŤ. áĽáá˛áá á á áľá°ááá ááSMTP ááŽáśáŽá á ááľáł 1025 áĽá¨á°á°á ááá˘
á áá°áą ááľáĽ á¨á°áłá°á áááľ á°áá˝ á á- á áľá°áłáłáŞ Đ¸ á°á áá. áŤáľá°áłáľáŤá buildbot. á°á ááá á¨áá°áŤá á°á ááᢠáá°á áľ-á°.
áááł á¨áá˝á ááá á¨áááá¨á á pyinstaller. á°ááśá˝ á¨ááááŠáľ á áśáá˛á á.
ááá á ááá´áá¸á áá á áťááŠáᢠmaster.cfg:
master.cfg
import os, re
from buildbot.plugins import steps, util, schedulers, worker, changes, reporters
c= BuildmasterConfig ={}
c['workers'] = [ worker.Worker('yourWorkerName', 'password') ]
c['protocols'] = {'pb': {'port': 4000}}
svn_poller = changes.SVNPoller(repourl="https://svn.host/svn/yourProject/trunk",
svnuser="user",
svnpasswd="password",
pollinterval=60,
split_file=util.svn.split_file_alwaystrunk
)
c['change_source'] = svn_poller
hourlyscheduler = schedulers.SingleBranchScheduler(
name="your-project-schedulers",
change_filter=util.ChangeFilter(branch=None),
builderNames=["yourProject"],
properties = {'owner': 'admin'}
)
c['schedulers'] = [hourlyscheduler]
checkout = steps.SVN(repourl='https://svn.host/svn/yourProject/trunk',
mode='full',
method='fresh',
username="user",
password="password",
haltOnFailure=True)
projectHost_build = util.BuildFactory()
cleanProject = steps.ShellCommand(name="Clean",
command=["buildbot/worker_linux/pyinstaller_project", "clean"]
)
buildProject = steps.ShellCommand(name="Build",
command=["buildbot/worker_linux/pyinstaller_project", "build"]
)
doxyProject = steps.ShellCommand(name="Update Docs",
command=["buildbot/worker_linux/gendoc", []]
)
testProject = steps.ShellCommand(name="Tests",
command=["python","tests/utest.py"],
env={'PYTHONPATH': '.'}
)
projectHost_build.addStep(checkout)
projectHost_build.addStep(cleanProject)
projectHost_build.addStep(buildProject)
projectHost_build.addStep(doxyProject)
projectHost_build.addStep(testProject)
c['builders'] = [
util.BuilderConfig(name="yourProject", workername='yourWorkerName', factory=projectHost_build)
]
template_html=u'''
<h4>ĐĄŃĐ°ŃŃŃ ĐżĐžŃŃŃОоннОгО ŃоНиСа: {{ summary }}</h4>
<p>ĐŃпОНŃСŃоПŃĐš ŃĐľŃĐ˛Đ¸Ń Đ´ĐťŃ ĐżĐžŃŃŃаониŃ: {{ workername }}</p>
<p>ĐŃОокŃ: {{ projects }}</p>
<p>ĐĐťŃ ŃОгО ŃŃĐž ĐąŃ ĐżĐžŃПОŃŃĐľŃŃ Đ¸Đ˝ŃĐľŃŃĐľĐšŃ ŃĐżŃĐ°Đ˛ĐťĐľĐ˝Đ¸Ń ĐżŃОКдиŃĐľ пО ŃŃŃНко: {{ buildbot_url }}</p>
<p>ĐĐťŃ ŃОгО ŃŃĐž ĐąŃ ĐżĐžŃПОŃŃĐľŃŃ ŃоСŃĐťŃŃĐ°Ń ŃйОŃки ĐżŃОКдиŃĐľ пО ŃŃŃНко: {{ build_url }}</p>
<p>ĐŃпОНŃСŃŃ WinSCP ПОМнО пОдкНŃŃиŃŃŃŃ Đş ŃĐľŃвоŃŃ c ip:xxx.xx.xxx.xx. ĐĐžĐšĐ´Ń ĐżĐžĐ´ habr/password, СайŃĐ°ŃŃ ŃОйŃаннŃĐš executable ŃаКН Ń Đ´Đ¸ŃокŃĐžŃии ~/worker/yourProject/build/dist.</p>
<p><b>ĐĐžŃŃŃОонио ĐąŃНО ĐżŃОиСводонО ŃĐľŃоС Buildbot</b></p>
'''
sendMessageToAll = reporters.MailNotifier(fromaddr="[email protected]",
sendToInterestedUsers=True,
lookup="your.domain",
relayhost="smtp.your.domain",
smtpPort=1025,
mode="warnings",
extraRecipients=['[email protected]'],
messageFormatter=reporters.MessageFormatter(
template=template_html,
template_type='html',
wantProperties=True,
wantSteps=True)
)
c['services'] = [sendMessageToAll]
c['title'] = "The process of bulding"
c['titleURL'] = "http://project.host:80/"
c['buildbotURL'] = "http://project.host"
c['www'] = dict(port=80,
plugins=dict(waterfall_view={}, console_view={}, grid_view={}))
c['db'] = {
'db_url' : "sqlite:///state.sqlite"
}
á ááááŞáŤ áŤáľáááááłá
ááŁáŠ á°á¨á á áááááąá áááá áá BuildMasterá
sudo buildbot start /home/habr/master
á¨á፠á áááááąá áááአá áŤá°á-a
buildbot-worker start /home/habr/worker
ááá! á áá buildbot áááŚá˝á áá¨áłá°áá áĽá áá áŤá áá°á áľ- áᣠsvná¨áá á¨á°á áá°á á ááá´áá¸á áá á¨ááŽáááľ áááŁáł áĽá á¨áá¨áŤ á°á¨ááá˝á á áá¨á°á.
á¨áá áŤááľá á ááłááľ áŁá
áŞáŤáľ á¨áá
á áłá˝ áĽáááťáá master.cfg.
6.1 áá° ááłá á áááľá°á ááááľ áá.cfg
á¨áĽáá á áá˝áá áľ áá master.cfg áĽá áľá
á°áśá˝ áá°á¨áá, áľááá
á¨áááἠááľáłááťáá ááá ἠáŤáľáááá. áĽáá° á°á¨áá˝áˇá BuildMaster- áášá ááááľ /home/habr/master/twistd.log, áĽá á áá á áŠá á áŤá°á- áášá ááááľ áŤáá /home/habr/worker/twistd.log. áľá
á°áąá á˛áŤáᥠáĽá á˛áŤáľá°áŤáá, á áááááąá áĽáá°áá ááľááá áŤáľáááááłá BuildMaster- á. áĽáá´áľ áĽáá°áá°á¨á áĽáááĄ-
sudo buildbot stop /home/habr/master
sudo buildbot upgrade-master /home/habr/master
sudo buildbot start /home/habr/master
6.2 ᨠsvn áá á ááľáŤáľ áá
svn_poller = changes.SVNPoller(repourl="https://svn.host/svn/yourProject/trunk",
svnuser="user",
svnpasswd="password",
pollinterval=60,
split_file=util.svn.split_file_alwaystrunk
)
c['change_source'] = svn_poller
hourlyscheduler = schedulers.SingleBranchScheduler(
name="your-project-schedulers",
change_filter=util.ChangeFilter(branch=None),
builderNames=["yourProject"],
properties = {'owner': 'admin'}
)
c['schedulers'] = [hourlyscheduler]
checkout = steps.SVN(repourl='https://svn.host/svn/yourProject/trunk',
mode='full',
method='fresh',
username="user",
password="password",
haltOnFailure=True)
áááááᣠáĽáľá˛ áĽáááá¨áľ svn_poller. á ááá á á°áá á ááľ áá áá¨ááťáá á áá°á áááľ áľáá˝ á ááľá áľ áŤá á áááá˝ ááᢠá áá ááłá áá svn_poller á áááŤáá áĽáť áŤááááłá áááľ. ááľáĽáŤá áááŞáŤ split_file=util.svn.split_file_áááá áľáľáŽá á°ááŚášá áŤáááá: á¨á áááá ááá á áĽáá´áľ áĽáá°áá¨ááá svn á á áááŤáá˝ áá. á ááťáŤá ááááśá˝áá áŤáááĽáá¸ááᢠá á°áŤá á¨á°á¨ááá_ááá_áááá ááá¨áá áá¨ááťá áĽáť á áááľ áá°áąá áŤáááá áááľ.
Đ áááááĽá á ááŞáá˝ á ááááˇá ááŁáŞáŤá ááááá áŤáŤá á ááľá áĽá á ááľ á áááŤá á¨áĽáą áá áŤáááłá áááľ á á°á°á á áá á á á áŠá á¨á°á¨ááá_ááá_áááá ááá¨áá. á ááľáĽ áááŚá˝ ááá˝ ááľá áľ áááľ, ááááŤá á°áŞ á áľá á¨áĽááľá ááŽáááľ.
ááĽá¨áśá˝ á áľá°áłáłáŞá á¨áááŁáłá áááĽááśá˝á áĽáá˛áá á áĽá á¨áá°áą áŁáá¤áľ áá á¨áá°á áá¤áśá˝á áĽáá˛áá á áĽáá áŤáľááááá˘
Шаг ááááŁáľ-a á¨áá°á áᣠá á áŤáŁá˘áŤáá á¨áá¨á ááą áľáŞáľ ááľáĽ áŤááľá áááááá áááá˝ áá á áá ááľáááľ áá˝ááᢠá áŤá°á- á . áĽá á¨á፠áá áŤáľáááľ svn ááá. áááł á áááŞáŤ á áŠá á°áááĽáŻáᢠááľ=áá, áá´ = áľáŠáľ. áááŞáŤ haltOnTailure á¨áá áááᢠsvn ááá á áľá á°áľ ááá¸áá, á¨ááŤá á á ááá á¨áááŁáł áĽá á¨áá°á áá°áą ááłááľ á áá áľ, ááááŤáąá á°á¨á᪠áľáááśá˝ áľááá á¨áá¸áá.
6.3 ááĽááľá á°áĽáłá¤áĄ ááá˘áá˝ áŞáááľ áĽáá˛áŤá°áá áľááŁá á°á°áĽáˇá¸ááá˘
áŞááá°áŽá˝ á¨á˘áá ááłáá፠á áááááľ ááá˘
template_html=u'''
<h4>ĐĄŃĐ°ŃŃŃ ĐżĐžŃŃŃОоннОгО ŃоНиСа: {{ summary }}</h4>
<p>ĐŃпОНŃСŃоПŃĐš ŃĐľŃĐ˛Đ¸Ń Đ´ĐťŃ ĐżĐžŃŃŃаониŃ: {{ workername }}</p>
<p>ĐŃОокŃ: {{ projects }}</p>
<p>ĐĐťŃ ŃОгО ŃŃĐž ĐąŃ ĐżĐžŃПОŃŃĐľŃŃ Đ¸Đ˝ŃĐľŃŃĐľĐšŃ ŃĐżŃĐ°Đ˛ĐťĐľĐ˝Đ¸Ń ĐżŃОКдиŃĐľ пО ŃŃŃНко: {{ buildbot_url }}</p>
<p>ĐĐťŃ ŃОгО ŃŃĐž ĐąŃ ĐżĐžŃПОŃŃĐľŃŃ ŃоСŃĐťŃŃĐ°Ń ŃйОŃки ĐżŃОКдиŃĐľ пО ŃŃŃНко: {{ build_url }}</p>
<p>ĐŃпОНŃСŃŃ WinSCP ПОМнО пОдкНŃŃиŃŃŃŃ Đş ŃĐľŃвоŃŃ c ip:xxx.xx.xxx.xx. ĐĐžĐšĐ´Ń ĐżĐžĐ´ habr/password, СайŃĐ°ŃŃ ŃОйŃаннŃĐš executable ŃаКН Ń Đ´Đ¸ŃокŃĐžŃии ~/worker/yourProject/build/dist.</p>
<p><b>ĐĐžŃŃŃОонио ĐąŃНО ĐżŃОиСводонО ŃĐľŃоС Buildbot</b></p>
'''
sendMessageToAll = reporters.MailNotifier(fromaddr="[email protected]",
sendToInterestedUsers=True,
lookup="your.domain",
relayhost="smtp.your.domain",
smtpPort=1025,
mode="warnings",
extraRecipients=['[email protected]'],
messageFormatter=reporters.MessageFormatter(
template=template_html,
template_type='html',
wantProperties=True,
wantSteps=True)
)
c['services'] = [sendMessageToAll]
áááĽááľ ááá áá˝ááá˘
áááááľ á áłáá ááłáááŤáá˝á áááá á°áĽáłá¤ áá áááá˘
á áĽááľ_html áá°áĽáłá¤ áááŞáŤ á¨á˝áá á áĽááľ áŤááááᢠá¤á˝á˛á¤áá¤á ááá áááá á áĽá
á áá ááááᢠáá°áŠ á°áľá°áŤáááá˘
áááááľ á áłáá á¨áá¨á°ááľá ááááŽá˝ ááá.
fromaddr - áááĽááą áááá á°á á¨áááá áľ á áľáŤáťá˘
áááááľ á°á áááá˝ áááŠá˘=áĽáááľ áá°áŤá áŁáá¤áľ áĽá á°á áá áááĽááľ áľááŤáá˝á˘ áá°á áľ.
á°ááá¨áľ â á¨á°áĽáłá¤ ááááŠá á ááá á á¨á°á áá áľáá˝ áá á¨ááłá¨á á áĽáŤá˘ áľááá á áľá°áłáłáŞ á°á ááá á á áľáŤáťá áá á°áĽáłá¤áá áĽáá´áľ áĽáá°ááá á [á˘áá á¨á°á á á].
relayhost á áááአá¨á°á¨áá°á áľá á¨á áľá°ááá áľá ááááťá SMTPá ááľ smptPort á¨ááŤáłáá áá á¨áá°áĽ ááĽá áŤááááᢠSMTP á áááá.
áááł = "ááľá ááááŤ" áááĽááą áá°á¨á áŤáá áľ á˘áŤááľ á ááľ áĽááá áŤá áĽáť áá áááᢠááááŁáľ- á ááľááľ ááá á ááľá ááá፠áááł á¨á°á áááᢠá á°áłáŤ áááł, á°áĽáłá¤ ááá á áŤáľáááá.
á°á¨á᪠á°ááŁáŽá˝ á¨áŁáá¤áą áĽá á áááááąá áŤá¨áááá á°á á á°á¨á᪠áááĽááą áá°á¨á áŤáá áľ á¨á°áá˝ áááá ááá áá°á áľ.
áááĽááľ áááá°á á¨áááĽááąá á áá¸áľáŁ á áĽááľ áĽá á¨á°ááááŽá˝á áľáĽáľáĽ á¨áááá˝ áá ááᢠááá2. áĽáá° á ááŤáŽá˝ wantProperties=áĽááᾠи wantSteps=áĽáááľ á¨ááááľá á°ááááŽá˝ áľáĽáľáĽ áááášá˘
á ['á áááááśá˝']=[áááĽááľ ááá áááá] á¨á áááááśá˝ áááá áŤáááŁá, á¨áĽááá á ááŤá¨á á¨áĽá áááá ááá á.
á á°á¨ááá! áĽááłá á°áľ á áá˝á
á¨áŤáłá˝áá áá á áá áá áĽá á°ááŁáŤáááąá á áá°áá buildbot. áá , áĽá áĽáá°ááľá á, áá ááłáŞáŤ ááŽáááľáá áááá á áŤáľááá áĽáá°áá ááá¨áłáľ á á áá. áĽáą ááĽááľá ááááľ á áá? ááĽááľá á áá áááá? á áĽáŽ áááľáŤáľ ááš áá? á¨á፠áá á á˝áá á¨áá˝áá á á¨ááą á áá°ááá˘
áĽá á°á¨ááŞá˘ á¨ááŽáá˝áá áá á á¨á°áĄ áĽáá˛á áá áĽááááá buildbot, á°á áá, áááŞáŤááš á°á°ááááá, áĽá áĽáá˛áŤáá á°á¨á᪠ááłááá˝ áá áŠ.
áááá˝áá áľáŠá¨áľ á áá°ááááᢠáááŤá áááľ.
ááá: hab.com