ื“ื•ื’ืžื” ืœื™ื™ืฉื•ื ืฉืœ Intinuous Integration ืขื BuildBot

ื“ื•ื’ืžื” ืœื™ื™ืฉื•ื ืฉืœ Intinuous Integration ืขื BuildBot
(ืชืžื•ื ื” ืžืืช ืžื—ืฉื•ื‘ ื”ื—ืœ ืž- Pixabay)

ื”ื™ื™!

ืฉืžื™ ื™ื‘ื’ื ื™ ืฆ'ืจืงื™ืŸ, ืื ื™ ืžืชื›ื ืช ื‘ืฆื•ื•ืช ืคื™ืชื•ื— ื‘ื—ื‘ืจืช ื›ืจื™ื™ื” ืคื•ืœื™ืžื˜ืœ.

ื›ืืฉืจ ืžืชื—ื™ืœื™ื ื›ืœ ืคืจื•ื™ืงื˜ ื’ื“ื•ืœ, ืืชื” ืžืชื—ื™ืœ ืœื—ืฉื•ื‘: "ื‘ืื™ื–ื• ืชื•ื›ื ื” ื”ื›ื™ ื›ื“ืื™ ืœื”ืฉืชืžืฉ ื›ื“ื™ ืœื˜ืคืœ ื‘ื•?" ืคืจื•ื™ืงื˜ IT ืขื•ื‘ืจ ืžืกืคืจ ืฉืœื‘ื™ื ืœืคื ื™ ืฉื—ืจื•ืจ ื”ื’ืจืกื” ื”ื‘ืื”. ื–ื” ื˜ื•ื‘ ื›ืืฉืจ ืฉืจืฉืจืช ื”ืฉืœื‘ื™ื ื”ืืœื” ื”ื™ื ืื•ื˜ื•ืžื˜ื™ืช. ื”ืชื”ืœื™ืš ื”ืื•ื˜ื•ืžื˜ื™ ืฉืœ ืฉื—ืจื•ืจ ื’ืจืกื” ื—ื“ืฉื” ืฉืœ ืคืจื•ื™ืงื˜ IT ืขืฆืžื• ื ืงืจื ืื™ื ื˜ื’ืจืฆื™ื” ืžืชืžืฉื›ืช. BuildBot ื”ืชื’ืœื” ื›ืขื•ื–ืจ ื˜ื•ื‘ ืขื‘ื•ืจื ื• ื‘ื™ื™ืฉื•ื ืชื”ืœื™ืš ื–ื”.

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

ืชื•ื›ืŸ

ืชื•ื›ืŸ

1. ืœืžื” BuildBot?
2. ืงื•ื ืกืคื˜ ื‘ื”ื•ื‘ืœืช BuildMaster
3. ื”ืชืงื ื”
4. ืฆืขื“ื™ื ืจืืฉื•ื ื™ื

5. ืชืฆื•ืจื”. ืžืชื›ื•ืŸ ืฉืœื‘ ืื—ืจ ืฉืœื‘

5.1 BuildmasterConfig
ืขื•ื‘ื“ 5.2
5.3 change_source
5.4 ืžืชื–ืžื ื™ื

5.5 BuildFactory
5.6 ื‘ื•ื ื™ื

6. ื“ื•ื’ืžื” ืœืชืฆื•ืจื” ืžืฉืœืš

6.1 ื‘ื“ืจืš ืœ-master.cfg ืฉืœืš
6.2 ืขื‘ื•ื“ื” ืขื svn
6.3 ืžื›ืชื‘ ืืœื™ืš: ื›ืชื‘ื™ื ืžื•ืกืžื›ื™ื ืœื”ืฆื”ื™ืจ

ืขืฉื™ื ื• ื–ืืช! ืžื–ืœ ื˜ื•ื‘

1. ืœืžื” BuildBot?

ื‘ืขื‘ืจ ื‘-habr-e ื ืชืงืœืชื™ ื‘ืžืืžืจื™ื ืขืœ ื™ื™ืฉื•ื ืื™ื ื˜ื’ืจืฆื™ื” ืžืชืžืฉื›ืช ืขื BuildBot. ืœึฐืžึธืฉืึธืœ, ื–ึถื” ืžืฆืืชื™ ืืช ื–ื” ื”ื›ื™ ืื™ื ืคื•ืจืžื˜ื™ื‘ื™. ื™ืฉ ืขื•ื“ ื“ื•ื’ืžื - ืคืฉื•ื˜ ื™ื•ืชืจ. ื ื™ืชืŸ ืœืชื‘ืœ ืืช ื”ืžืืžืจื™ื ื”ืœืœื• ื“ื•ื’ืžื” ืžื”ืžื“ืจื™ืšื• - ื–ื” ืื—ืจื™ ื–ื”, ื‘ืื ื’ืœื™ืช. ื”ืงื•ืคื” ืžื”ื•ื•ื” ื ืงื•ื“ืช ื”ืชื—ืœื” ื˜ื•ื‘ื”. ืœืื—ืจ ืงืจื™ืืช ื”ืžืืžืจื™ื ื”ืœืœื•, ืกื‘ื™ืจ ืœื”ื ื™ื— ืฉืชืจืฆื” ืžื™ื“ ืžืฉื”ื• ืขืœ BuildBot ืœืขืฉื•ืช.

ืชืคืกื™ืง! ื”ืื ืžื™ืฉื”ื• ื‘ืืžืช ื”ืฉืชืžืฉ ื‘ื–ื” ื‘ืคืจื•ื™ืงื˜ื™ื ืฉืœื•? ืžืกืชื‘ืจ ืฉื›ืŸ ืจื‘ื™ื ื™ื™ืฉืžื• ื–ืืช ื‘ืžืฉื™ืžื•ืชื™ื”ื. ื™ื›ื•ืœ ืœื”ืžืฆื ื“ื•ื’ืžืื•ืช ืœื”ืฉืชืžืฉ BuildBot ื•ื‘ืืจื›ื™ื•ื ื™ ื”ืงื•ื“ ืฉืœ ื’ื•ื’ืœ.

ืื– ืžื” ื”ื”ื™ื’ื™ื•ืŸ ืฉืœ ืื ืฉื™ื ืžืฉืชืžืฉื™ื Buildbot? ืื—ืจื™ ื”ื›ืœ, ื™ืฉ ื›ืœื™ื ืื—ืจื™ื: ื‘ืงืจืช ืงืจื•ื– ะธ ื’'ื ืงื™ื ืก. ืื ื™ ืืขื ื” ื›ืš. ืœืจื•ื‘ ื”ืžืฉื™ืžื•ืช ื’'ื ืงื™ื ืก ื•ื”ืืžืช ืชืกืคื™ืง. ื‘ืชื•ืจื•, BuildBot - ืžืกืชื’ืœ ื™ื•ืชืจ, ื‘ืขื•ื“ ืฉื‘ืขื™ื•ืช ื ืคืชืจื•ืช ืฉื ื‘ืฆื•ืจื” ืคืฉื•ื˜ื” ื›ืžื• ื‘ ื’'ื ืงื™ื ืก. ื”ื‘ื—ื™ืจื” ื‘ื™ื“ื™ื™ื ืฉืœืš. ืืš ืžื›ื™ื•ื•ืŸ ืฉืื ื• ืžื—ืคืฉื™ื ื›ืœื™ ืœืคืจื•ื™ืงื˜ ื™ืขื“ ืžืชืคืชื—, ืžื“ื•ืข ืœื ืœื‘ื—ื•ืจ ื›ื–ื” ืฉื™ืืคืฉืจ, ื”ื—ืœ ืžืฉืœื‘ื™ื ืคืฉื•ื˜ื™ื, ืœื”ืฉื™ื’ ืžืขืจื›ืช ื‘ื ื™ื™ื” ื‘ืขืœืช ืื™ื ื˜ืจืืงื˜ื™ื‘ื™ื•ืช ื•ืžืžืฉืง ื™ื™ื—ื•ื“ื™.

ืœืžื™ ืฉืคืจื•ื™ืงื˜ ื”ื™ืขื“ ืฉืœื• ื›ืชื•ื‘ ื‘ืคื™ืชื•ืŸ, ื ืฉืืœืช ื”ืฉืืœื”: "ืœืžื” ืœื ืœื‘ื—ื•ืจ ืžืขืจื›ืช ืื™ื ื˜ื’ืจืฆื™ื” ื‘ืขืœืช ืžืžืฉืง ื‘ืจื•ืจ ืžื‘ื—ื™ื ืช ื”ืฉืคื” ืฉื‘ื” ื ืขืฉื” ืฉื™ืžื•ืฉ ื‘ืคืจื•ื™ืงื˜?" ื•ืขื›ืฉื™ื• ื”ื’ื™ืข ื”ื–ืžืŸ ืœื”ืฆื™ื’ ืืช ื”ื™ืชืจื•ื ื•ืช BuildBot.

ืื–, "ื”ืจื‘ื™ืขื™ื™ื” ื”ืื™ื ืกื˜ืจื•ืžื ื˜ืœื™ืช" ืฉืœื ื•. ืœืขืฆืžื™, ื–ื™ื”ื™ืชื™ ืืจื‘ืข ืชื›ื•ื ื•ืช BuildBot:

  1. ื–ื•ื”ื™ ืžืกื’ืจืช ืงื•ื“ ืคืชื•ื— ืชื—ืช ืจื™ืฉื™ื•ืŸ GPL
  2. ื–ื”ื• ื”ืฉื™ืžื•ืฉ ื‘-python ื›ื›ืœื™ ืชืฆื•ืจื” ื•ืชื™ืื•ืจ ื”ืคืขื•ืœื•ืช ื”ื ื“ืจืฉื•ืช
  3. ื–ื• ื”ื–ื“ืžื ื•ืช ืœืงื‘ืœ ืžืขื ื” ืžื”ืžื›ื•ื ื” ืขืœื™ื” ืžืชื‘ืฆืขืช ื”ื”ืจื›ื‘ื”
  4. ืืœื”, ืœื‘ืกื•ืฃ, ื”ื“ืจื™ืฉื•ืช ื”ืžื™ื ื™ืžืœื™ื•ืช ืœืžืืจื—. ื”ืคืจื™ืกื” ื“ื•ืจืฉืช ืคื™ืชื•ืŸ ื•ืžืคื•ืชืœ, ื•ืื™ื ื” ื“ื•ืจืฉืช ืžื›ื•ื ื” ื•ื™ืจื˜ื•ืืœื™ืช ื•ืžื›ื•ื ืช ื’'ืื•ื•ื”.

2. ืงื•ื ืกืคื˜ ื‘ื”ื•ื‘ืœืช BuildMaster

ื“ื•ื’ืžื” ืœื™ื™ืฉื•ื ืฉืœ Intinuous Integration ืขื BuildBot

ืžืจื›ื–ื™ ื‘ืืจื›ื™ื˜ืงื˜ื•ืจืช ื—ืœื•ืงืช ื”ืžืฉื™ืžื•ืช ื”ื•ื BuildMaster. ื–ื” ืฉื™ืจื•ืช ืฉ:

  • ืขื•ืงื‘ ืื—ืจ ืฉื™ื ื•ื™ื™ื ื‘ืขืฅ ื”ืžืงื•ืจ ืฉืœ ื”ืคืจื•ื™ืงื˜
  • ืฉื•ืœื— ืคืงื•ื“ื•ืช ืฉืฆืจื™ืš ืœื‘ืฆืข ืขืœ ื™ื“ื™ ืฉื™ืจื•ืช Worker ื›ื“ื™ ืœื‘ื ื•ืช ืืช ื”ืคืจื•ื™ืงื˜ ื•ืœื‘ื“ื•ืง ืื•ืชื•
  • ืžื•ื“ื™ืข ืžืฉืชืžืฉื™ื ืœื’ื‘ื™ ืชื•ืฆืื•ืช ื”ืคืขื•ืœื•ืช ืฉื ื ืงื˜ื•

BuildMaster ืžื•ื’ื“ืจ ื‘ืืžืฆืขื•ืช ืงื•ื‘ืฅ master.cfg. ื”ืงื•ื‘ืฅ ื”ื–ื” ื ืžืฆื ื‘ืฉื•ืจืฉ BuildMaster. ื‘ื”ืžืฉืš ืืจืื” ื›ื™ืฆื“ ื ื•ืฆืจ ื”ืฉื•ืจืฉ ื”ื–ื”. ื”ืงื•ื‘ืฅ ืขืฆืžื• master.cfg ืžื›ื™ืœ ืกืงืจื™ืคื˜ python ืฉืžืฉืชืžืฉ ื‘ืงืจื™ืื•ืช BuildBot.

ื”ืื•ื‘ื™ื™ืงื˜ ื”ื—ืฉื•ื‘ ื”ื‘ื ื‘ื™ื•ืชืจ BuildBot ื™ืฉ ืฉื ืขื•ื‘ื“. ืฉื™ืจื•ืช ื–ื” ื™ื›ื•ืœ ืœื”ื™ื•ืช ืžื•ืคืขืœ ืขืœ ืžืืจื— ืื—ืจ ืขื ืžืขืจื›ืช ื”ืคืขืœื” ืื—ืจืช, ืื• ืื•ืœื™ ืขืœ ื–ื” ืฉื‘ื• BuildMaster. ื–ื” ื™ื›ื•ืœ ืœื”ืชืงื™ื™ื ื’ื ื‘ืกื‘ื™ื‘ื” ื•ื™ืจื˜ื•ืืœื™ืช ืฉื”ื•ื›ื ื” ื‘ืžื™ื•ื—ื“ ืขื ื—ื‘ื™ืœื•ืช ื•ืžืฉืชื ื™ื ืžืฉืœื”. ื ื™ืชืŸ ืœื”ื›ื™ืŸ ืืช ื”ืกื‘ื™ื‘ื•ืช ื”ื•ื•ื™ืจื˜ื•ืืœื™ื•ืช ื”ืœืœื• ื‘ืืžืฆืขื•ืช ื›ืœื™ ืขื–ืจ ืคื™ืชื•ืŸ ื›ืžื• virtualenv, venv.

BuildMaster ืžืฉื“ืจ ืคืงื•ื“ื•ืช ืœื›ื•ืœื ืขื•ื‘ื“-y, ื•ื”ื•ื, ื‘ืชื•ืจื•, ืžืžืœื ืื•ืชื. ื›ืœื•ืžืจ, ืžืกืชื‘ืจ ืฉืชื”ืœื™ืš ื”ื‘ื ื™ื™ื” ื•ื”ื‘ื“ื™ืงื” ืฉืœ ืคืจื•ื™ืงื˜ ื™ื›ื•ืœ ืœื”ื™ืžืฉืš ืขื•ื‘ื“-e ืขื Windows ื•ื‘-Worker ืื—ืจ ืขื ืœื™ื ื•ืงืก.

ืœื‘ื“ื•ืง ืงื•ื“ื™ ืžืงื•ืจ ืฉืœ ื”ืคืจื•ื™ืงื˜ ืžืชืจื—ืฉื™ื ื‘ื›ืœ ืื—ื“ ืžื”ื ืขื•ื‘ื“-ื”.

3. ื”ืชืงื ื”

ืื– ื‘ื•ื ื ืœืš. ืื ื™ ืืฉืชืžืฉ ื‘ืื•ื‘ื•ื ื˜ื• 18.04 ื›ืžืืจื—. ืื ื™ ืืฉื™ื ืื—ื“ ืขืœ ื–ื” BuildMaster-ื ื•ืื—ื“ ืขื•ื‘ื“-ื. ืื‘ืœ ืชื—ื™ืœื” ืขืœื™ืš ืœื”ืชืงื™ืŸ python3.7:

sudo apt-get update
sudo apt-get install python3.7

ืœืžื™ ืฉืฆืจื™ืš python3.7.2 ื‘ืžืงื•ื 3.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. ื–ื” ื™ื”ื™ื” ื‘ืชื™ืงื™ื™ื” ืฉืœื ื• /home/habr/master.

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.

"ืžืคืชื— ื–ื”ื‘
ื•ืขื›ืฉื™ื• ื‘ืฉื‘ื™ืœ ืžื” ื›ืชื‘ืชื™ ืืช ื”ืคืกืงื” ื”ืงื•ื“ืžืช: ืชืกืจื™ื˜ ืฉ ืื‘ ื™ื“ืจื•ืฉ ืž ืขื•ื‘ื“-ื•ื‘ื•ืฆืข ืžืจื—ื•ืง ื‘ืกืคืจื™ื™ื” ื–ื• ืœื ื™ื‘ื•ืฆืข ืžื›ื™ื•ื•ืŸ ืฉืœืกืงืจื™ืคื˜ ืื™ืŸ ื”ืจืฉืื•ืช ืœื”ืคืขื™ืœ. ื›ื“ื™ ืœืชืงืŸ ืืช ื”ืžืฆื‘, ืชื–ื“ืงืง ืœืžืคืชื— --umask=0o22, ื”ืื•ืกืจ ืœื›ืชื•ื‘ ืœืกืคืจื™ื™ื” ื–ื•, ืืš ื™ืฉืžื•ืจ ืขืœ ื–ื›ื•ื™ื•ืช ื”ื”ืฉืงื”. ื•ื–ื” ื›ืœ ืžื” ืฉืื ื—ื ื• ืฆืจื™ื›ื™ื.

BuildMaster ะธ ืขื•ื‘ื“ ืœื™ืฆื•ืจ ืงืฉืจ ืื—ื“ ืขื ื”ืฉื ื™. ืงื•ืจื” ืฉื–ื” ืžืชื ืชืง ื• ืขื•ื‘ื“ ืžื—ื›ื” ื–ืžืŸ ืžื” ืœืชื’ื•ื‘ื” ืž BuildMaster-ื. ืื ืื™ืŸ ืชื’ื•ื‘ื”, ื”ื—ื™ื‘ื•ืจ ืžื•ืคืขืœ ืžื—ื“ืฉ. ืžึทืคึฐืชึตื—ึท --keepalive=60 ืจืง ืฆืจื™ืš ืœืฆื™ื™ืŸ ืืช ื”ื–ืžืŸ ืฉืื—ืจื™ื• ืœึฐื—ึทื‘ึผึตืจ ืžืืชื—ืœ.

5. ืชืฆื•ืจื”. ืžืชื›ื•ืŸ ืฉืœื‘ ืื—ืจ ืฉืœื‘

ืชึฐืฆื•ึผืจึธื” BuildMaster ืžืชื‘ืฆืข ื‘ืฆื“ ื”ืžื›ื•ื ื” ืฉื‘ื• ื‘ื™ืฆืขื ื• ืืช ื”ืคืงื•ื“ื” ืœื™ืฆื•ืจ-ืžืืกื˜ืจ. ื‘ืžืงืจื” ืฉืœื ื•, ื–ื• ืกืคืจื™ื™ื” /home/habr/master. ืงื•ื‘ืฅ ืชืฆื•ืจื” 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["keyFromDist"] ื”ื ืืœืžื ื˜ื™ื ืงื‘ื•ืขื™ื ืœืื™ื ื˜ืจืืงืฆื™ื” ืื™ืชื BuildMaster. ืขื‘ื•ืจ ื›ืœ ืžืคืชื—, ื”ืื•ื‘ื™ื™ืงื˜ ื”ืžืชืื™ื ืžื•ื—ืœืฃ ื›ืขืจืš.

ืขื•ื‘ื“ 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))                

ืœืคื™ ืžืคืชื— change_source dictionary c ื ืงื‘ืœ ื’ื™ืฉื” ืœืจืฉื™ืžื” ืฉื‘ื” ื ืจืฆื” ืœืฉื™ื ืื•ื‘ื™ื™ืงื˜ ืฉืžืกืงืจ ืืช ื”ืžืื’ืจ ืขื ืงื•ื“ ื”ืžืงื•ืจ ืฉืœ ื”ืคืจื•ื™ืงื˜. ื”ื“ื•ื’ืžื” ืžืฉืชืžืฉืช ื‘ืžืื’ืจ Git ืฉื ืฉืืœ ื‘ืžืจื•ื•ื—ื™ื ืžืกื•ื™ืžื™ื.

ื”ื˜ื™ืขื•ืŸ ื”ืจืืฉื•ืŸ ื”ื•ื ื”ื ืชื™ื‘ ืœืžืื’ืจ ืฉืœืš.

workdir ืžื™ื™ืฆื’ ืืช ื”ื ืชื™ื‘ ืœืชื™ืงื™ื” ืฉื‘ื” ื ืžืฆื ื‘ืฆื“ ืขื•ื‘ื“-ืงืจื•ื‘ ืœื ืชื™ื‘ /home/habr/worker/yourProject/build git ื™ืื—ืกืŸ ืืช ื”ื’ืจืกื” ื”ืžืงื•ืžื™ืช ืฉืœ ื”ืžืื’ืจ.

ืกื ื™ืฃ ืžื›ื™ืœ ืขื ืฃ ืกืคืฆื™ืคื™ ื‘ืžืื’ืจ ืฉื™ืฉ ืœืขืงื•ื‘ ืื—ืจื™ื•.

pollInterval ืžื›ื™ืœ ืืช ืžืกืคืจ ื”ืฉื ื™ื•ืช ืฉืื—ืจื™ื• BuildMaster ื™ืกืงืจ ืืช ื”ืžืื’ืจ ืœืฉื™ื ื•ื™ื™ื.

ื™ืฉื ืŸ ืžืกืคืจ ืฉื™ื˜ื•ืช ืœืขืงื•ื‘ ืื—ืจ ืฉื™ื ื•ื™ื™ื ื‘ืžืื’ืจ ืฉืœ ืคืจื•ื™ืงื˜.

ื”ืฉื™ื˜ื” ื”ืคืฉื•ื˜ื” ื‘ื™ื•ืชืจ ื”ื™ื ื”ืกืงืจื™ื, ืžื” ืฉืžืจืžื– ืขืœ ื›ืš BuildMaster ืžืขืช ืœืขืช ืกื•ืงืจ ืืช ื”ืฉืจืช ืขื ื”ืžืื’ืจ. ืื ืœื‘ืฆืข ืฉื™ืงืฃ ืืช ื”ืฉื™ื ื•ื™ื™ื ื‘ืžืื’ืจ, ืื ื›ืŸ BuildMaster ืชื™ืฆื•ืจ ืื•ื‘ื™ื™ืงื˜ ืคื ื™ืžื™ ืขื ืขื™ื›ื•ื‘ ืžืกื•ื™ื ืฉื™ื ื•ื™ ื•ืœืฉืœื•ื— ืื•ืชื• ืœืžื˜ืคืœ ื‘ืื™ืจื•ืขื™ื ืžืชื–ืžืŸ, ืฉืชืฉื™ืง ืืช ื”ืฉืœื‘ื™ื ืœื‘ื ื™ื™ืช ื”ืคืจื•ื™ืงื˜ ื•ืœื‘ื“ื™ืงืชื• ืขื•ื‘ื“-ื”. ื‘ื™ืŸ ื”ืฉืœื‘ื™ื ื”ืœืœื• ื™ืฆื•ื™ื ื• ืขื“ื›ื•ืŸ ืžืื’ืจ. ื‘ื“ื™ื•ืง ืขืœ ืขื•ื‘ื“ืคืขื•ืœื” ื–ื• ืชื™ืฆื•ืจ ืขื•ืชืง ืžืงื•ืžื™ ืฉืœ ื”ืžืื’ืจ. ื”ืคืจื˜ื™ื ืฉืœ ืชื”ืœื™ืš ื–ื” ื™ื›ื•ืกื• ืœื”ืœืŸ ื‘ืฉื ื™ ื”ืกืขื™ืคื™ื ื”ื‘ืื™ื. (5.4 ะธ 5.5).

ืฉื™ื˜ื” ืืœื’ื ื˜ื™ืช ืขื•ื“ ื™ื•ืชืจ ืœืžืขืงื‘ ืื—ืจ ืฉื™ื ื•ื™ื™ื ื‘ืžืื’ืจ ื”ื™ื ืœืฉืœื•ื— ื”ื•ื“ืขื•ืช ื™ืฉื™ืจื•ืช ืžื”ืฉืจืช ื”ืžืืจื— ืื•ืชื• BuildMaster- ืขืœ ืฉื™ื ื•ื™ ืงื•ื“ื™ ื”ืžืงื•ืจ ืฉืœ ื”ืคืจื•ื™ืงื˜. ื‘ืžืงืจื” ื–ื”, ื‘ืจื’ืข ืฉื”ืžืคืชื— ืขื•ืฉื” ืœื‘ืฆืข, ื”ืฉืจืช ืขื ืžืื’ืจ ื”ืคืจื•ื™ืงื˜ ื™ืฉืœื— ื”ื•ื“ืขื” BuildMaster-y. ื•ื”ื•ื, ื‘ืชื•ืจื•, ื™ื™ืจื˜ ืื•ืชื• ืขืœ ื™ื“ื™ ื™ืฆื™ืจืช ืื•ื‘ื™ื™ืงื˜ PBChangeSource. ืœืื—ืจ ืžื›ืŸ, ืื•ื‘ื™ื™ืงื˜ ื–ื” ื™ื•ืขื‘ืจ ืืœ ืžืชื–ืžืŸ, ืืฉืจ ืžืคืขื™ืœ ืืช ื”ืฉืœื‘ื™ื ืœื‘ื ื™ื™ืช ื”ืคืจื•ื™ืงื˜ ื•ื‘ื“ื™ืงืชื•. ื—ืœืง ื—ืฉื•ื‘ ื‘ืฉื™ื˜ื” ื–ื• ื”ื•ื ื”ืขื‘ื•ื“ื” ืขื ื•ื•-ืกืงืจื™ืคื˜ื™ื ืฉืœ ืฉืจืช ื‘ืžืื’ืจ. ื‘ืชืกืจื™ื˜ ื•ื•-ื, ืื—ืจืื™ ืœืขื™ื‘ื•ื“ ืคืขื•ืœื•ืช ื›ืืฉืจ ืœื‘ืฆืข-ื”, ืืชื” ืฆืจื™ืš ืœื”ืชืงืฉืจ ืœืฉื™ืจื•ืช ืฉื™ื ื•ื™ ืฉืœื— ื•ืฆื™ื™ืŸ ืืช ื›ืชื•ื‘ืช ื”ืจืฉืช BuildMaster-ื. ืืชื” ื’ื ืฆืจื™ืš ืœืฆื™ื™ืŸ ืืช ื™ืฆื™ืืช ื”ืจืฉืช ืฉืชืื–ื™ืŸ PBChangeSource. PBChangeSource, ืื’ื‘, ื”ื•ื ื—ืœืง BuildMaster-ื. ืฉื™ื˜ื” ื–ื• ืชื“ืจื•ืฉ ืื™ืฉื•ืจ ืžื ื”ืœ-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"]))

ืžืชื–ืžื ื™ื โ€“ ื–ื”ื• ืืœืžื ื˜ ืฉืคื•ืขืœ ื›ื˜ืจื™ื’ืจ ืฉืžืชื—ื™ืœ ืืช ื›ืœ ืฉืจืฉืจืช ื”ื”ืจื›ื‘ื” ื•ื”ื‘ื“ื™ืงื•ืช ืฉืœ ื”ืคืจื•ื™ืงื˜.
ื“ื•ื’ืžื” ืœื™ื™ืฉื•ื ืฉืœ Intinuous Integration ืขื BuildBot

ืื•ืชื ืฉื™ื ื•ื™ื™ื ืฉื ืจืฉืžื• change_source, ื”ืฉืชื ื” ื‘ืชื”ืœื™ืš ื”ืขื‘ื•ื“ื” BuildBot-ื ืœื”ืชื ื’ื“ ืฉื™ื ื•ื™ ื•ืขื›ืฉื™ื• ื›ืœ Sheduler ื‘ื”ืชื‘ืกืก ืขืœื™ื”ื, ื”ื•ื ื‘ื•ื ื” ื‘ืงืฉื•ืช ืœืชื—ื™ืœืช ืชื”ืœื™ืš ื‘ื ื™ื™ืช ื”ืคืจื•ื™ืงื˜. ืขื ื–ืืช, ื”ื•ื ื’ื ืงื•ื‘ืข ืžืชื™ ื”ื‘ืงืฉื•ืช ื”ืœืœื• ืžื•ืขื‘ืจื•ืช ื‘ื”ืžืฉืš ืœืชื•ืจ. ื—ืคืฅ ื‘ื•ื ื” ืžืื—ืกืŸ ืชื•ืจ ืฉืœ ื‘ืงืฉื•ืช ื•ืขื•ืงื‘ ืื—ืจ ืžืฆื‘ ื”ื”ืจื›ื‘ื” ื”ื ื•ื›ื—ื™ืช ื‘ื ืคืจื“ ืขื•ื‘ื“-ื”. ื‘ื•ื ื” ืงื™ื™ื ืขืœ BuildMaster-ื” ื•ื”ืœืื” ืขื•ื‘ื“-ื”. ื”ื•ื ืฉื•ืœื— ืขื BuildMaster-ื ืขืœ ืขื•ื‘ื“-ื•ื›ื‘ืจ ืกืคืฆื™ืคื™ืช ืœึดื‘ื ื•ึนืช - ืกื“ืจื” ืฉืœ ืฉืœื‘ื™ื ืฉื™ืฉ ืœื‘ืฆืข.
ืื ื• ืจื•ืื™ื ืฉื‘ื“ื•ื’ืžื” ื”ื ื•ื›ื—ื™ืช ื›ื–ื” ืžืชื–ืžื ื™ื ื ื•ืฆืจื• 2 ื—ืœืงื™ื. ื™ืชืจ ืขืœ ื›ืŸ, ืœื›ืœ ืื—ื“ ื™ืฉ ืกื•ื’ ืžืฉืœื•.

SingleBranchScheduler - ืื—ื“ ื”ืฉื™ืขื•ืจื™ื ื”ืคื•ืคื•ืœืจื™ื™ื ื‘ื™ื•ืชืจ ื‘ืœื•ื— ื”ื–ืžื ื™ื. ื”ื•ื ืฆื•ืคื” ื‘ืขื ืฃ ืื—ื“ ื•ืžื•ืคืขืœ ืขืœ ื™ื“ื™ ืฉื™ื ื•ื™ ืžืชื•ืขื“ ื‘ื•. ื›ืืฉืจ ื”ื•ื ืจื•ืื” ืฉื™ื ื•ื™ื™ื, ื”ื•ื ื™ื›ื•ืœ ืœืขื›ื‘ ืืช ืฉืœื™ื—ืช ื‘ืงืฉืช ื”ื‘ื ื™ื™ื” (ื“ื—ื” ืœืชืงื•ืคื” ื”ืžืฆื•ื™ื ืช ื‘ืคืจืžื˜ืจ ื”ืžื™ื•ื—ื“ treeStableTimer). ื‘ ืฉื ืžื’ื“ื™ืจ ืืช ืฉื ืœื•ื— ื”ื–ืžื ื™ื ืฉื™ื•ืฆื’ ื‘ื• BuildBot-ืžืžืฉืง ืื™ื ื˜ืจื ื˜. IN ืฉื™ื ื•ื™ ืžืกื ืŸ ื ืงื‘ืข ืžืกื ืŸ, ืœืื—ืจ ืžืขื‘ืจ ืื™ืœื• ืฉื™ื ื•ื™ื™ื ื‘ืกื ื™ืฃ ื’ื•ืจืžื™ื ืœืœื•ื— ื”ื–ืžื ื™ื ืœืฉืœื•ื— ื‘ืงืฉื” ืœื‘ื ื™ื™ื”. IN ืฉืžื•ืช ื‘ื•ื ื” ื”ืฉื ืžืฆื•ื™ืŸ ื‘ื•ื ื”-ื, ืฉื ืงื‘ืข ืžืขื˜ ืžืื•ื—ืจ ื™ื•ืชืจ. ื”ืฉื ื‘ืžืงืจื” ืฉืœื ื• ื™ื”ื™ื” ื–ื”ื” ืœืฉื ื”ืคืจื•ื™ืงื˜: ื”ืžื™ื–ื ืฉืœืš.

ForceScheduler ื“ื‘ืจ ืžืื•ื“ ืคืฉื•ื˜. ืกื•ื’ ื–ื” ืฉืœ ืœื•ื— ื–ืžื ื™ื ืžื•ืคืขืœ ืขืœ ื™ื“ื™ ืœื—ื™ืฆืช ืขื›ื‘ืจ BuildBot-ืžืžืฉืง ืื™ื ื˜ืจื ื˜. ืœืคืจืžื˜ืจื™ื ื™ืฉ ืื•ืชื” ืžื”ื•ืช ื›ืžื• ื‘ SingleBranchScheduler.

ื .ื‘ ืžืก' 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 clean -d -f -f -xืื– ืงื•ืคืช git. ืคืขื•ืœื•ืช ืืœื• ื›ืœื•ืœื•ืช ื‘ืคืจืžื˜ืจ ืฉื™ื˜ื”, ืฉืื™ื ื• ืžื•ืฆื”ืจ ื‘ื‘ื™ืจื•ืจ ืืš ืžืจืžื– ืขืœ ืขืจืš ื‘ืจื™ืจืช ืžื—ื“ืœ ื˜ืจื™... ืคึผึธืจึธืžึถื˜ึถืจ mode='incremental' ืžืฆื™ื™ืŸ ืฉื”ืงื‘ืฆื™ื ื”ื ืžื”ืกืคืจื™ื™ื” ืฉื‘ื” ืฆ'ืฆ'ืื•ื˜, ื‘ืขื•ื“ื• ื—ืกืจ ื‘ืžืื’ืจ, ื ืฉืืจ ืœืœื ื ื’ื™ืขื”.

ื”ืฉืœื‘ ื”ืฉื ื™ ืฉื ื•ืกืฃ ื”ื•ื ืงืจื™ืื” ืœืกืงืจื™ืคื˜ ืžึดืฉืืคึผึธื˜ ืขื ืคืจืžื˜ืจ ืฉืœื•ื ื‘ืฆื“ ืขื•ื‘ื“-a ืžื”ืกืคืจื™ื™ื” /home/habr/worker/yourProject/build ืขื ืžืฉืชื ื” ื”ืกื‘ื™ื‘ื” PATHONPATH=... ืœืคื™ื›ืš, ืืชื” ื™ื›ื•ืœ ืœื›ืชื•ื‘ ืกืงืจื™ืคื˜ื™ื ืžืฉืœืš ื•ืœื”ืคืขื™ืœ ืื•ืชื ื‘ืฆื“ ืขื•ื‘ื“-ื‘ื›ืœ ืฆืขื“ util.ShellCommand. ื ื™ืชืŸ ืœืžืงื ืกืงืจื™ืคื˜ื™ื ืืœื” ื™ืฉื™ืจื•ืช ื‘ืžืื’ืจ. ื•ืื– ื‘ ืฆ'ืฆ'ืื•ื˜-ื” ื”ื ื™ืคืœื• /home/habr/worker/yourProject/build. ืขื ื–ืืช, ืื– ื™ืฉ ืฉื ื™ "ืื‘ืœ":

  1. ืขื•ื‘ื“ ื™ืฉ ืœื™ืฆื•ืจ ืขื ืžืคืชื— --umak ื›ืš ืฉื–ื” ืœื ื™ื—ืกื•ื ื–ื›ื•ื™ื•ืช ื‘ื™ืฆื•ืข ืœืื—ืจ ืœืชืฉืœื•ื-ื.
  2. ื‘ ื“ื—ื™ืคืช ื’ื™ื˜-ื” ืžื”ืกืงืจื™ืคื˜ื™ื ื”ืืœื” ืืชื” ืฆืจื™ืš ื›ื“ื™ ืœืฆื™ื™ืŸ ืืช ื”ืžืืคื™ื™ืŸ ื ื™ืชืŸ ืœื‘ื™ืฆื•ืขื›ืš ืฉื‘ื”ืžืฉืš ืฆ'ืฆ'ืื•ื˜-e ืœื ืื™ื‘ื“ ืืช ื”ื–ื›ื•ืช ืœื‘ืฆืข ืืช ื”ืกืงืจื™ืคื˜ Git.

5.6 ื‘ื•ื ื™ื


c['builders'] = []
c['builders'].append(util.BuilderConfig(name="runtests",
                                        workernames=["example-worker"],
                                        factory=factory))

ืขืœ ืžื” ืฉื™ืฉ ื‘ื•ื ื” ื ืืžืจ ื›ืืŸ. ืขื›ืฉื™ื• ืื ื™ ืืกืคืจ ืœืš ื‘ืคื™ืจื•ื˜ ืจื‘ ื™ื•ืชืจ ืขืœ ืื™ืš ืœื™ืฆื•ืจ ืืช ื–ื”. BuilderConfig ื”ื•ื ืงื•ื ืกื˜ืจื•ืงื˜ื•ืจ ื‘ื•ื ื”. ืžืขืฆื‘ื™ื ื›ืืœื” ื‘ ื’['ื‘ื•ื ื™ื'] ืืชื” ื™ื›ื•ืœ ืœืฆื™ื™ืŸ ื›ืžื”, ืžื›ื™ื•ื•ืŸ ืฉื–ื”ื• ื’ื™ืœื™ื•ืŸ ืฉืœ ืื•ื‘ื™ื™ืงื˜ื™ื ื‘ื•ื ื” ืกื•ึผื’. ื›ืขืช ื ื›ืชื•ื‘ ืžื—ื“ืฉ ืืช ื”ื“ื•ื’ืžื” ืž BuildBot, ืžืงืจื‘ ืื•ืชื• ืœืžืฉื™ืžื” ืฉืœื ื•.


c['builders'] = []
c['builders'].append(util.BuilderConfig(name="yourProject",
                                            workernames=["yourWorkerName"],
                                            factory=factory))

ืขื›ืฉื™ื• ืื ื™ ืืกืคืจ ืœืš ืขืœ ื”ืคืจืžื˜ืจื™ื BuilderConfig.

ืฉื ืžืฆื™ื™ืŸ ืืช ื”ืฉื ื‘ื•ื ื”-ื. ื›ืืŸ ืงืจืื ื• ืœื–ื” ื”ืžื™ื–ื ืฉืœืš... ื–ื” ืื•ืžืจ ืฉื‘ื”ืžืฉืš ืขื•ื‘ื“- ื ืชื™ื‘ ื–ื” ื™ื™ื•ื•ืฆืจ /home/habr/worker/yourProject/build. Sheduler ืžื—ืคืฉ ื‘ื•ื ื” ืจืง ื‘ืฉื ื”ื–ื”.

ืฉืžื•ืช ืขื•ื‘ื“ื™ื ืžื›ื™ืœ ื’ื™ืœื™ื•ืŸ ืขื•ื‘ื“-ืก. ืœื›ืœ ืื—ื“ ืžื”ื ื™ืฉ ืœื”ื•ืกื™ืฃ ื’['ืขื•ื‘ื“ื™ื'].

ืžืคืขืœ - ืกืคืฆื™ืคื™ ืœึดื‘ื ื•ึนืช, ืืœื™ื• ื”ื•ื ืงืฉื•ืจ ื‘ื•ื ื”. ื”ื•ื ื™ืฉืœื— ืืช ื”ื—ืคืฅ ืœึดื‘ื ื•ึนืช ืขืœ ืขื•ื‘ื“ ื›ื“ื™ ืœื”ืฉืœื™ื ืืช ื›ืœ ื”ืฉืœื‘ื™ื ื”ื›ืœื•ืœื™ื ื‘ื–ื” ืœึดื‘ื ื•ึนืช-ื.

6. ื“ื•ื’ืžื” ืœืชืฆื•ืจื” ืžืฉืœืš

ื”ื ื” ืืจื›ื™ื˜ืงื˜ื•ืจืช ื”ืคืจื•ื™ืงื˜ ืœื“ื•ื’ืžื” ืฉืื ื™ ืžืฆื™ืข ืœื™ื™ืฉื ื‘ืืžืฆืขื•ืชื” BuildBot
.

ืื ื• ื ืฉืชืžืฉ ื›ืžืขืจื›ืช ื‘ืงืจืช ื’ืจืกืื•ืช svn. ื”ืžืื’ืจ ืขืฆืžื• ื™ืžื•ืงื ื‘ืขื ืŸ ื›ืœืฉื”ื•. ื”ื ื” ื”ื›ืชื•ื‘ืช ืฉืœ ื”ืขื ืŸ ื”ื–ื” svn.host/svn/yourProject/trunk. ื‘ืขื ืŸ ืžืชื—ืช svn ื™ืฉ ืฉื ืžืฉืชืžืฉ ืœื—ืฉื‘ื•ืŸ: ื”ืžืฉืชืžืฉ, passwd: ืกื™ืกืžื. ืกืงืจื™ืคื˜ื™ื ื”ืžื™ื™ืฆื’ื™ื ืฉืœื‘ื™ื ืœึดื‘ื ื•ึนืช-a ื™ื”ื™ื” ื’ื ื‘ืกื ื™ืฃ svn, ื‘ืชื™ืงื™ื™ื” ื ืคืจื“ืช buildbot/worker_linux. ืกืงืจื™ืคื˜ื™ื ืืœื• ืžืžื•ืงืžื™ื ื‘ืžืื’ืจ ืขื ื”ืžืืคื™ื™ืŸ ื”ืฉืžื•ืจ ื”ืคืขืœื”.

BuildMaster ะธ ืขื•ื‘ื“ ืœืจื•ืฅ ืขืœ ืื•ืชื• ืžืืจื— project.host .BuildMaster ืžืื—ืกืŸ ืืช ื”ืงื‘ืฆื™ื ืฉืœื• ื‘ืชื™ืงื™ื™ื” /home/habr/master. ืขื•ื‘ื“ ื”ื•ื ืžืื•ื—ืกืŸ ื‘ื ืชื™ื‘ ื”ื‘ื /ื‘ื™ืช/ื—ื“ืจ/ืขื•ื‘ื“. ืชืงืฉื•ืจืช ืชื”ืœื™ื›ื™ืช BuildMaster-ื ื• ืขื•ื‘ื“-a ืžืชื‘ืฆืข ื“ืจืš ื™ืฆื™ืื” 4000 ืœืคื™ ื”ืคืจื•ื˜ื•ืงื•ืœ BuildBot-ื, ื›ืœื•ืžืจ 'ืคื‘' ื ื•ื”ืœ.

ืคืจื•ื™ืงื˜ ื”ื™ืขื“ ื›ืชื•ื‘ ื›ื•ืœื• ื‘- Python. ื”ืžืฉื™ืžื” ื”ื™ื ืœืขืงื•ื‘ ืื—ืจ ื”ืฉื™ื ื•ื™ื™ื ืฉืœื•, ืœื™ืฆื•ืจ ืงื•ื‘ืฅ ื”ืคืขืœื”, ืœื™ืฆื•ืจ ืชื™ืขื•ื“ ื•ืœืขืจื•ืš ื‘ื“ื™ืงื•ืช. ื‘ืžืงืจื” ืฉืœ ื›ืฉืœ, ื›ืœ ื”ืžืคืชื—ื™ื ืฆืจื™ื›ื™ื ืœืฉืœื•ื— ื”ื•ื“ืขื” ื‘ื“ื•ื"ืœ ื”ืžืฆื™ื™ื ืช ืฉื™ืฉ ืคืขื•ืœื” ืœื ืžื•ืฆืœื—ืช.

ืชืฆื•ื’ืช ืื™ื ื˜ืจื ื˜ BuildBot ื ืชื—ื‘ืจ ืœื™ืฆื™ืื” 80 ืขื‘ื•ืจ project.host. ืื™ืŸ ืฆื•ืจืš ืœื”ืชืงื™ืŸ ืืช Apatch. ื›ื—ืœืง ืžื”ืกืคืจื™ื™ื” ืžืคื•ืชืœ ื™ืฉ ื›ื‘ืจ ืฉืจืช ืื™ื ื˜ืจื ื˜, BuildBot ืžืฉืชืžืฉ ื‘ื•.

ืœืื—ืกื•ืŸ ืžื™ื“ืข ืคื ื™ืžื™ ืขื‘ื•ืจ BuildBot ืื ื—ื ื• ื ืฉืชืžืฉ 12te.

ื ื“ืจืฉ ืžืืจื— ืขื‘ื•ืจ ื“ื™ื•ื•ืจ smtp.your.domain - ื–ื” ืžืืคืฉืจ ืฉืœื™ื—ืช ืžื›ืชื‘ื™ื ืžื”ื“ื•ืืจ [ืžื•ื’ืŸ ื‘ื“ื•ื"ืœ] ืœืœื ืื™ืžื•ืช. ื’ื ืขืœ ื”ืžืืจื— '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-ื ื• ืขื•ื‘ื“-ื. ืœืื—ืจ ืžื›ืŸ ื”ื“ื‘ืง ืืช ื”ืงื•ื‘ืฅ ื”ื–ื” master.cfg ะฒ /home/habr/master.

ื”ืฉืœื‘ ื”ื‘ื ื”ื•ื ืœื”ืชื—ื™ืœ ืืช ื”ืฉื™ืจื•ืช BuildMasterื


sudo buildbot start /home/habr/master

ืœืื—ืจ ืžื›ืŸ ื”ืชื—ืœ ืืช ื”ืฉื™ืจื•ืช ืขื•ื‘ื“-a


buildbot-worker start /home/habr/worker

ืžื•ึผื›ึธืŸ! ืขึทื›ืฉืึธื™ื• Buildbot ื™ืขืงื•ื‘ ืื—ืจ ืฉื™ื ื•ื™ื™ื ื•ื™ืคืขื™ืœ ืœื‘ืฆืข-ื™ ืคื ื™ืžื” svn, ื‘ื™ืฆื•ืข ืฉืœื‘ื™ ื‘ื ื™ื™ื” ื•ื‘ื“ื™ืงืช ืคืจื•ื™ืงื˜ ืขื ื”ืืจื›ื™ื˜ืงื˜ื•ืจื” ื”ื "ืœ.

ืœื”ืœืŸ ืืชืืจ ื›ืžื” ืชื›ื•ื ื•ืช ืฉืœ ื”ืืžื•ืจ ืœืขื™ืœ master.cfg.

6.1 ื‘ื“ืจืš ืœ-master.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_alwaystrank ืžืคืฉื˜ ืืช ื”ืชื”ืœื™ืš ื‘ื›ืš ืฉื”ืžืื’ืจ ืžื›ื™ืœ ืจืง ืชื ื”ืžื˜ืขืŸ.

ะ’ ืžืชื–ืžื ื™ื ืฆื•ื™ืŸ ืฉื™ื ื•ื™ ืžืกื ืŸืžื™ ืฉืจื•ืื” ืœืœื ื—ืชื™ืžื” ื•ืžืฉื™ื™ืš ืืœื™ื• ืกื ื™ืฃ ืชื ื”ืžื˜ืขืŸ ืœืคื™ ืืกื•ืฆื™ืืฆื™ื” ื ืชื•ื ื” ื“ืจืš split_file_alwaystrank. ืชื’ื•ื‘ื” ืœืฉื™ื ื•ื™ื™ื ื‘ ืชื ื”ืžื˜ืขืŸ, ืžืฉื™ืงื” ื‘ื•ื ื” ืขื ืฉื ื”ืžื™ื–ื ืฉืœืš.

ื ื›ืกื™ื ื›ืืŸ ื–ื” ื ื—ื•ืฅ ื›ื“ื™ ืฉื”ืžื ื”ืœ ื™ืงื‘ืœ ืจืฉื™ืžื•ืช ื“ื™ื•ื•ืจ ืฉืœ ืชื•ืฆืื•ืช ื‘ื ื™ื™ื” ื•ื‘ื“ื™ืงื•ืช ื›ื‘ืขืœื™ื ืฉืœ ื”ืชื”ืœื™ืš.

ืฉืœื‘ ืœึดื‘ื ื•ึนืช-a ืœืชืฉืœื•ื ืžืกื•ื’ืœ ืœืžื—ื•ืง ืœื—ืœื•ื˜ื™ืŸ ื›ืœ ืงื‘ืฆื™ื ืฉื ืžืฆืื™ื ื‘ื’ืจืกื” ื”ืžืงื•ืžื™ืช ืฉืœ ื”ืžืื’ืจ ืขื•ื‘ื“-ื. ื•ืื– ืชืขืฉื” ืืช ื”ืžืœืื” ืขื“ื›ื•ืŸ. ื”ืžืฆื‘ ืžื•ื’ื“ืจ ื“ืจืš ื”ืคืจืžื˜ืจ ืžืฆื‘=ืžืœื, ืฉื™ื˜ื”=ื˜ืจื™... ืคึผึธืจึธืžึถื˜ึถืจ haltOnTailure ืื•ืžืจ ืฉืื ืขื“ื›ื•ืŸ ื™ื‘ื•ืฆืข ืขื ืฉื’ื™ืื”, ืื– ื™ืฉ ืœื”ืฉืขื•ืช ืืช ื›ืœ ืชื”ืœื™ืš ื”ื‘ื ื™ื™ื” ื•ื”ื‘ื“ื™ืงื”, ืžื›ื™ื•ื•ืŸ ืฉืคืขื•ืœื•ืช ื ื•ืกืคื•ืช ืื™ื ืŸ ื”ื’ื™ื•ื ื™ื•ืช.

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 ืžืฉืžืฉ ืœื™ืฆื™ืจืช ืกื™ืžื•ืŸ. ื–ื” ืžืฉืชื ื” ืขืœ ื™ื“ื™ ื”ืžื ื•ืข jinja2 (ื ื™ืชืŸ ืœื”ืฉื•ื•ืช ืขื ื’'ื ื’ื•). BuildBot ื™ืฉ ืงื‘ื•ืฆื” ืฉืœ ืžืฉืชื ื™ื ืฉื”ืขืจื›ื™ื ืฉืœื”ื ืžื•ื—ืœืคื™ื ื‘ืชื‘ื ื™ืช ื‘ืžื”ืœืš ืชื”ืœื™ืš ื™ืฆื™ืจืช ื˜ืงืกื˜ ื”ื”ื•ื“ืขื”. ืžืฉืชื ื™ื ืืœื• ืžื•ืงืคื™ื ื‘-{{ ืกื•ื’ืจื™ื ืžืชื•ืœืชืœื™ื ื›ืคื•ืœื™ื }}. ืœื“ื•ื’ืžื”, ืชืงืฆื™ืจ ืžืฆื™ื’ ืืช ืžืฆื‘ ื”ืคืขื•ืœื•ืช ืฉื”ื•ืฉืœืžื•, ื›ืœื•ืžืจ ื”ืฆืœื—ื” ืื• ื›ื™ืฉืœื•ืŸ. ื ืคืจื•ื™ืงื˜ื™ื ื™ืคืœื•ื˜ ื”ืžื™ื–ื ืฉืœืš. ืื–, ื‘ืืžืฆืขื•ืช ืคืงื•ื“ื•ืช ืฉืœื™ื˜ื” ื‘ jinja2, ืžืฉืชื ื™ื BuildBot-a ื•-python ื›ืœื™ ืขื™ืฆื•ื‘ ืžื—ืจื•ื–ื•ืช, ืืชื” ื™ื›ื•ืœ ืœื™ืฆื•ืจ ื”ื•ื“ืขื” ื“ื™ ืื™ื ืคื•ืจืžื˜ื™ื‘ื™ืช.

MailNotifier ืžื›ื™ืœ ืืช ื”ื˜ื™ืขื•ื ื™ื ื”ื‘ืื™ื.

fromaddr โ€“ ื”ื›ืชื•ื‘ืช ืžืžื ื” ื›ื•ืœื ื™ืงื‘ืœื• ืืช ื”ื ื™ื•ื–ืœื˜ืจ.

sendToInterestedUsers=True ืฉื•ืœื— ื”ื•ื“ืขื” ืœื‘ืขืœื™ื ื•ืœืžืฉืชืžืฉ ืฉืขืฉื” ืœื‘ืฆืข.

ื‘ื“ื™ืงื” - ืกื™ื•ืžืช ืฉื™ืฉ ืœื”ื•ืกื™ืฃ ืœืฉืžื•ืช ื”ืžืฉืชืžืฉื™ื ื”ืžืงื‘ืœื™ื ืืช ื”ื ื™ื•ื–ืœื˜ืจ. ื›ืš ืžื ื”ืœ ื›ื™ืฆื“ ื™ืงื‘ืœ ื”ืžืฉืชืžืฉ ืืช ื”ื ื™ื•ื–ืœื˜ืจ ื‘ื›ืชื•ื‘ืช [ืžื•ื’ืŸ ื‘ื“ื•ื"ืœ].

ืžืืจื— ืžืžืกืจ ืžืฆื™ื™ืŸ ืืช ืฉื ื”ืžืืจื— ืฉื‘ื• ื”ืฉืจืช ื ืคืชื— SMTP, smptPort ืžืฆื™ื™ืŸ ืืช ืžืกืคืจ ื”ื™ืฆื™ืื” ืฉืžืื–ื™ืŸ SMTP ืฉืจืช

mode="ืื–ื”ืจื”" ืื•ืžืจ ืฉื”ื“ื™ื•ื•ืจ ืฆืจื™ืš ืœื”ื™ืขืฉื•ืช ืจืง ืื ื™ืฉ ืœืคื—ื•ืช ืฉืœื‘ ืื—ื“ ืœึดื‘ื ื•ึนืช-a, ืฉื”ืกืชื™ื™ื ื‘ื›ื™ืฉืœื•ืŸ ื”ืกื˜ื˜ื•ืก ืื• ื‘ืื–ื”ืจื”. ื‘ืžืงืจื” ืฉืœ ื”ืฆืœื—ื”, ืื™ืŸ ืฆื•ืจืš ืœืฉืœื•ื— ื ื™ื•ื–ืœื˜ืจ.

ื ืžืขื ื™ื ื ื•ืกืคื™ื ืžื›ื™ืœ ืจืฉื™ืžื” ืฉืœ ืื ืฉื™ื ืฉืืœื™ื”ื ื™ืฉ ืœืฉืœื•ื— ืืช ื”ื“ื™ื•ื•ืจ ื‘ื ื•ืกืฃ ืœื‘ืขืœื™ื ื•ืœืžื™ ืฉื‘ื™ืฆืข ืืช ืœื‘ืฆืข.

messageFormatter ื”ื•ื ืื•ื‘ื™ื™ืงื˜ ื”ืžืฆื™ื™ืŸ ืืช ืคื•ืจืžื˜ ื”ื”ื•ื“ืขื”, ื”ืชื‘ื ื™ืช ืฉืœื” ื•ืงื‘ื•ืฆืช ืžืฉืชื ื™ื ื–ืžื™ื ื™ื ืž jinja2. ืืคืฉืจื•ื™ื•ืช ื›ื’ื•ืŸ wantProperties=ื ื›ื•ืŸ ะธ wantSteps=ื ื›ื•ืŸ ืœื”ื’ื“ื™ืจ ืงื‘ื•ืฆื” ื–ื• ืฉืœ ืžืฉืชื ื™ื ื–ืžื™ื ื™ื.

with['services']=[sendMessageToAll] ืžืกืคืง ืจืฉื™ืžื” ืฉืœ ืฉื™ืจื•ืชื™ื, ื‘ื™ื ื™ื”ื ื™ื”ื™ื• ืฉืœื ื• ื›ืชื‘.

ืขืฉื™ื ื• ื–ืืช! ืžื–ืœ ื˜ื•ื‘

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

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

ืชื•ื“ื” ืœื›ื•ืœื›ื ืขืœ ืชืฉื•ืžืช ื”ืœื‘. ื‘ื”ืฆืœื—ื”.

ืžืงื•ืจ: www.habr.com

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