(แกแฃแ แแแ
Hi!
แฉแแแ แกแแฎแแแ แแแแแแ แฉแแ แแแแแแ แแแ แแ แแแ แแแแกแขแ แแแแแแแแแก แแแแแแแแแก แแแแแแแแ แแแแก แแฃแแแจแ แแแแแแแขแแแ.
แแแแแกแแแแ แ แแแแ แแ แแแฅแขแแก แแแฌแงแแแแกแแก, แแฅแแแ แแฌแงแแแ แคแแฅแ แก: โแ แแแแแ แแ แแแ แแแฃแแ แฃแแ แฃแแแแแงแแคแ แแ แแก แกแแฃแแแแแกแ แแแแแกแแงแแแแแแแ แแแก แจแแกแแแแ แฉแฃแแแแแแ? IT แแ แแแฅแขแ แแแแแก แ แแแแแแแแ แแขแแแก แแแแแแแแ แแแ แกแแแก แแแแแจแแแแแแแ. แแแ แแแ, แ แแชแ แแ แแขแแแแแแก แฏแแญแแ แแแขแแแแขแแแแ แแแฃแแแ. แแแแแ IT แแ แแแฅแขแแก แแฎแแแ แแแ แกแแแก แแแแแจแแแแแก แแแขแแแแขแแแแ แแแฃแ แแ แแชแแกแก แ.แฌ แฃแฌแงแแแขแ แแแขแแแ แแชแแ. BuildBot แฉแแแแแแแก แแแ แแ แแกแแกแขแแแขแ แแฆแแแฉแแแ แแ แแ แแชแแกแแก แแแแฎแแ แชแแแแแแแจแ.
แแ แกแขแแขแแแจแ แแแแแแฌแงแแแขแ แแแแแแแฎแแแ แจแแกแแซแแแแแแแแแ BuildBot. แ แ แจแแฃแซแแแ แแ แแ แแแ แแแฃแ แฃแแ แฃแแแแแงแแคแแก? แ แแแแ แแแแฃแแแแ แแแก แแ แ แแแแ แแแแแแงแแ แแ แแแ แแแแฃแ แ แแคแแฅแขแฃแ แ แกแแแฃแจแแ แฃแ แแแแ แแแแ แแแกแแแ? แแฅแแแ แจแแแแซแแแแ แแแแแแงแแแแ แฉแแแแ แแแแแชแแแแแแ แแฅแแแ แแแแแแ แจแแฅแแแแ แกแแแฃแจแแ แกแแ แแแกแก แแฅแแแแก แแแแฅแแแแแ แแฅแแแแ แแ แแแฅแขแแก แแกแแจแแแแแแแ แแ แจแแกแแแแฌแแแแแแ.
แแแคแแ แแแชแแแก
แแแคแแ แแแชแแแก
1. แ แแขแแ BuildBot?
แแแ แ habr-e-แแ แฌแแแแฌแงแแ แกแขแแขแแแแก แแแแฎแแ แชแแแแแแแก แจแแกแแฎแแ แฃแฌแงแแแขแ แแแขแแแ แแชแแ แแแแแงแแแแแแ BuildBot... แฒแแแแแแแแ,
แแแฉแแ แแ! แแแแแแก แแแแแแแแแ แแแแแแงแแแ แแแ แแแแแก แแ แแแฅแขแแแจแ? แแแแแแแก แแ
แแแจ แ แ แแแแแแ แแฅแแก แฎแแแฎแแก แแแแแงแแแแแแก Buildbot? แงแแแแแแแ แแแแก แจแแแแแ, แแ แกแแแแแก แกแฎแแ แแแกแขแ แฃแแแแขแแแ: แแ แฃแแแแแแขแ แแแ ะธ Jenkins. แแ แแกแ แแแแแกแฃแฎแแ. แแแแชแแแแแแก แฃแแแขแแกแแแแกแแแแก Jenkins แแ แกแแแแ แแแ แกแแแแแ แแกแ แแฅแแแแ. แแแแแก แแฎแ แแ, BuildBot - แฃแคแ แ แแแแแขแแ แแแแแ, แแแจแแ แ แแชแ แแ แแแแแแแแ แแฅ แฌแงแแแแ แแกแแแ แแแ แขแแแแ, แ แแแแ แช แแฅ Jenkins. แฒแ แฉแแแแแ แจแแแแแ. แแแแ แแ แ แแแแแ แฉแแแ แแแซแแแ แฎแแแกแแฌแงแแก แแแแแแแแ แแแแแ แกแแแแแแ แแ แแแฅแขแแกแแแแก, แ แแขแแ แแ แแแแ แฉแแแ แแก, แ แแแแแแช แกแแจแฃแแแแแแก แแแกแชแแแก, แแแ แขแแแ แแแแแฏแแแแแแ แแแฌแงแแแฃแแ, แแแแแฆแแ แแแแกแขแ แฃแฅแชแแฃแแ แกแแกแขแแแ, แ แแแแแกแแช แแฅแแก แแแขแแ แแฅแขแแฃแแแแ แแ แฃแแแแแแฃแ แ แแแขแแ แคแแแกแ.
แแแแแแแก, แแแกแ แกแแแแแแ แแ แแแฅแขแแช แแแแแแจแแ แแแฌแแ แแแ, แฉแแแแแ แแแแฎแแ: โแ แแขแแ แแ แแแ แฉแแแ แแแขแแแ แแชแแแก แกแแกแขแแแ, แ แแแแแกแแช แแฅแแก แแแแคแแ แแแขแแ แคแแแกแ แแ แแแฅแขแจแ แแแแแงแแแแแฃแแ แแแแก แแแแแกแแแ แแกแแ?โ แแฎแแ แแ แแ แแ แฌแแ แแแแแแแแแแ แกแแ แแแแแแ BuildBot.
แแกแ แ แแ, แฉแแแแ "แแแกแขแ แฃแแแแขแฃแแ แแแแ แขแแขแ". แฉแแแแแแก แแ แแแแแแงแแแ แแแฎแ แแแแกแแแ BuildBot:
- แแก แแ แแก แฆแแ แแแแแก แฉแแ แฉแ GPL แแแชแแแแแแ
- แแก แแ แแก แแแแแแแก แแแแแงแแแแแ, แ แแแแ แช แแแแคแแแฃแ แแชแแแก แแแกแขแ แฃแแแแขแ แแ แกแแญแแ แ แแแฅแแแแแแแแแก แแฆแฌแแ แ
- แแก แแ แแก แจแแกแแซแแแแแแแ แแแแฆแแ แแแกแฃแฎแ แแ แแแแฅแแแแแแ, แ แแแแแแแช แฎแแแแ แจแแแ แแแ
- แแก แแ แแก, แกแแแแแแแ, แแแแแแแแฃแ แ แแแแฎแแแแแแ แแแกแแแแซแแแกแแแแก. แแแแแแแแแ แแแแแฎแแแก แแแแแแก แแ แแ แแฎแแแก แแ แแ แกแแญแแ แแแแก แแแ แขแฃแแแฃแ แแแแฅแแแแก แแ แฏแแแแก แแแแฅแแแแก.
2. แแแแชแแคแชแแ, แ แแแแแกแแช แฎแแแแซแฆแแแแแแแแก BuildMaster
แแแแชแแแแแแก แแแแแฌแแแแแแก แแ แฅแแขแแฅแขแฃแ แแจแ แชแแแขแ แแแฃแ แแ BuildMaster. แแก แแ แแก แกแแ แแแกแ, แ แแแแแแช:
- แแแแแงแฃแ แก แแแแแแแแก แชแแแแแแแแแ แแ แแแฅแขแแก แฌแงแแ แแก แฎแแจแ
- แแแแแแแแก แแ แซแแแแแแแ, แ แแแแแแแช แฃแแแ แจแแกแ แฃแแแแก Worker แกแแ แแแกแแก แแแแ แแ แแแฅแขแแก แแกแแจแแแแแแแ แแ แจแแกแแแแฌแแแแแแ
- แแชแแแแแแก แแแแฎแแแ แแแแแแ แแแแฎแแ แชแแแแแแฃแแ แฅแแแแแแแแแก แจแแแแแแแแก แจแแกแแฎแแ
BuildMaster แแแแคแแแฃแ แแ แแแฃแแแ แคแแแแแก แกแแจแฃแแแแแแ master.cfg. แแก แคแแแแ แแ แแก root-แจแ BuildMaster. แแแแแแแแแแแ แแแฉแแแแแแ แ แแแแ แแฅแแแแแ แแก แคแแกแแ. แแแแแ แคแแแแ master.cfg แจแแแชแแแก แแแแแแแก แกแแ แแแขแก, แ แแแแแแช แแงแแแแแก แแแ แแแก BuildBot.
แจแแแแแแ แงแแแแแแ แแแแจแแแแแแแแแ แแแแแฅแขแ BuildBot แแแก แแฅแแก แกแแฎแแแ แแฃแจแ. แแ แกแแ แแแกแแก แแแจแแแแ แจแแกแแซแแแแแแแ แกแฎแแ แฐแแกแขแแ, แกแฎแแ OS-แแ, แแ แจแแกแแซแแแ แแกแแแแ, แกแแแแช BuildMaster. แแก แแกแแแ แจแแแซแแแแ แแ แกแแแแแแแก แกแแแชแแแแฃแ แแ แแแแแแแแแฃแ แแแ แขแฃแแแฃแ แแแ แแแแจแ แกแแแฃแแแ แ แแแแแขแแแแแ แแ แชแแแแแแแแ. แแก แแแ แขแฃแแแฃแ แ แแแ แแแ แจแแแซแแแแ แแแแแแแแแก แแแแแแแก แฃแขแแแแขแแแแก แแแแแงแแแแแแ, แ แแแแ แแชแแ แแแ แขแฃแแแฃแ แ, แแแแ.
BuildMaster แแแแแกแชแแแก แแ แซแแแแแแแก แงแแแแแก แแฃแจแ-y แแ แแก, แแแแแก แแฎแ แแ, แแกแ แฃแแแแก แแแ. แแแฃ, แแแแแแแก, แ แแ แแ แแแฅแขแแก แแจแแแแแแก แแ แขแแกแขแแ แแแแก แแ แแชแแกแ แจแแแซแแแแ แแแแ แซแแแแแก แแฃแจแ-e แแฃแจแแแแก Windows-แแ แแ แกแฎแแ Worker-แแ, แ แแแแแแช แแฃแจแแแแก Linux-แแ.
แแแแแฎแแ แแ แแแฅแขแแก แฌแงแแ แแก แแแแแแ แฉแแแแแ แแแแแแฃแแแ แแฃแจแ-แ.
3. แแแแขแแแ
แแแจ, แฌแแแแแแ. แแ แแแแแแแงแแแแ Ubuntu 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. แแ แแ แแแฅแขแแก แกแแฎแแแฌแแแแแแก แกแแฅแแฆแแแแแจแ แแก แจแแฅแแแแก แแแ แแฅแขแแ แแแก แแแแจแแแแแแ แแแแแ แซแแแแแก แแแแก แแแแแแขแแแ. แกแแแฃแจแแ แแแ แแฅแขแแ แแ แแแแกแแแแก แแฃแจแ-แแ แแแฎแแแแ แแแ แแฅแขแแ แแ /home/habr/yourProject/build.
"แแฅแ แแก แแแกแแฆแแแ
แแฎแแ แแ, แ แแกแแแแกแแช แแแแฌแแ แ แฌแแแ แแแแแชแ: แกแชแแแแ แ, แ แแแแแแช แกแแแแแแกแขแ แ แแแแแฎแแแแ แแฃแจแ-แแ แแ แแแ แแฅแขแแ แแแจแ แแแกแขแแแชแแฃแ แแ แจแแกแ แฃแแแแฃแแ แแ แจแแกแ แฃแแแแแ, แ แแแแแ แกแแ แแแขแก แแ แแฅแแก แแแจแแแแแก แแแแแ แแแ. แกแแขแฃแแชแแแก แแแแแกแแกแฌแแ แแแแแ แแแแญแแ แแแแแ แแแกแแฆแแแ
BuildMaster ะธ แแฃแจแ แแแแแงแแ แแ แแแแจแแ แ แแ แแแแแแแแแ. แฎแแแแ แแกแ, แ แแ แฌแงแแแแ แแ แแฃแจแ แแแแแแแ แแแ แแแแฃแแ แแ แแแก แแแกแฃแฎแก BuildMaster-แ. แแฃ แแแกแฃแฎแ แแ แแ แแก, แแแแจแแ แ แแแแแฎแแแแแ. แฒแแกแแฆแแแ --keepalive=60 แฃแแ แแแแ แกแแญแแ แแ แแแฃแแแแแ แแ แ, แ แแแแแก แจแแแแแแแช แแแแแแจแแ แแแ แแแแแขแแแ แแแแก.
5. แแแแคแแแฃแ แแชแแ. แแขแแแแแ แแแแ แ แแชแแแขแ
แแแแคแแแฃแ แแชแแ BuildMaster แฎแแ แชแแแแแแแ แแแแ แแขแแก แแฎแแ แแก, แกแแแแช แฉแแแ แจแแแแกแ แฃแแแ แแ แซแแแแแ แจแแฅแแแ-แแกแขแแขแ. แฉแแแแก แจแแแแฎแแแแแจแ, แแก แแ แแก แแแ แแฅแขแแ แแ /แกแแฎแแ/แฐแแแ /แแกแขแแขแ. แแแแคแแแฃแ แแชแแแก แคแแแแ master.cfg แฏแแ แแ แแ แกแแแแแก, แแแแ แแ แแแแแ แแ แซแแแแแแ แฃแแแ แจแแฅแแแ แคแแแแ master.cmg.sample. แแฅแแแ แฃแแแ แแแแแแ แฅแแแ แกแแฎแแแ master.cfg.sample ะฒ 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 โ แแแแคแแแฃแ แแชแแแก แคแแแแแก แซแแ แแแแแ แแแฅแกแแแแแ. แแก แฃแแแ แแงแแก แฉแแ แแฃแแ แแแแคแแแฃแ แแชแแแก แคแแแแจแ. แแแฎแแ แฎแแแฃแแแแแกแแแแก, แแแแคแแแฃแ แแชแแแก แแแแจแ แจแแแแขแแแแแแ แแแขแกแแฎแแแ "c". แขแแขแฃแแแแ
5.2 แแฃแจแแแ
c['workers'] = [worker.Worker("example-worker", "pass")]
แแแฏแแ แแ แฉแแแ แแแแฃแแแแแแ BuildMaster-y แกแแ แแฃแจแ-แก. แแ แแแแแแ แแฃแจแ แฉแแแ แจแแแฅแแแแแ
5.3 change_source
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 แกแแชแแแก, แ แแแแแแช แแแแแแแแฎแฃแแแ แแแ แแแแฃแแ แแแขแแ แแแแแแแ.
แแแ แแแแ แแ แแฃแแแแขแ แแ แแก แแแ แแฅแแแแ แกแแชแแแแแแ.
แกแแแฃแจแแ แแแ แแแแ แ แฌแแ แแแแแแแแก แแแแก แกแแฅแแฆแแแแแกแแแ, แกแแแแช แแแแ แแแแแ แแฃแจแ-แแแแก แแแแแกแแแ /home/habr/worker/yourproject/build git แจแแแแแฎแแแก แกแแชแแแแก แแแแแแฃแ แแแ แกแแแก.
แคแแแแแแ แจแแแชแแแก แแแแแ แแขแฃแ แคแแแแแแก แกแแชแแแจแ, แ แแแแแแช แฃแแแ แแแแชแแแก.
แแแแแแแแฎแแแก แแแขแแ แแแแ แจแแแชแแแก แฌแแแแแแก แ แแแแแแแแแก, แ แแแแแก แจแแแแแแแช BuildMaster แแแแแแแแฎแแแก แกแแชแแแจแ แชแแแแแแแแแแกแแแแก.
แแ แแแฅแขแแก แกแแชแแแจแ แชแแแแแแแแแแก แแแแแงแฃแ แแก แแแแแแแแก แ แแแแแแแแ แแแแแแ แแ แกแแแแแก.
แฃแแแ แขแแแแกแ แแแแแแแ แแแแแแแแฎแแ, แ แแช แแฃแแแกแฎแแแแก แแแแก BuildMaster แแแ แแแแฃแแแ แแแแแแแแฎแแแก แกแแ แแแ แก แกแแชแแแแแ แแ แแแ. แแฃ แฉแแแแแแแก แแแกแแฎแ แชแแแแแแแแแ แกแแชแแแจแ, แแแจแแ BuildMaster แแแ แแแแฃแแ แแแแแแแแแแแ แจแแฅแแแแก แจแแแ แแแแแฅแขแก แจแแชแแแ แแ แแแฃแแแแแแแ แฆแแแแกแซแแแแแก แแแแแฃแจแแแแแแแก Scheduler, แ แแแแแแช แแแแฌแงแแแก แแ แแแฅแขแแก แแจแแแแแแกแ แแ แขแแกแขแแ แแแแก แแแแแฏแแแก แแฃแจแ-แ. แแ แแแแแฏแแแก แจแแ แแก แแฅแแแแ แแแแแแแแฃแแ แแแแแฎแแแแ แกแแชแแแ. แแฃแกแขแแ แแฃแจแแแก แจแแฅแแแแก แกแแชแแแแก แแแแแแฃแ แแกแแก. แแ แแ แแชแแกแแก แแแขแแแแแ แฅแแแแแ แแฅแแแแ แแแแฎแแแฃแแ แแแแแแแแ แแ แแแฌแแแจแ. (
แกแแชแแแจแ แชแแแแแแแแแแก แแแแแงแฃแ แแก แแแแแแแแก แแแแแ แฃแคแ แ แแแแแแแขแฃแ แ แแแแแแแ แจแแขแงแแแแแแแแแแก แแแแแแแแ แฃแจแฃแแแแ แแแกแแแแซแแแ แกแแ แแแ แแแแ. BuildMaster- แแ แแแฅแขแแก แฌแงแแ แแก แแแแแแแก แจแแชแแแแก แจแแกแแฎแแ. แแ แจแแแแฎแแแแแจแ, แ แแแแ แช แแ แแแแแแแแแ แ แแแแแแแแแก แฉแแแแแแแก, แกแแ แแแ แ แแ แแแฅแขแแก แกแแชแแแแแ แแ แแแ แแแแแแแแแก แจแแขแงแแแแแแแแก BuildMaster-แ. แแ แแก, แแแแแก แแฎแ แแ, แฉแแญแ แแก แแแก แแแแแฅแขแแก แจแแฅแแแแ PBCchangeSource. แจแแแแแแ, แแก แแแแแฅแขแ แแแแแแชแแแ Scheduler, แ แแแแแแช แแแฅแขแแฃแ แแแก แกแแคแแฎแฃแ แแแก แแ แแแฅแขแแก แแกแแแแแแ แแ แแแก แจแแกแแแแฌแแแแแแ. แแ แแแแแแแก แแแแจแแแแแแแแแ แแแฌแแแแ แแฃแจแแแแ Hook-แกแแ แแแ แแก แกแแ แแแขแแแ แกแแชแแแจแ. แกแชแแแแ แจแ Hook-แ, แแแกแฃแฎแแกแแแแแแแแ แแแแฃแจแแแแแแก แแแฅแแแแแแแแแ, แ แแแแกแแช แฉแแแแแแแก-แ, แแฅแแแ แฃแแแ แแแ แแแแ แแแแฃแแแแฃแ แจแ แแแแแแแแแก แจแแชแแแ แแ แแแฃแแแแแ แฅแกแแแแก แแแกแแแแ แแ BuildMaster-แ. แแฅแแแ แแกแแแ แฃแแแ แแแฃแแแแแ แฅแกแแแแก แแแ แขแ, แ แแแแแแช แแแฃแกแแแแก PBCchangeSource. PBCchangeSourceแกแฎแแแแ แจแแ แแก, แแแฌแแแแ BuildMaster-แ. แแก แแแแแแ แแแแแฎแแแก แแแแแ แแแแก admin-a แกแแ แแแ แแ, แกแแแแช แแแแแแ แแแแก แแ แแแฅแขแแก แกแแชแแแ. แฏแแ แแแแแฌแแแ แกแแ แแแแ แแ แแกแแแก แจแแฅแแแ.
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 แชแแแ. แฃแคแ แ แแแขแแช, แแแแแแฃแแก แแฅแแก แกแแแฃแแแ แ แขแแแ.
SingleBranchScheduler - แแ แ-แแ แแ แงแแแแแแ แแแแฃแแแ แฃแแ แแแแกแ แแ แแคแแแแ. แแก แฃแงแฃแ แแแก แแ แ แขแแขแก แแ แแแกแจแ แฉแแฌแแ แแแ แชแแแแแแแ แแฌแแแแก. แ แแแแกแแช แแก แฎแแแแแก แชแแแแแแแแแก, แแแก แจแแฃแซแแแ แแแแแแแก build-แแก แแแแฎแแแแแก แแแแแแแแ (แแแแแแแแแแ แกแแแชแแแแฃแ แแแ แแแแขแ แจแ แแแแแแแแฃแแ แแแ แแแแแกแแแแก treeStableTimer). IN แกแแฎแแแ แแแแแแก แแแแ แแแแก แกแแฎแแแก, แ แแแแแแช แแฅแแแแ แแแฉแแแแแแ BuildBot- แแแ แแแขแแ แคแแแกแ. IN แคแแแขแ แแก แจแแชแแแ แแแงแแแแแฃแแแ แคแแแขแ แ, แ แแแแแก แแแแแแก แจแแแแแ, แคแแแแแแจแ แชแแแแแแแแแ แแแซแฃแแแแก แแแแ แแแก แแจแแแแแแแแแก แแแแฎแแแแแก แแแแแแแแแกแแแแก. IN แแจแแแแแแแก แกแแฎแแแแแ แกแแฎแแแ แแแแแแแแฃแแแ แแจแแแแแแแ-แ, แ แแแแแกแแช แชแแขแ แแแแแแแแแแแ แแแแแงแแแแแ. แกแแฎแแแ แฉแแแแก แจแแแแฎแแแแแจแ แแแแแ แแฅแแแแ, แ แแช แแ แแแฅแขแแก แกแแฎแแแ: แแฅแแแแ แแ แแแฅแขแ.
ForceScheduler แซแแแแแ แแแ แขแแแ แ แแ. แแ แขแแแแก แแแแ แแแ แแแแแฌแแแฃแแแ แแแฃแกแแก แแแฌแแแแฃแแแแแ BuildBot- แแแ แแแขแแ แคแแแกแ. แแแ แแแแขแ แแแก แแฅแแ แแแแแ แแ แกแ, แ แแช แแฅ SingleBranchScheduler.
PS No3. แแฅแแแ แแแแแแแแแ
แแแ แแแแฃแแ แแ แแก แแ แแคแแแ, แ แแแแแแช แแฃแจแแแแก แแแ แแแแฃแแ แแ แแแ แคแแฅแกแแ แแแฃแแ แกแแฎแจแแ แแ. แแแ แ แแกแ แแแแแแงแฃแ แแแ
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 แฅแแแแก แแแแแ แแขแฃแแก แแแแจแแแแ, แ แแแแแแช แจแแแแแ แแจแแแแแแแ แแแแแแแแก แแฃแจแ. In BuildFactory แแแฃแแแแแแก แแแกแแขแแ แแแแ แแแแแฏแแแแ แแฃแจแ-แ. แแแแแฏแแแ แแแแขแแแ แแแแแแแก แแแแแซแแฎแแแแ addStep
แแแ แแแแ แแแแแขแแแฃแแ แแแแแฏแ แแ แแแแแแแแจแ แแ แแก git แกแฃแคแแ -d -f -f โx, แแแจแแ git แแแแแฎแแ. แแก แแแฅแแแแแแแแ แจแแแแก แแแ แแแแขแ แจแ แแแแแแ, แ แแแแแแช แแแแคแแแ แแ แแ แแก แแแแฅแแแแ, แแแแ แแ แแฃแแแกแฎแแแแก แแแแฃแแแกแฎแแแ แแแแจแแแแแแแแก แกแฃแคแแ... แฒแแ แแแแขแ แ แ แแแแแ='แแแแแขแแแแแ' แแแฃแแแแแแก, แ แแ แคแแแแแแ แแ แแก แแ แแแ แแฅแขแแ แแแแแ, แกแแแแช แฉแแฉแฃแขแ, แแแฃแฎแแแแแแ แแแแกแ, แ แแ แแ แแ แแก แกแแชแแแแแแ, แ แฉแแแ แฎแแแฃแฎแแแแแแ.
แแแแ แ แแแแแขแแแฃแแ แแแแแฏแ แแ แแก แกแแ แแแขแแก แแแแแซแแฎแแแ แกแแกแแแแ แแแ แแ แแชแแกแ แแแ แแแแขแ แแ แแแแกแแแแแแ แแแแ แแแ แแฃแจแ-แ แแแ แแฅแขแแ แแแแแ /home/habr/worker/yourproject/build แแแ แแแแก แชแแแแแแ PATHONPATH=... แแแ แแแแ, แแฅแแแ แจแแแแซแแแแ แแแฌแแ แแ แกแแแฃแแแ แ แกแแ แแแขแแแ แแ แจแแแกแ แฃแแแ แแกแแแ แแแแ แแแ แแฃแจแ- แงแแแแ แแแแแฏแแ แฃแขแแ.ShellCommand. แแก แกแแ แแแขแแแ แจแแแซแแแแ แแแแแแแกแแแก แแแ แแแแแ แกแแชแแแจแ. แจแแแแแ แแ แฉแแฉแฃแขแ-แ แฉแแแแ แแแแแแ /home/habr/worker/yourproject/build. แแฃแแชแ, แแแจแแ แแ แกแแแแแก แแ แ "แแแแ แแ":
- แแฃแจแ แฃแแแ แจแแแฅแแแแก แแแกแแฆแแแแ
--แฃแแแกแแ แแกแ, แ แแ แแ แแแแแแแแก แแฆแกแ แฃแแแแแก แฃแคแแแแแแ แจแแแแแ แแแแแแขแแแ-แ. - at แแแข แแแซแแ-e แแ แกแแ แแแขแแแแแแ แแฅแแแ แฃแแแ แแแฃแแแแแ แกแแแฃแแ แแแ แแฆแกแแกแ แฃแแแแแแแแกแ แ แแ แแแแแแแแแแแ แฉแแฉแฃแขแ-e-แ แแ แแแแแ แแ 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.
แกแแฎแแแ แกแแฎแแแก แแแฃแกแขแแแก แแจแแแแแแแ-แ. แแฅ แฉแแแ แแแแแกแแฎแแแแ แแฅแแแแ แแ แแแฅแขแ... แแก แแแจแแแแก, แ แแ on แแฃแจแ- แกแฌแแ แแ แแก แแแ แจแแแฅแแแแแ /home/habr/worker/yourproject/build. แจแแแฃแแแ แ แซแแแแ แแจแแแแแแแ แแฎแแแแ แแ แกแแฎแแแแ.
แแฃแจแแแแ แกแแฎแแแแแ แจแแแชแแแก แคแฃแ แชแแแก แแฃแจแ-แก. แ แแแแแแแแแ แแแแแแฃแแ แฃแแแ แแแแแแขแแก แ['แแฃแจแแแแแ'].
แฅแแ แฎแแแ - แแแแแ แแขแฃแแ แแแแจแแแแ, แ แแแแแแแแแช แแแ แแกแแชแแ แแแแ แแจแแแแแแแ. แแก แแแแแฅแขแก แแแฃแแแแแแแก แแแแจแแแแ on แแฃแจแ แแแแกแ แฃแแแ แแแแจแ แจแแแแแแแ แงแแแแ แแแแแฏแ แแแแจแแแแ-แ.
6. แกแแแฃแแแ แ แแแแคแแแฃแ แแชแแแก แแแแแแแแ
แแฅ แแ แแก แแ แแแฅแขแแก แแ แฅแแขแแฅแขแฃแ แแก แแแแแแแแ, แ แแแแแก แแแแฎแแ แชแแแแแแแกแแช แแ แแแแแแแแ BuildBot
.
แฉแแแ แแแแแแแงแแแแแ แ แแแแ แช แแแ แกแแแก แแแแขแ แแแแก แกแแกแขแแแแก svn. แแแแแ แกแแชแแแ แแแแแแแกแแแแ แ แแแแ แกแแฎแแก แฆแ แฃแแแแจแ. แแฅ แแ แแก แแ แฆแ แฃแแแแก แแแกแแแแ แแ
BuildMaster ะธ แแฃแจแ แแแฃแจแแแ แแแแแ แแแกแแแแซแแแแ แแ แแแฅแขแ.แแแกแแแแซแแแ .BuildMaster แแแแฎแแแก แแแก แคแแแแแแก แกแแฅแแฆแแแแแจแ /แกแแฎแแ/แฐแแแ /แแกแขแแขแ. แแฃแจแ แแก แแแแฎแแแ แจแแแแแ แแแแแ /แกแแฎแแ/แฐแแแ /แแฃแจแ. แแ แแชแแกแแก แแแแฃแแแแแชแแ BuildMaster-แ แแ แแฃแจแ-แ แฎแแ แชแแแแแแแ แแแ แขแ 4000 แแ แแขแแแแแแก แแแฎแแแแแ BuildBot-แ, แแแฃ 'pb' แแฅแแ.
แกแแแแแแ แแ แแแฅแขแ แแแแแแแแ แแแแแแจแแ แแแฌแแ แแแ. แแแแชแแแแ แแแแแงแฃแ แ แแแแแแแ แแแก แชแแแแแแแแแก, แจแแฅแแแแ แจแแกแ แฃแแแแแแ แคแแแแ, แจแแฅแแแแ แแแแฃแแแแขแแชแแ แแ แฉแแแขแแ แแ แขแแกแขแแ แแแ. แฌแแ แฃแแแขแแแแแแแก แจแแแแฎแแแแแจแ, แงแแแแ แแแแแแแแแ แแ แฃแแแ แแแแแแแแแแแแก แจแแขแงแแแแแแแ แแแแฅแขแ แแแฃแแ แคแแกแขแแ, แ แแ แฌแแ แฃแแแขแแแแแ แแแฅแแแแแแแ.
แแแ แฉแแแแแแ BuildBot แฉแแแ แแแแฃแแแแจแแ แแแแแ แแแ แขแก 80 แแแแกแแแแก แแ แแแฅแขแ.แแแกแแแแซแแแ. แแ แแ แแก แแฃแชแแแแแแแ Apatch-แแก แแแงแแแแแ. แ แแแแ แช แแแแแแแแแแแก แแแฌแแแ แแแกแแแแแแ แฃแแแ แแ แแก แแแ แกแแ แแแ แ, BuildBot แแงแแแแแก แแแก.
แจแแแ แแแคแแ แแแชแแแก แจแแกแแแแฎแแ BuildBot แฉแแแ แแแแแแแงแแแแแ แกแแแแขแ.
แคแแกแขแแกแแแแก แกแแญแแ แแ แฐแแกแขแ smtp.your.domain - แแก แแซแแแแ แฌแแ แแแแแแก แแแแแแแแแก แกแแจแฃแแแแแแก แคแแกแขแแแแ [แแ.แคแแกแขแแ แแแชแฃแแแ] แแแขแแ แแแแชแแแก แแแ แแจแ. แแกแแแ แแแกแแแแซแแแแ'SMTP 1025 แคแแกแขแแแ แแฅแแแแแก แแแกแแแแ แฎแแแแ.
แแ แแชแแกแจแ แฉแแ แแฃแแแ แแ แ แแแแแแแแ: admin ะธ แแแแฎแแแ แแแแแ. แแแแแแแกแขแ แแขแแ แ 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-ec แแแกแแแฃแขแฃแ แ แแแ /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_alwaystrunk แแแแแแก แฌแแกแแแก: แ แแแแ แแแแ แฆแแแแก แกแแฅแแฆแแแแแก แกแขแ แฃแฅแขแฃแ แ svn แขแแขแแแแ. แแก แแกแแแ แกแแแแแแแแก แแแ แจแแแแ แแแแ แแแแแก. แแแแแก แแฎแ แแ split_file_alwaystrunk แแแแ แขแแแแแก แแ แแชแแกแก แแแแ, แ แแ แกแแชแแแ แจแแแชแแแก แแฎแแแแ แแแแแกแขแ แแแฃแ แ.
ะ แแแแ แแแแแ แแแแแแแแฃแแแ แคแแแขแ แแก แจแแชแแแแแแแช แฎแแแแแก แแ แ แแ แแแกแแแ แแกแแชแแ แแแแ แคแแแแแแ แแแแแกแขแ แแแฃแ แ แแแชแแแฃแแ แแกแแชแแแชแแแก แแแฎแแแแแ แแแจแแแแแแ split_file_alwaystrunk. แชแแแแแแแแแแ แ แแแแแ แแแ แแแแแกแขแ แแแฃแ แ, แแแจแแแแ แแจแแแแแแแ แกแแฎแแแแ แแฅแแแแ แแ แแแฅแขแ.
แแแแกแแแแแ แแฅ แกแแญแแ แแ แแแแกแแแแแก, แ แแ แแแแแแแกแขแ แแขแแ แแ แแแแฆแแก build-แแก แแ แขแแกแขแแ แแแแก แจแแแแแแแแก แกแแคแแกแขแ แกแแแแ, แ แแแแ แช แแ แแชแแกแแก แแคแแแแแแ.
แแแแแฏแ แแแแจแแแแ-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]
แแแก แจแแฃแซแแแ แจแแขแงแแแแแแแแแแก แแแแแแแแ
MailNotifier แแงแแแแแก แแ.แฌแแ แแแก แจแแขแงแแแแแแแแแแก แแแกแแแแแแแแ.
template_html แแแแแแก แขแแฅแกแขแแก แจแแแแแแก แกแแแแคแแ แแแชแแ แแแฃแแแขแแแแกแแแแก. HTML แแแแแแงแแแแแ แแแ แแแ แแแแก แจแแกแแฅแแแแแแ. แแก แแแแแคแแชแแ แแแฃแแแ แซแ แแแแ
MailNotifier แจแแแชแแแก แจแแแแแ แแ แแฃแแแแขแแแก.
fromaddr โ แแแกแแแแ แแ, แกแแแแแแแช แงแแแแ แแแแฆแแแก แแแฃแแแขแแแก.
แแแแแแแแแ แแแแแขแแ แแกแแแฃแ แแแแฎแแแ แแแแแแก=True แฃแแแแแแแก แจแแขแงแแแแแแแแก แแคแแแแแแก แแ แแแแฎแแแ แแแแแก, แ แแแแแแแช แจแแฅแแแ แฉแแแแแแแก.
แแแซแแแแ, แแแฎแแแ แแแแแ โ แกแฃแคแแฅแกแ, แ แแแแแแช แฃแแแ แแแแแแขแแก แแ แแแแฎแแแ แแแแแแแก แกแแฎแแแแแก, แ แแแแแแแช แแฆแแแแ แแแฃแแแขแแแก. แฒแกแ admin แ แแแแ แแแแฆแแแก แแแแฎแแแ แแแแแ แกแแแแคแแ แแแชแแ แแแฃแแแขแแแก แแแกแแแแ แแแ [แแ.แคแแกแขแแ แแแชแฃแแแ].
แ แแแแฐแแกแขแ แแแแกแแแฆแแ แแแก แฐแแกแขแแก แกแแฎแแแก, แ แแแแแแแช แกแแ แแแ แ แแฎแกแแแแ SMTP, smptPort แแแแกแแแฆแแ แแแก แแแ แขแแก แแแแแ แก, แ แแแแแแช แฃแกแแแแก SMTP แกแแ แแแ แ.
แ แแแแแ = "แแแคแ แแฎแแแแแ" แแแแแแก, แ แแ แแแแแแแแ แฃแแแ แแแฎแแแก แแฎแแแแ แแ แจแแแแฎแแแแแจแ, แแฃ แแ แแก แแแแแแฃแ แแ แแ แแแแแฏแ แแแแจแแแแ-แ, แ แแแแแแช แแแกแ แฃแแแ แกแขแแขแฃแกแแก แฃแแแแ แแกแแแแ แแ แแแคแ แแฎแแแแแแ. แฌแแ แแแขแแแแก แจแแแแฎแแแแแจแ แแ แแ แแก แกแแญแแ แ แแแฃแแแขแแแ แแแแแแแแ.
แแแแแขแแแแแ แแแแฆแแแแแ แจแแแชแแแก แแ แแแ แแ แกแแแก, แ แแแแแแกแแช แฃแแแ แแแแแแแแแแก แแแแแ, แแแ แแ แแคแแแแแแแกแ แแ แแ แแแ แแกแ, แแแแช แจแแแกแ แฃแแ แฉแแแแแแแก.
messageFormatter แแ แแก แแแแแฅแขแ, แ แแแแแแช แแแแกแแแฆแแ แแแก แจแแขแงแแแแแแแแก แคแแ แแแขแก, แแแก แจแแแแแแก แแ แชแแแแแแแแก แแ แแแแแแแแแก แฏแแแฏแ2. แแแ แแแแขแแแ, แ แแแแ แแชแแ wantProperties=True ะธ wantSteps=True แแแแกแแแฆแแ แแ แฎแแแแแกแแฌแแแแแ แชแแแแแแแแก แแก แแแแ แแแ.
with['services']=[sendMessageTo All] แแแแแแแแแ แกแแ แแแกแแแแก แฉแแแแแแแแแแก, แ แแแแแแ แจแแ แแก แแฅแแแแ แฉแแแแ แ แแแแ แขแแแ แ.
แฒฉแแแ แแก แจแแแซแแแแ! แแแแแชแแ
แฉแแแ แจแแแฅแแแแแ แฉแแแแ แกแแแฃแแแ แ แแแแคแแแฃแ แแชแแ แแ แแแแแแแฎแแ แคแฃแแฅแชแแแแแ แแแ, แ แแช แแแก แจแแฃแซแแแ. BuildBot. แแก, แแคแแฅแ แแ, แกแแแแแ แแกแแ แแแแก แแแกแแแแแแ, แกแแญแแ แแ แแฃ แแ แ แแก แแแกแขแ แฃแแแแขแ แแฅแแแแ แแ แแแฅแขแแก แจแแกแแฅแแแแแแ. แแแแแขแแ แแกแแแ แแก? แแแแแแแแแแแแ? แแแแคแแ แขแฃแแแ แแฃ แแ แ แแแกแแแ แแฃแจแแแแ? แแแจแแ แแ แกแขแแขแแแก แขแงแฃแแแแ แแ แแฌแแ .
แแ แจแแแแแแ. แแแกแฃแ แแแแแ, แ แแ แแ แแคแแกแแแแแแแ แกแแแแแแแแแแแ แแแแแแงแแแแก BuildBot, แฃแคแ แ แคแแ แแ แแแฎแแ, แกแแฎแแแแซแฆแแแแแแแแแ แแแแ แแแแ แแ แแแแแ แฃแคแ แ แแแขแ แแแแแแแแแแ แแงแ.
แแแแแแแ แงแแแแแก แงแฃแ แแแฆแแแแกแแแแก. แฒฌแแ แแแขแแแแแ.
แฌแงแแ แ: www.habr.com