(Image by
ΠΡΠΈΠ²Π΅Ρ!
ΠΠ΅Π½Ρ Π·ΠΎΠ²ΡΡ ΠΠ²Π³Π΅Π½ΠΈΠΉ Π§Π΅ΡΠΊΠΈΠ½, Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ² Π² Π³ΠΎΡΠ½ΠΎΠ΄ΠΎΠ±ΡΠ²Π°ΡΡΠ΅ΠΉ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ Polymetal.
ΠΡΠΈΡΡΡΠΏΠ°Ρ ΠΊ Π»ΡΠ±ΠΎΠΌΡ ΠΊΡΡΠΏΠ½ΠΎΠΌΡ ΠΏΡΠΎΠ΅ΠΊΡΡ Π½Π°ΡΠΈΠ½Π°Π΅ΡΡ Π·Π°Π΄ΡΠΌΡΠ²Π°ΡΡΡΡ: Β«ΠΠ°ΠΊΠΎΠΉ ΠΆΠ΅ ΡΠΎΡΡ Π»ΡΡΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΄Π»Ρ Π΅Π³ΠΎ ΠΎΠ±ΡΠ»ΡΠΆΠΈΠ²Π°Π½ΠΈΡ?Β». IT-ΠΏΡΠΎΠ΅ΠΊΡ ΠΏΠ΅ΡΠ΅Π΄ Π²ΡΠΏΡΡΠΊΠΎΠΌ ΠΎΡΠ΅ΡΠ΅Π΄Π½ΠΎΠΉ Π²Π΅ΡΡΠΈΠΈ ΠΏΡΠΎΡ ΠΎΠ΄ΠΈΡ ΡΡΠ΄ ΡΡΠ°ΠΏΠΎΠ². Π₯ΠΎΡΠΎΡΠΎ, ΠΊΠΎΠ³Π΄Π° ΡΠ΅ΠΏΠΎΡΠΊΠ° ΡΡΠΈΡ ΡΡΠ°ΠΏΠΎΠ² Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π°. Π‘Π°ΠΌ ΠΏΠΎ ΡΠ΅Π±Π΅ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ ΠΏΡΠΎΡΠ΅ΡΡ Π²ΡΠΏΡΡΠΊΠ° Π½ΠΎΠ²ΠΎΠΉ Π²Π΅ΡΡΠΈΠΈ IT-ΠΏΡΠΎΠ΅ΠΊΡΠ° Π½Π°Π·ΡΠ²Π°Π΅ΡΡΡ Continuous Integration. BuildBot Π΄Π»Ρ Π½Π°Ρ ΠΎΠΊΠ°Π·Π°Π»ΡΡ Ρ ΠΎΡΠΎΡΠΈΠΌ ΠΏΠΎΠΌΠΎΡΠ½ΠΈΠΊΠΎΠΌ, ΡΠ΅Π°Π»ΠΈΠ·ΡΡΡΠΈΠΌ ΡΡΠΎΡ ΠΏΡΠΎΡΠ΅ΡΡ.
Π ΡΡΠΎΠΉ ΡΡΠ°ΡΡΠ΅ Ρ ΡΠ΅ΡΠΈΠ» ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΠΈΡΡ ΠΎΠ±Π·ΠΎΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠ΅ΠΉ BuildBot. ΠΠ° ΡΡΠΎ ΡΠΏΠΎΡΠΎΠ±Π΅Π½ ΡΡΠΎΡ ΡΠΎΡΡ? ΠΠ°ΠΊ ΠΊ Π½Π΅ΠΌΡ ΠΏΠΎΠ΄ΡΡΡΠΏΠΈΡΡΡΡ ΠΈ ΠΊΠ°ΠΊ Π²ΡΡΡΡΠΎΠΈΡΡ Ρ Π½ΠΈΠΌ Π½ΠΎΡΠΌΠ°Π»ΡΠ½ΡΠ΅ ΠΠ€Π€ΠΠΠ’ΠΠΠΠ«Π Π ΠΠΠΠ§ΠΠ ΠΠ’ΠΠΠ¨ΠΠΠΠ―? ΠΠ°Ρ ΠΎΠΏΡΡ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΡΡ ΠΈ Ρ ΡΠ΅Π±Ρ, ΡΠΎΠ·Π΄Π°Π² Π½Π° ΡΠ²ΠΎΠ΅ΠΉ ΠΌΠ°ΡΠΈΠ½Π΅ ΡΠ°Π±ΠΎΡΠΈΠΉ ΡΠ΅ΡΠ²ΠΈΡ ΡΠ±ΠΎΡΠΊΠΈ ΠΈ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π²Π°ΡΠ΅Π³ΠΎ ΠΏΡΠΎΠ΅ΠΊΡΠ°.
Π‘ΠΎΠ΄Π΅ΡΠΆΠ°Π½ΠΈΠ΅
Π‘ΠΎΠ΄Π΅ΡΠΆΠ°Π½ΠΈΠ΅
1. ΠΠΎΡΠ΅ΠΌΡ BuildBot?
Π Π°Π½Π΅Π΅ Π½Π° habr-e Ρ Π²ΡΡΡΠ΅ΡΠ°Π» ΡΡΠ°ΡΡΠΈ ΠΎ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ Continuous Integration Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ BuildBot. Π ΠΏΡΠΈΠΌΠ΅ΡΡ,
Π‘ΡΠΎΠΏ! Π ΠΊΡΠΎ-ΡΠΎ Π²ΠΎΠΎΠ±ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π» Π΅Π³ΠΎ Π² ΡΠ²ΠΎΠΈΡ
ΠΏΡΠΎΠ΅ΠΊΡΠ°Ρ
? ΠΠΊΠ°Π·ΡΠ²Π°Π΅ΡΡΡ Π΄Π°,
Π’Π°ΠΊ ΠΊΠ°ΠΊΠΎΠ²Π° ΠΆΠ΅ Π»ΠΎΠ³ΠΈΠΊΠ° Π»ΡΠ΄Π΅ΠΉ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΠΈΡ Buildbot? ΠΠ΅Π΄Ρ Π΅ΡΡΡ Π΄ΡΡΠ³ΠΈΠ΅ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡ: CruiseControl ΠΈ Jenkins. ΠΡΠ²Π΅ΡΡ ΡΠ°ΠΊ. ΠΠ»Ρ Π±ΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²Π° Π·Π°Π΄Π°Ρ Jenkins ΠΈ ΠΏΡΠ°Π²Π΄Π° Π±ΡΠ΄Π΅Ρ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ. Π ΡΠ²ΠΎΡ ΠΎΡΠ΅ΡΠ΅Π΄Ρ, BuildBot β Π±ΠΎΠ»Π΅Π΅ Π°Π΄Π°ΠΏΡΠΈΠ²Π½ΡΠΉ, ΠΏΡΠΈ ΡΡΠΎΠΌ Π·Π°Π΄Π°ΡΠΈ ΡΠ°ΠΌ ΡΠ΅ΡΠ°ΡΡΡΡ ΡΠ°ΠΊ ΠΆΠ΅ ΠΏΡΠΎΡΡΠΎ, ΠΊΠ°ΠΊ ΠΈ Π² Jenkins. ΠΡΠ±ΠΈΡΠ°ΡΡ Π²Π°ΠΌ. ΠΠΎ ΡΠ°Π· ΡΠΆ ΠΌΡ ΠΈΡΠ΅ΠΌ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ Π΄Π»Ρ ΡΠ°Π·Π²ΠΈΠ²Π°ΡΡΠ΅Π³ΠΎΡΡ ΡΠ΅Π»Π΅Π²ΠΎΠ³ΠΎ ΠΏΡΠΎΠ΅ΠΊΡΠ°, ΡΠΎ ΠΏΠΎΡΠ΅ΠΌΡ Π±Ρ Π½Π΅ Π²ΡΠ±ΡΠ°ΡΡ ΡΠΎΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ, ΠΎΡΡΠ°Π»ΠΊΠΈΠ²Π°ΡΡΡ ΠΎΡ ΠΏΡΠΎΡΡΡΡ ΡΠ°Π³ΠΎΠ², ΠΏΠΎΠ»ΡΡΠΈΡΡ ΡΠΈΡΡΠ΅ΠΌΡ ΡΠ±ΠΎΡΠΊΠΈ, ΠΈΠΌΠ΅ΡΡΡΡ ΠΈΠ½ΡΠ΅ΡΠ°ΠΊΡΠΈΠ²Π½ΠΎΡΡΡ ΠΈ ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΡΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ.
Π£ ΡΠ΅Ρ , ΡΠ΅ΠΉ ΡΠ΅Π»Π΅Π²ΠΎΠΉ ΠΏΡΠΎΠ΅ΠΊΡ Π½Π°ΠΏΠΈΡΠ°Π½ Π½Π° python, Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ Π²ΠΎΠΏΡΠΎΡ: Β«ΠΠΎΡΠ΅ΠΌΡ Π±Ρ Π½Π΅ Π²ΡΠ±ΡΠ°ΡΡ ΡΠΈΡΡΠ΅ΠΌΡ ΠΈΠ½ΡΠ΅Π³ΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ, Π² ΠΊΠΎΡΠΎΡΠΎΠΉ Π΅ΡΡΡ ΠΏΠΎΠ½ΡΡΠ½ΡΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ Ρ ΡΠΎΡΠΊΠΈ Π·ΡΠ΅Π½ΠΈΡ ΡΠ·ΡΠΊΠ°, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΠΎΠ³ΠΎ Π² ΠΏΡΠΎΠ΅ΠΊΡΠ΅?Β». Π ΡΡΡ ΡΠ°ΠΌΠΎΠ΅ Π²ΡΠ΅ΠΌΡ ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΠΈΡΡ ΠΏΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ²Π° BuildBot.
ΠΡΠ°ΠΊ, Π½Π°Ρ Β«ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠ°Π»ΡΠ½ΡΠΉ ΠΊΠ²Π°ΡΡΠ΅ΡΒ». ΠΠ»Ρ ΡΠ΅Π±Ρ Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΠ» ΡΠ΅ΡΠ²Π΅ΡΠΊΡ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡΠ΅ΠΉ BuildBot:
- ΠΡΠΎ framework c ΠΎΡΠΊΡΡΡΡΠΌ ΠΈΡΡ ΠΎΠ΄Π½ΡΠΌ ΠΊΠΎΠ΄ΠΎΠΌ ΠΏΠΎΠ΄ Π»ΠΈΡΠ΅Π½Π·ΠΈΠ΅ΠΉ GPL
- ΠΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ python ΠΊΠ°ΠΊ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΈ ΠΎΠΏΠΈΡΠ°Π½ΠΈΡ ΡΡΠ΅Π±ΡΠ΅ΠΌΡΡ Π΄Π΅ΠΉΡΡΠ²ΠΈΠΉ
- ΠΡΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΏΠΎΠ»ΡΡΠ°ΡΡ ΠΎΡΠ²Π΅Ρ ΡΠΎ ΡΡΠΎΡΠΎΠ½Ρ ΠΌΠ°ΡΠΈΠ½Ρ, Π½Π° ΠΊΠΎΡΠΎΡΠΎΠΉ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ ΡΠ±ΠΎΡΠΊΠ°
- ΠΡΠΎ, Π½Π°ΠΊΠΎΠ½Π΅Ρ, ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΡΠ΅ ΡΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΡ ΠΊ Π₯ΠΎΡΡΡ. ΠΠ»Ρ ΡΠ°Π·Π²Π΅ΡΡΡΠ²Π°Π½ΠΈΡ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ python ΠΈ twisted, ΠΈ Π½Π΅ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ Π²ΠΈΡΡΡΠ°Π»ΡΠ½Π°Ρ ΠΌΠ°ΡΠΈΠ½Π° ΠΈ java-ΠΌΠ°ΡΠΈΠ½Π°.
2. ΠΠΎΠ½ΡΠ΅ΠΏΡΠΈΡ Π²ΠΎ Π³Π»Π°Π²Π΅ Ρ BuildMaster
Π¦Π΅Π½ΡΡΠ°Π»ΡΠ½ΠΎΠ΅ ΠΌΠ΅ΡΡΠΎ Π² Π°ΡΡ
ΠΈΡΠ΅ΠΊΡΡΡΠ΅ ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ Π·Π°Π΄Π°Ρ Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ BuildMaster. ΠΠ½ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΠΈΠ· ΡΠ΅Π±Ρ ΡΠ΅ΡΠ²ΠΈΡ, ΠΊΠΎΡΠΎΡΡΠΉ:
- ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°Π΅Ρ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π² Π΄Π΅ΡΠ΅Π²Π΅ ΠΈΡΡ ΠΎΠ΄Π½ΠΈΠΊΠΎΠ² ΠΏΡΠΎΠ΅ΠΊΡΠ°
- ΠΏΠΎΡΡΠ»Π°Π΅Ρ ΠΊΠΎΠΌΠ°Π½Π΄Ρ, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠ»Π΅Π΄ΡΠ΅Ρ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ ΡΠ΅ΡΠ²ΠΈΡΡ Worker Π΄Π»Ρ ΠΏΠΎΡΡΡΠΎΠ΅Π½ΠΈΡ ΠΏΡΠΎΠ΅ΠΊΡΠ° ΠΈ Π΅Π³ΠΎ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ
- ΡΠ²Π΅Π΄ΠΎΠΌΠ»ΡΠ΅Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ ΠΎ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ°Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½Π½ΡΡ Π΄Π΅ΠΉΡΡΠ²ΠΈΠΉ
BuildMaster ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΡΠ΅ΡΡΡ ΡΠ΅ΡΠ΅Π· ΡΠ°ΠΉΠ» master.cfg. ΠΡΠΎ ΡΠ°ΠΉΠ» Π»Π΅ΠΆΠΈΡ Π² ΠΊΠΎΡΠ½Π΅ BuildMaster. ΠΠΎΠ·ΠΆΠ΅ Ρ ΠΏΠΎΠΊΠ°ΠΆΡ, ΠΊΠ°ΠΊ ΡΡΠΎΡ ΠΊΠΎΡΠ΅Π½Ρ ΡΠΎΠ·Π΄Π°Π΅ΡΡΡ. Π‘Π°ΠΌ ΠΏΠΎ ΡΠ΅Π±Π΅ ΡΠ°ΠΉΠ» master.cfg ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ Π² ΡΠ΅Π±Π΅ python β ΡΠΊΡΠΈΠΏΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΠΈΠΉ Π²ΡΠ·ΠΎΠ²Ρ BuildBot.
Π‘Π»Π΅Π΄ΡΡΡΠΈΠΉ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ Π²Π°ΠΆΠ½ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ BuildBot ΠΈΠΌΠ΅Π΅Ρ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ Worker. ΠΡΠΎΡ ΡΠ΅ΡΠ²ΠΈΡ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π·Π°ΠΏΡΡΠ΅Π½ Π½Π° Π΄ΡΡΠ³ΠΎΠΌ Ρ ΠΎΡΡΠ΅ c Π΄ΡΡΠ³ΠΎΠΉ OS, Π° ΠΌΠΎΠΆΠ΅Ρ ΠΈ Π½Π° ΡΠΎΠΌ, Π³Π΄Π΅ BuildMaster. Π’Π°ΠΊΠΆΠ΅ ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ ΡΡΡΠ΅ΡΡΠ²ΠΎΠ²Π°ΡΡ Π² ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΠΎ Π·Π°Π³ΠΎΡΠΎΠ²Π»Π΅Π½Π½ΠΎΠΉ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΠΎΠΉ ΡΡΠ΅Π΄Π΅ ΡΠΎ ΡΠ²ΠΎΠΈΠΌΠΈ ΠΏΠ°ΠΊΠ΅ΡΠ°ΠΌΠΈ ΠΈ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠΌΠΈ. ΠΠ°Π½Π½ΡΠ΅ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΡΠ΅ ΡΡΠ΅Π΄Ρ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΠΏΡΠΈΠ³ΠΎΡΠΎΠ²Π»Π΅Π½Ρ ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ python-ΡΡΠΈΠ»ΠΈΡ Π²ΡΠΎΠ΄Π΅ vertualenv, venv.
BuildMaster ΡΡΠ°Π½ΡΠ»ΠΈΡΡΠ΅Ρ ΠΊΠΎΠΌΠ°Π½Π΄Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡ Worker-Ρ, Π° ΡΠΎΡ, Π² ΡΠ²ΠΎΡ ΠΎΡΠ΅ΡΠ΅Π΄Ρ, ΠΈΡ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ. Π’ΠΎ Π΅ΡΡΡ ΠΏΠΎΠ»ΡΡΠ°Π΅ΡΡΡ, ΡΡΠΎ ΠΏΡΠΎΡΠ΅ΡΡ ΠΏΠΎΡΡΡΠΎΠ΅Π½ΠΈΡ ΠΈ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΏΡΠΎΠ΅ΠΊΡΠ° ΠΌΠΎΠΆΠ΅Ρ ΠΈΠ΄ΡΠΈ Π½Π° Worker-Π΅ ΠΏΠΎΠ΄ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ Windows ΠΈ Π½Π° Π΄ΡΡΠ³ΠΎΠΌ Worker-Π΅ ΠΏΠΎΠ΄ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ linux.
Π‘heckout ΠΈΡΡ ΠΎΠ΄Π½ΡΡ ΠΊΠΎΠ΄ΠΎΠ² ΠΏΡΠΎΠ΅ΠΊΡΠ° ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Worker-Π΅.
3. Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ°
ΠΡΠ°ΠΊ, ΠΏΠΎΠ΅Ρ Π°Π»ΠΈ. Π ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Ρ ΠΎΡΡΠ° Ρ Π±ΡΠ΄Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Ubuntu 18.04. ΠΠ° Π½Π΅ΠΌ Ρ ΡΠ°Π·ΠΌΠ΅ΡΡ ΠΎΠ΄Π½ΠΎΠ³ΠΎ BuildMaster-a ΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Worker-a. ΠΠΎ ΡΠ½Π°ΡΠ°Π»Π° ΠΏΠΎΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ 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
Π‘Π»Π΅Π΄ΡΡΡΠΈΠΌ ΡΠ°Π³ΠΎΠΌ ΠΌΡ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΠΌ Twited ΠΈ BuildBot, Π° ΡΠ°ΠΊ ΠΆΠ΅ ΠΏΠ°ΠΊΠ΅ΡΡ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡΠΈΠ΅ Π·Π°Π΄Π΅ΠΉΡΡΠ²ΠΎΠ²Π°ΡΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠΉ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π» BuildBot-a.
/*ΠΡΠ΅ ΡΡΠΎ ΠΏΠΎΠ΄ 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
ΠΠΎΠ³Π΄Π° Π²Ρ Π·Π°ΠΏΡΡΡΠΈΡΠ΅ Worker, ΡΠΎ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΠΎΠ½ ΡΠΎΠ·Π΄Π°ΡΡ Π² /home/habr/worker ΠΏΠ°ΠΏΠΊΡ Ρ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ ΠΏΡΠΎΠ΅ΠΊΡΠ°, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠΊΠ°Π·Π°Π½ Π² master.cfg. Π Π² ΠΏΠ°ΠΏΠΎΡΠΊΠ΅ Ρ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ ΠΏΡΠΎΠ΅ΠΊΡΠ° ΠΎΠ½ ΡΠΎΠ·Π΄Π°ΡΡ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡ build, ΠΈ Π΄Π°Π»Π΅Π΅ Π² Π½Π΅Ρ Π±ΡΠ΄Π΅Ρ Π΄Π΅Π»Π°ΡΡ checkout. Π Π°Π±ΠΎΡΠΈΠΌ ΠΊΠ°ΡΠ°Π»ΠΎΠ³ΠΎΠΌ Π΄Π»Ρ Worker-Π° ΡΡΠ°Π½Π΅Ρ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡ /home/habr/yourProject/build.
Β«ΠΠΎΠ»ΠΎΡΠΎΠΉΒ» ΠΊΠ»ΡΡΠΈΠΊ
Π ΡΠ΅ΠΏΠ΅ΡΡ ΡΠΎ, ΡΠ°Π΄ΠΈ ΡΠ΅Π³ΠΎ Ρ ΠΏΠΈΡΠ°Π» ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠΈΠΉ Π°Π±Π·Π°Ρ: ΡΠΊΡΠΈΠΏΡ, ΠΊΠΎΡΠΎΡΡΠΉ Master ΠΏΠΎΡΡΠ΅Π±ΡΠ΅Ρ Ρ Worker-Π° ΡΠ΄Π΅Π»Π°ΡΡ ΡΠ΄Π°Π»Π΅Π½Π½ΠΎ Π² ΡΡΠΎΠΉ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΠΈ, Π½Π΅ Π±ΡΠ΄Π΅Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Ρ ΡΠΊΡΠΈΠΏΡΠ° Π½Π΅Ρ ΠΏΡΠ°Π² Π΄Π»Ρ Π·Π°ΠΏΡΡΠΊΠ°. Π§ΡΠΎΠ±Ρ ΠΈΡΠΏΡΠ°Π²ΠΈΡΡ ΡΠΈΡΡΠ°ΡΠΈΡ, ΠΏΠΎΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΠΊΠ»ΡΡΠΈΠΊ
BuildMaster ΠΈ Worker ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°ΡΡ ΠΌΠ΅ΠΆΠ΄Ρ ΡΠΎΠ±ΠΎΠΉ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅. Π‘Π»ΡΡΠ°Π΅ΡΡΡ, ΡΡΠΎ ΠΎΠ½ΠΎ ΠΎΠ±ΡΡΠ²Π°Π΅ΡΡΡ ΠΈ Worker Π½Π΅ΠΊΠΎΡΠΎΡΠΎΠ΅ Π²ΡΠ΅ΠΌΡ ΠΎΠΆΠΈΠ΄Π°Π΅Ρ ΠΎΡΠ²Π΅ΡΠ° ΠΎΡ BuildMaster-Π°. ΠΡΠ»ΠΈ ΠΎΡΠ²Π΅ΡΠ° Π½Π΅ ΠΏΠΎΡΠ»Π΅Π΄ΡΠ΅Ρ, ΡΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΏΠ΅ΡΠ΅Π·Π°ΠΏΡΡΠΊΠ°Π΅ΡΡΡ. ΠΠ»ΡΡ —keepalive=60 ΠΊΠ°ΠΊ ΡΠ°Π· ΠΈ Π½ΡΠΆΠ΅Π½ Π΄Π»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ ΡΠΊΠ°Π·Π°ΡΡ Π²ΡΠ΅ΠΌΡ, ΠΏΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠ²ΠΈΠΈ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ connect ΠΏΠ΅ΡΠ΅Π·Π°Π³ΡΡΠΆΠ°Π΅ΡΡΡ.
5. ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ. ΠΠΎΡΠ°Π³ΠΎΠ²ΡΠΉ ΡΠ΅ΡΠ΅ΠΏΡ
ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ BuildMaster Π²Π΅Π΄Π΅ΡΡΡ Π½Π° ΡΡΠΎΡΠΎΠ½Π΅ ΠΌΠ°ΡΠΈΠ½Ρ, Π³Π΄Π΅ ΠΌΡ Π²ΡΠΏΠΎΠ»Π½ΡΠ»ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Ρ create-master. Π Π½Π°ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ β ΡΡΠΎ ΠΊΠ°ΡΠ°Π»ΠΎΠ³ /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Β». ΠΠ°Π·Π²Π°Π½ΠΈΡ
5.2 workers
c['workers'] = [worker.Worker("example-worker", "pass")]
ΠΠ° ΡΡΠΎΡ ΡΠ°Π· ΠΌΡ ΡΠΊΠ°Π·ΡΠ²Π°Π΅ΠΌ BuildMaster-Ρ ΡΠΏΠΈΡΠΎΠΊ ΠΈΠ· Worker-ΠΎΠ². Π‘Π°ΠΌ Worker ΠΌΡ ΡΠΎΠ·Π΄Π°Π²Π°Π»ΠΈ
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 ΡΠ»ΠΎΠ²Π°ΡΡ c ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌ Π΄ΠΎΡΡΡΠΏ ΠΊ ΡΠΏΠΈΡΠΊΡ, ΠΊΡΠ΄Π° ΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΠΏΠΎΠ»ΠΎΠΆΠΈΡΡ ΠΎΠ±ΡΠ΅ΠΊΡ, ΠΎΠΏΡΠ°ΡΠΈΠ²Π°ΡΡΠΈΠΉ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ Ρ ΠΈΡΡ ΠΎΠ΄Π½ΡΠΌ ΠΊΠΎΠ΄ΠΎΠΌ ΠΏΡΠΎΠ΅ΠΊΡΠ°. Π ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Git ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΎΠΏΡΠ°ΡΠΈΠ²Π°Π΅ΡΡΡ Ρ Π½Π΅ΠΊΠΎΡΠΎΡΠΎΠΉ ΠΏΠ΅ΡΠΈΠΎΠ΄ΠΈΡΠ½ΠΎΡΡΡΡ.
ΠΠ΅ΡΠ²ΡΠΉ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΡΡΠ΅ΠΌ ΠΊ Π²Π°ΡΠ΅ΠΌΡ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ.
workdir ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΎΠ±ΠΎΠΉ ΠΏΡΡΡ ΠΊ ΠΏΠ°ΠΏΠΊΠ΅, Π³Π΄Π΅ Π½Π° ΡΡΠΎΡΠΎΠ½Π΅ Worker-Π° ΠΎΡΠ½ΠΎΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΏΡΡΠΈ /home/habr/worker/yourProject/build Π±ΡΠ΄Π΅Ρ git Ρ ΡΠ°Π½ΠΈΡΡ Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΡ Π²Π΅ΡΡΠΈΡ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ.
branch ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΡ Π²Π΅ΡΠΊΡ Π² ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΈ, Π·Π° ΠΊΠΎΡΠΎΡΠΎΠΉ ΡΠ»Π΅Π΄ΡΠ΅Ρ ΡΠ»Π΅Π΄ΠΈΡΡ.
pollInterval ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΡΠΈΡΠ»ΠΎ ΡΠ΅ΠΊΡΠ½Π΄, ΠΏΠΎ ΠΈΡΡΠ΅ΡΠ΅Π½ΠΈΡ ΠΊΠΎΡΠΎΡΡΡ BuildMaster Π±ΡΠ΄Π΅Ρ ΠΎΠΏΡΠ°ΡΠΈΠ²Π°ΡΡ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ Π½Π° Π½Π°Π»ΠΈΡΠΈΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ.
ΠΡΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°ΡΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π² ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΈ ΠΏΡΠΎΠ΅ΠΊΡΠ°.
Π‘Π°ΠΌΡΠΉ ΠΏΡΠΎΡΡΠΎΠΉ ΠΌΠ΅ΡΠΎΠ΄ β ΡΡΠΎ Polling, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠΎΠ΄ΡΠ°Π·ΡΠΌΠ΅Π²Π°Π΅Ρ, ΡΡΠΎ BuildMaster ΠΏΠ΅ΡΠΈΠΎΠ΄ΠΈΡΠ΅ΡΠΊΠΈ ΠΎΠΏΡΠ°ΡΠΈΠ²Π°Π΅Ρ ΡΠ΅ΡΠ²Π΅Ρ Ρ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠ΅ΠΌ. Π ΡΠ»ΡΡΠ°Π΅, Π΅ΡΠ»ΠΈ commit ΠΎΡΡΠ°Π·ΠΈΠ» ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π² ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΈ, ΡΠΎ BuildMaster Ρ Π½Π΅ΠΊΠΎΡΠΎΡΠΎΠΉ Π·Π°Π΄Π΅ΡΠΆΠΊΠΎΠΉ ΡΠΎΠ·Π΄Π°ΡΡ Π²Π½ΡΡΡΠ΅Π½Π½ΠΈΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ Change ΠΈ Π½Π°ΠΏΡΠ°Π²ΠΈΡ Π΅Π³ΠΎ Π² ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΡΠΎΠ±ΡΡΠΈΠΉ Scheduler, ΠΊΠΎΡΠΎΡΡΠΉ ΠΈ Π·Π°ΠΏΡΡΡΠΈΡ ΡΠ°Π³ΠΈ ΠΏΠΎ ΡΠ±ΠΎΡΠΊΠ΅ ΠΈ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΏΡΠΎΠ΅ΠΊΡΠ° Π½Π° Worker-Π΅. Π‘ΡΠ΅Π΄ΠΈ ΡΡΠΈ ΡΠ°Π³ΠΎΠ² Π±ΡΠ΄Π΅Ρ ΡΠΊΠ°Π·Π°Π½ update ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ. ΠΠΌΠ΅Π½Π½ΠΎ Π½Π° Worker-Π΅ ΡΠΎΠ·Π΄Π°ΡΡΡΡ Π»ΠΎΠΊΠ°Π»ΡΠ½Π°Ρ ΠΊΠΎΠΏΠΈΡ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ. ΠΠ΅ΡΠ°Π»ΠΈ ΡΡΠΎΠ³ΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠ° Π±ΡΠ΄ΡΡ ΡΠ°ΡΠΊΡΡΡΡ Π½ΠΈΠΆΠ΅ Π² ΡΠ»Π΅Π΄ΡΡΡΠΈΡ
Π΄Π²ΡΡ
ΡΠ°Π·Π΄Π΅Π»Π°Ρ
(
ΠΡΠ΅ Π±ΠΎΠ»Π΅Π΅ ΠΈΠ·ΡΡΠ½ΡΠΌ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠΌ ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°Π½ΠΈΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π² ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΈ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΡΡΠΌΠ°Ρ ΠΎΡΠΏΡΠ°Π²ΠΊΠ° ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ ΠΎΡ ΡΠ΅ΡΠ²Π΅ΡΠ°, Π½Π° ΠΊΠΎΡΠΎΡΠΎΠΌ ΠΎΠ½ ΡΠ°Π·ΠΌΠ΅ΡΠ΅Π½, ΠΊ BuildMaster-Ρ ΠΎΠ± ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ ΠΈΡΡ ΠΎΠ΄Π½ΡΡ ΠΊΠΎΠ΄ΠΎΠ² ΠΏΡΠΎΠ΅ΠΊΡΠ°. Π ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅, ΠΊΠ°ΠΊ ΡΠΎΠ»ΡΠΊΠΎ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΡΠ΄Π΅Π»Π°Π΅Ρ commit, ΡΠ΅ΡΠ²Π΅Ρ Ρ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠ΅ΠΌ ΠΏΡΠΎΠ΅ΠΊΡΠ° ΠΏΠΎΡΠ»Π΅Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ BuildMaster-Ρ. Π ΡΠΎΡ, Π² ΡΠ²ΠΎΡ ΠΎΡΠ΅ΡΠ΅Π΄Ρ, Π΅Π³ΠΎ ΠΏΠ΅ΡΠ΅Ρ Π²Π°ΡΠΈΡ ΡΠΎΠ·Π΄Π°Π² ΠΎΠ±ΡΠ΅ΠΊΡ PBChangeSource. ΠΠ°Π»Π΅Π΅ ΡΡΠΎΡ ΠΎΠ±ΡΠ΅ΠΊΡ Π±ΡΠ΄Π΅Ρ ΠΏΠ΅ΡΠ΅Π΄Π°Π½ Π² Scheduler, ΠΊΠΎΡΠΎΡΡΠΉ ΠΈ Π°ΠΊΡΠΈΠ²ΠΈΡΡΠ΅Ρ ΡΠ°Π³ΠΈ ΠΏΠΎ ΡΠ±ΠΎΡΠΊΠ΅ ΠΏΡΠΎΠ΅ΠΊΡΠ° ΠΈ Π΅Π³ΠΎ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ. ΠΠ°ΠΆΠ½Π°Ρ ΡΠ°ΡΡΡ ΡΡΠΎΠ³ΠΎ ΡΠΏΠΎΡΠΎΠ±Π° ΡΡΠ° ΡΠ°Π±ΠΎΡΠ° Ρ hook-ΡΠΊΡΠΈΠΏΡΠ°ΠΌΠΈ ΡΠ΅ΡΠ²Π΅ΡΠ° Π² ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΈ. Π ΡΠΊΡΠΈΠΏΡΠ΅ hook-Π°, ΠΎΡΠ²Π΅ΡΠ°ΡΡΠ΅Π³ΠΎ Π·Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΡ Π΄Π΅ΠΉΡΡΠ²ΠΈΠΉ ΠΏΡΠΈ commit-Π΅, Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π²ΡΠ·Π²Π°ΡΡ ΡΡΠΈΠ»ΠΈΡΡ sendchange ΠΈ ΡΠΊΠ°Π·Π°ΡΡ ΡΠ΅ΡΠ΅Π²ΠΎΠΉ Π°Π΄ΡΠ΅Ρ BuildMaster-Π°. Π£ΠΊΠ°Π·Π°ΡΡ Π½ΡΠΆΠ½ΠΎ ΠΈ ΡΠ΅ΡΠ΅Π²ΠΎΠΉ ΠΏΠΎΡΡ, ΠΊΠΎΡΠΎΡΡΠΉ Π±ΡΠ΄Π΅Ρ ΡΠ»ΡΡΠ°ΡΡ PBChangeSource. PBChangeSource, ΠΊΡΡΠ°ΡΠΈ, ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠ°ΡΡΡΡ BuildMaster-Π°. ΠΡΠΎ ΠΌΠ΅ΡΠΎΠ΄ ΠΏΠΎΡΡΠ΅Π±ΡΠ΅Ρ ΠΏΡΠ°Π²Π° admin-a Π½Π° ΡΠ΅ΡΠ²Π΅ΡΠ΅, Π³Π΄Π΅ ΡΠ°ΡΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ ΠΏΡΠΎΠ΅ΠΊΡΠ°. ΠΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΏΠΎΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΡΠ΄Π΅Π»Π°ΡΡ backup ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ.
5.4 shedulers
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"]))
schedulers β ΡΡΠΎ ΡΠ»Π΅ΠΌΠ΅Π½Ρ, ΠΊΠΎΡΠΎΡΡΠΉ Π²ΡΡΡΡΠΏΠ°Π΅Ρ ΡΡΠΈΠ³Π³Π΅ΡΠΎΠΌ, Π·Π°ΠΏΡΡΠΊΠ°ΡΡΠΈΠΌ Π²ΡΡ ΡΠ΅ΠΏΠΎΡΠΊΡ ΡΠ±ΠΎΡΠΊΠΈ ΠΈ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΏΡΠΎΠ΅ΠΊΡΠ°.
Π’Π΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ, ΠΊΠΎΡΠΎΡΡΠ΅ Π±ΡΠ»ΠΈ Π·Π°ΡΠΈΠΊΡΠΈΡΠΎΠ²Π°Π½Ρ change_source, ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π»ΠΈΡΡ Π² ΠΏΡΠΎΡΠ΅ΡΡΠ΅ ΡΠ°Π±ΠΎΡΡ BuildBot-a Π² ΠΎΠ±ΡΠ΅ΠΊΡ Change ΠΈ ΡΠ΅ΠΏΠ΅ΡΡ ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ Sheduler Π½Π° ΠΈΡ
ΠΎΡΠ½ΠΎΠ²Π΅ ΡΡΡΠΎΠΈΡ Π·Π°ΠΏΡΠΎΡΡ Π½Π° Π·Π°ΠΏΡΡΠΊ ΠΏΡΠΎΡΠ΅ΡΡΠ° ΡΠ±ΠΎΡΠΊΠΈ ΠΏΡΠΎΠ΅ΠΊΡΠ°. ΠΠ΄Π½Π°ΠΊΠΎ ΠΎΠ½ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ ΠΈ ΡΠΎ, ΠΊΠΎΠ³Π΄Π° ΡΡΠΈ Π·Π°ΠΏΡΠΎΡΡ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ Π΄Π°Π»ΡΡΠ΅ Π² ΠΎΡΠ΅ΡΠ΅Π΄Ρ. ΠΠ±ΡΠ΅ΠΊΡ
ΠΡ Π²ΠΈΠ΄ΠΈΠΌ, ΡΡΠΎ Π² ΡΠ΅ΠΊΡΡΠ΅ΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΡΠ°ΠΊΠΈΡ
schedulers ΡΠΎΠ·Π΄Π°Π΅ΡΡΡ 2 ΡΡΡΠΊΠΈ. ΠΡΠΈΡΠ΅ΠΌ, ΠΊΠ°ΠΆΠ΄Π°Ρ ΠΈΠΌΠ΅Π΅Ρ ΡΠ²ΠΎΠΉ ΡΠΈΠΏ.
SingleBranchScheduler β ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΡΠ°ΠΌΡΡ ΠΏΠΎΠΏΡΠ»ΡΡΠ½ΡΡ ΠΊΠ»Π°ΡΡΠΎΠ² ΡΠ°ΡΠΏΠΈΡΠ°Π½ΠΈΡ. ΠΠ½ Π½Π°Π±Π»ΡΠ΄Π°Π΅Ρ Π·Π° ΠΎΠ΄Π½ΠΎΠΉ Π²Π΅ΡΠΊΠΎΠΉ ΠΈ ΡΡΠ°Π±Π°ΡΡΠ²Π°Π΅Ρ ΠΏΠΎ Π·Π°ΡΠΈΠΊΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠΌΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π² Π½Π΅ΠΉ. ΠΠΎΠ³Π΄Π° ΠΎΠ½ Π²ΠΈΠ΄ΠΈΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ, ΡΠΎ ΠΌΠΎΠΆΠ΅Ρ ΠΎΡΠ»ΠΎΠΆΠΈΡΡ ΠΎΡΠΏΡΠ°Π²ΠΊΡ Π·Π°ΠΏΡΠΎΡΠ° Π½Π° ΠΏΠΎΡΡΡΠΎΠ΅Π½ΠΈΠ΅ (ΠΎΡΠ»ΠΎΠΆΠΈΡΡ Π½Π° ΠΏΠ΅ΡΠΈΠΎΠ΄, ΡΠΊΠ°Π·Π°Π½Π½ΡΠΉ Π² ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΠΎΠΌ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ΅ treeStableTimer). Π name Π·Π°Π΄Π°Π΅ΡΡΡ ΠΈΠΌΡ ΡΠ°ΡΠΏΠΈΡΠ°Π½ΠΈΡ, ΠΊΠΎΡΠΎΡΠΎΠ΅ Π±ΡΠ΄Π΅Ρ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°ΡΡΡΡ Π² BuildBot-web-ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ΅. Π ChangeFilter Π·Π°Π΄Π°Π΅ΡΡΡ ΡΠΈΠ»ΡΡΡ, ΠΏΡΠΎΠΉΠ΄Ρ ΠΊΠΎΡΠΎΡΡΠΉ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π² Π²Π΅ΡΠΊΠ΅ ΠΏΠΎΠ±ΡΠΆΠ΄Π°ΡΡ ΡΠ°ΡΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΠΏΠΎΡΠ»Π°ΡΡ Π·Π°ΠΏΡΠΎΡ Π½Π° ΠΏΠΎΡΡΡΠΎΠ΅Π½ΠΈΠ΅. Π builderNames ΡΠΊΠ°Π·ΡΠ²Π°Π΅ΡΡΡ ΠΈΠΌΡ builder-a, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΌΡ Π·Π°Π΄Π°Π΄ΠΈΠΌ ΡΡΡΡ ΠΏΠΎΠ·ΠΆΠ΅. ΠΠΌΡ Π² Π½Π°ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ Π±ΡΠ΄Π΅Ρ ΡΠΎ ΠΆΠ΅, ΡΡΠΎ ΠΈ ΠΈΠΌΡ ΠΏΡΠΎΠ΅ΠΊΡΠ°: yourProject.
ForceScheduler Π²Π΅ΡΡΠΌΠ° ΠΏΡΠΎΡΡΠ°Ρ ΡΡΡΠΊΠ°. ΠΡΠΎΡ Π²ΠΈΠ΄ ΡΠ°ΡΠΏΠΈΡΠ°Π½ΠΈΡ ΡΡΠ°Π±Π°ΡΡΠ²Π°Π΅Ρ ΠΏΠΎ ΡΠ΅Π»ΡΠΊΡ ΠΌΡΡΠΈ ΡΠ΅ΡΠ΅Π· BuildBot-web-ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ. ΠΠ°ΡΠ°ΠΌΠ΅ΡΡΡ ΠΈΠΌΠ΅ΡΡ ΡΡ ΠΆΠ΅ ΡΡΡΡ, ΡΡΠΎ ΠΈ Π² SingleBranchScheduler.
P.S. β3. ΠΠ΄ΡΡΠ³ ΠΏΡΠΈΠ³ΠΎΠ΄ΠΈΡΡΡ
Periodic β ΡΡΠΎ ΡΠ°ΡΠΏΠΈΡΠ°Π½ΠΈΠ΅, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΡΡΠ°Π±Π°ΡΡΠ²Π°Π΅Ρ Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ ΡΠΈΠΊΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠΉ ΠΏΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΠΏΠ΅ΡΠΈΠΎΠ΄ΠΈΡΠ½ΠΎΡΡΡΡ. ΠΡΠ³Π»ΡΠ΄ΠΈΡ Π²ΡΠ·ΠΎΠ² Π΅Π³ΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ ΡΠ°ΠΊ
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 ΡΠΎΠ·Π΄Π°Π΅Ρ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΠΉ build, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠΎΡΠΎΠΌ builder ΠΎΡΡΡΠ»Π°Π΅Ρ Π½Π° Worker. Π BuildFactory ΡΠΊΠ°Π·ΡΠ²Π°ΡΡΡΡ ΡΠ°Π³ΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠ»Π΅Π΄ΡΠ΅Ρ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ Worker-Ρ. Π¨Π°Π³ΠΈ Π΄ΠΎΠ±Π°Π²Π»ΡΡΡΡΡ ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ Π²ΡΠ·ΠΎΠ²Π° ΠΌΠ΅ΡΠΎΠ΄Π° addStep
ΠΠ΅ΡΠ²ΡΠΉ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π½ΡΠΉ ΡΠ°Π³ Π² ΡΡΠΎΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ β git clean -d -f -f βx, Π·Π°ΡΠ΅ΠΌ git checkout. ΠΡΠΈ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ Π·Π°Π»ΠΎΠΆΠ΅Π½Ρ Π² ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ΅ method, ΠΊΠΎΡΠΎΡΡΠΉ Π½Π°Π³Π»ΡΠ΄Π½ΠΎ Π½Π΅ ΡΠΊΠ°Π·Π°Π½, Π½ΠΎ ΠΏΠΎΠ΄ΡΠ°Π·ΡΠΌΠ΅Π²Π°Π΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ fresh. ΠΠ°ΡΠ°ΠΌΠ΅ΡΡ mode=’incremental’ Π³ΠΎΠ²ΠΎΡΠΈΡ ΠΎ ΡΠΎΠΌ, ΡΡΠΎ ΡΠ°ΠΉΠ»Ρ ΠΈΠ· Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΠΈ, ΠΊΡΠ΄Π° Π΄Π΅Π»Π°Π΅ΡΡΡ chechout, ΠΏΡΠΈ ΡΡΠΎΠΌ ΠΎΡΡΡΡΡΡΠ²ΡΡΡΠΈΠ΅ Π² ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΈ, ΠΎΡΡΠ°ΡΡΡΡ Π½Π΅ΡΡΠΎΠ½ΡΡΡΠΌΠΈ.
ΠΡΠΎΡΠΎΠΉ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π½ΡΠΉ ΡΠ°Π³ β ΡΡΠΎ Π²ΡΠ·ΠΎΠ² ΡΠΊΡΠΈΠΏΡΠ° trial c ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠΌ hello Π½Π° ΡΡΠΎΡΠΎΠ½Π΅ Worker-Π° ΠΈΠ· Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΠΈ /home/habr/worker/yourProject/build c ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ PATHONPATH=β¦ Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΠΈΡΠ°ΡΡ ΡΠ²ΠΎΠΈ ΡΠΊΡΠΈΠΏΡΡ ΠΈ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ ΠΈΡ Π½Π° ΡΡΠΎΡΠΎΠ½Π΅ Worker-a ΡΠ΅ΡΠ΅Π· ΡΠ°Π³ util.ShellCommand. ΠΠ°Π½Π½ΡΠ΅ ΡΠΊΡΠΈΠΏΡΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΠΎΠΆΠΈΡΡ ΠΏΡΡΠΌΠΎ Π² ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ. Π’ΠΎΠ³Π΄Π° ΠΏΡΠΈ chechout-Π΅ ΠΎΠ½ΠΈ Π±ΡΠ΄ΡΡ ΠΏΠΎΠΏΠ°Π΄Π°ΡΡ Π² /home/habr/worker/yourProject/build. ΠΠ΄Π½Π°ΠΊΠΎ ΡΠΎΠ³Π΄Π° Π΅ΡΡΡ Π΄Π²Π° Β«Π½ΠΎΒ»:
- Worker Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ ΡΠΎΠ·Π΄Π°Π½ Ρ ΠΊΠ»ΡΡΠ΅ΠΌ
—umask Π΄Π»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ ΠΎΠ½ Π½Π΅ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π» ΠΏΡΠ°Π²Π° Π½Π° Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΏΠΎΡΠ»Π΅ checkout-a. - ΠΡΠΈ git push-Π΅ ΡΡΠΈΡ ΡΠΊΡΠΈΠΏΡΠΎΠ² Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΊΠ°Π·Π°ΡΡ ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ exacutable, ΡΡΠΎΠ±Ρ ΠΏΠΎΡΠΎΠΌ ΠΏΡΠΈ chechout-e ΠΏΡΠ°Π²Π° Π½Π° Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΡΠΊΡΠΈΠΏΡΠ° Git Π½Π΅ ΠΏΠΎΡΠ΅ΡΡΠ».
5.6 builders
c['builders'] = []
c['builders'].append(util.BuilderConfig(name="runtests",
workernames=["example-worker"],
factory=factory))
Π ΡΠΎΠΌ, ΡΡΠΎ ΡΠ°ΠΊΠΎΠ΅ Builder Π±ΡΠ»ΠΎ ΡΠ°ΡΡΠΊΠ°Π·Π°Π½ΠΎ
c['builders'] = []
c['builders'].append(util.BuilderConfig(name="yourProject",
workernames=["yourWorkerName"],
factory=factory))
Π’Π΅ΠΏΠ΅ΡΡ ΡΠ°ΡΠΊΠ°ΠΆΡ ΠΎ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ°Ρ BuilderConfig.
name Π·Π°Π΄Π°Π΅Ρ ΠΈΠΌΡ builder-a. ΠΠ΄Π΅ΡΡ ΠΌΡ Π½Π°Π·Π²Π°Π»ΠΈ Π΅Π³ΠΎ yourProject. ΠΡΠΎ Π·Π½Π°ΡΠΈΡ, ΡΡΠΎ Π½Π° Worker-Π΅ Π±ΡΠ΄Π΅Ρ ΡΠΎΠ·Π΄Π°Π½ ΡΡΠΎΡ ΡΠ°ΠΌΡΠΉ ΠΏΡΡΡ /home/habr/worker/yourProject/build. Sheduler ΠΎΡΡΡΠΊΠΈΠ²Π°Π΅Ρ builder ΠΊΠ°ΠΊ ΡΠ°Π· ΠΏΠΎ ΡΡΠΎΠΌΡ ΠΈΠΌΠ΅Π½ΠΈ.
workernames ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ Π»ΠΈΡΡ Worker-ΠΎΠ². ΠΠ°ΠΆΠ΄ΡΠΉ ΠΈΠ· ΠΊΠΎΡΠΎΡΡΡ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π½ Π² c[‘workers’].
factory β ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΠΉ build, Ρ ΠΊΠΎΡΠΎΡΡΠΌ Π°ΡΡΠΎΡΠΈΠΈΡΠΎΠ²Π°Π½ builder. ΠΠ½ ΠΏΠΎΡΠ»Π΅Ρ ΠΎΠ±ΡΠ΅ΠΊΡ build Π½Π° Worker Π΄Π»Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π²ΡΠ΅Ρ ΡΠ°Π³ΠΎΠ², Π²Ρ ΠΎΠ΄ΡΡΠΈΡ Π² ΡΠΎΡΡΠ°Π² ΡΡΠΎΠ³ΠΎ build-a.
6. ΠΡΠΈΠΌΠ΅Ρ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎΠΉ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ
ΠΠΎΡ Π°ΡΡ
ΠΈΡΠ΅ΠΊΡΡΡΠ° ΠΏΡΠΈΠΌΠ΅ΡΠ° ΠΏΡΠΎΠ΅ΠΊΡΠ°, ΠΊΠΎΡΠΎΡΡΡ Ρ ΠΏΡΠ΅Π΄Π»Π°Π³Π°Ρ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ ΡΠ΅ΡΠ΅Π· BuildBot
.
Π ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΡΠΈΡΡΠ΅ΠΌΡ ΠΊΠΎΠ½ΡΡΠΎΠ»Ρ Π²Π΅ΡΡΠΈΡΠΌΠΈ Π±ΡΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ svn. Π‘Π°ΠΌ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ Π±ΡΠ΄Π΅Ρ Π½Π°Ρ
ΠΎΠ΄ΠΈΡΡΡ Π² Π½Π΅ΠΊΠΎΠ΅ΠΌ ΠΎΠ±Π»Π°ΠΊΠ΅. ΠΠΎΡ Π°Π΄ΡΠ΅Ρ ΡΡΠΎΠ³ΠΎ ΠΎΠ±Π»Π°ΠΊΠ°
BuildMaster ΠΈ Worker ΡΠ°Π±ΠΎΡΠ°ΡΡ Π½Π° ΠΎΠ΄Π½ΠΎΠΌ Ρ ΠΎΡΡΠ΅ project.host .BuildMaster Ρ ΡΠ°Π½ΠΈΡ ΡΠ²ΠΎΠΈ ΡΠ°ΠΉΠ»Ρ Π² ΠΏΠ°ΠΏΠΊΠ΅ /home/habr/master. Worker ΠΆΠ΅ Ρ ΡΠ°Π½ΠΈΡ ΠΏΠΎ ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΌΡ ΠΏΡΡΠΈ /home/habr/worker. Π‘Π²ΡΠ·Ρ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ² BuildMaster-Π° ΠΈ Worker-Π° Π²Π΅Π΄Π΅ΡΡΡ ΡΠ΅ΡΠ΅Π· 4000 ΠΏΠΎΡΡ ΠΏΠΎ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Ρ BuildBot-a, ΡΠΎ Π΅ΡΡΡ ‘pb’ ΠΏΡΠΎΡΠΎΠΊΠΎΠ».
Π¦Π΅Π»Π΅Π²ΠΎΠΉ ΠΏΡΠΎΠ΅ΠΊΡ ΡΠ΅Π»ΠΈΠΊΠΎΠΌ Π½Π°ΠΏΠΈΡΠ°Π½ Π½Π° python-Π΅. ΠΠ°Π΄Π°ΡΠ° ΠΎΡΡΠ»Π΅Π΄ΠΈΡΡ Π΅Π³ΠΎ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ, ΡΠΎΠ·Π΄Π°ΡΡ executable ΡΠ°ΠΉΠ», ΡΠ³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°ΡΡ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ, ΠΏΡΠΎΠ²Π΅ΡΡΠΈ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅. Π ΡΠ»ΡΡΠ°Π΅ failure Π½ΡΠΆΠ½ΠΎ Π²ΡΠ΅ΠΌ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ°ΠΌ ΠΎΡΠΎΡΠ»Π°ΡΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ Π½Π° ΠΏΠΎΡΡΡ ΠΎ ΡΠΎΠΌ, ΡΡΠΎ Π΅ΡΡΡ Π½Π΅ΡΠ΄Π°ΡΠ½ΠΎ Π²ΡΠΏΠΎΠ»Π½Π΅Π½Π½ΠΎΠ΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅.
Web ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ BuildBot ΠΌΡ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠΈΠΌ Π½Π° 80 ΠΏΠΎΡΡ Π΄Π»Ρ project.host. Apatch ΡΡΠ°Π²ΠΈΡΡ Π½Π΅ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ. Π ΡΠΎΡΡΠ°Π²Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ twisted ΡΠΆΠ΅ ΠΏΡΠΈΡΡΡΡΡΠ²ΡΠ΅Ρ web ΡΠ΅ΡΠ²Π΅Ρ, BuildBot Π΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ.
ΠΠ»Ρ Ρ ΡΠ°Π½Π΅Π½ΠΈΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ Π²Π½ΡΡΡΠ΅Π½Π½Π΅Π³ΠΎ Π½Π°Π·Π½Π°ΡΠ΅Π½ΠΈΡ Π΄Π»Ρ BuildBot Π±ΡΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ sqlite.
ΠΠ»Ρ ΠΏΠΎΡΡΠΎΠ²ΠΎΠΉ ΡΠ°ΡΡΡΠ»ΠΊΠΈ Π½ΡΠΆΠ΅Π½ Ρ ΠΎΡΡ smtp.your.domain β Π½Π° Π½Π΅ΠΌ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½Π° ΠΎΡΠΏΡΠ°Π²ΠΊΠ° ΠΏΠΈΡΠ΅ΠΌ Ρ ΠΏΠΎΡΡΡ [email protected] Π±Π΅Π· Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ. Π’Π°ΠΊ ΠΆΠ΅ Π½Π° Ρ ΠΎΡΡΠ΅ βsmtp β ΠΏΡΠΎΡΠΎΠΊΠΎΠ» ΡΠ»ΡΡΠ°Π΅ΡΡΡ Π½Π° ΠΏΠΎΡΡΡ 1025.
ΠΠ°Π΄Π΅ΠΉΡΡΠ²ΠΎΠ²Π°Π½Π½ΡΡ Π»ΠΈΡ Π² ΠΏΡΠΎΡΠ΅ΡΡΠ΅ Π΄Π²ΠΎΠ΅: admin ΠΈ user. admin Π°Π΄ΠΌΠΈΠ½ΠΈΡΡΡΠΈΡΡΠ΅Ρ BuildBot. user ΡΠ²Π»ΡΠ΅ΡΡΡ Π»ΠΈΡΠΎΠΌ, ΡΠΎΠ²Π΅ΡΡΠ°ΡΡΠΈΠΌ commit-Ρ.
Exacutable ΡΠ°ΠΉΠ» Π³Π΅Π½Π΅ΡΠΈΡΡΠ΅ΡΡΡ ΡΠ΅ΡΠ΅Π· pyinstaller. ΠΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ Π³Π΅Π½Π΅ΡΠΈΡΡΠ΅ΡΡΡ ΡΠ΅ΡΠ΅Π· doxygen.
ΠΠ»Ρ Π΄Π°Π½Π½ΠΎΠΉ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΡ Ρ Π½Π°ΠΏΠΈΡΠ°Π» Π²ΠΎΡ ΡΠ°ΠΊΠΎΠΉ 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
ΠΠ°ΡΠ΅ΠΌ Π·Π°ΠΏΡΡΡΠΈΡΡ ΡΠ»ΡΠΆΠ±Ρ Worker-a
buildbot-worker start /home/habr/worker
ΠΠΎΡΠΎΠ²ΠΎ! Π’Π΅ΠΏΠ΅ΡΡ Buildbot Π±ΡΠ΄Π΅Ρ ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°ΡΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ ΠΈ ΡΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ ΠΏΠΎ commit-Ρ Π² svn, Π²ΡΠΏΠΎΠ»Π½ΡΡ ΡΠ°Π³ΠΈ ΡΠ±ΠΎΡΠΊΠΈ ΠΈ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΏΡΠΎΠ΅ΠΊΡΠ° Ρ Π²ΡΡΠ΅ΡΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠΎΠΉ.
ΠΠΈΠΆΠ΅ Ρ ΡΠ°ΡΠΏΠΈΡΡ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡΠΈ Π²ΡΡΠ΅ΡΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ master.cfg.
6.1 ΠΠ° ΠΏΡΡΠΈ ΠΊ ΡΠ²ΠΎΠ΅ΠΌΡ master.cfg
ΠΠΎ Π²ΡΠ΅ΠΌΡ Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΡ ΡΠ²ΠΎΠ΅Π³ΠΎ master.cfg Π±ΡΠ΄Π΅Ρ ΡΠΎΠ²Π΅ΡΡΠ΅Π½ΠΎ Π½Π΅ΠΌΠ°Π»ΠΎ ΠΎΡΠΈΠ±ΠΎΠΊ, ΠΏΠΎΡΠΎΠΌΡ ΠΏΠΎΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΡΡΠ΅Π½ΠΈΠ΅ log-ΡΠ°ΠΉΠ»Π°. ΠΠ½ Ρ
ΡΠ°Π½ΠΈΡΡΡΡ ΠΊΠ°ΠΊ Π½Π° BuildMaster-e c Π°Π±ΡΠΎΠ»ΡΡΠ½ΡΠΌ ΠΏΡΡΠ΅ΠΌ /home/habr/master/twistd.log, ΡΠ°ΠΊ ΠΈ Π½Π° ΡΡΠΎΡΠΎΠ½Π΅ Worker-a Ρ Π°Π±ΡΠΎΠ»ΡΡΠ½ΡΠΌ ΠΏΡΡΠ΅ΠΌ /home/habr/worker/twistd.log. ΠΠΎ ΠΌΠ΅ΡΠ΅ ΡΡΠ΅Π½ΠΈΡ ΠΎΡΠΈΠ±ΠΊΠΈ ΠΈ Π΅Π΅ ΠΈΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΏΠΎΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΠΏΠ΅ΡΠ΅Π·Π°Π³ΡΡΠ·ΠΊΠ° ΡΠ»ΡΠΆΠ±Ρ BuildMaster-a. ΠΠΎΡ ΠΊΠ°ΠΊ ΡΡΠΎ Π΄Π΅Π»Π°Π΅ΡΡΡ:
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 ΠΎΠ±ΡΠ°ΡΠ°Π΅ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΊ Π²Π΅ΡΠΊΠ΅ trunk. ΠΠ°Π³Π°Π΄ΠΎΡΠ½ΡΠΉ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ split_file=util.svn.split_file_alwaystrunk Π·Π°Π΄Π°Π΅Ρ ΠΏΡΠ°Π²ΠΈΠ»Π°: ΠΊΠ°ΠΊ ΡΠ°Π·Π±ΠΈΠ²Π°ΡΡ ΡΡΡΡΠΊΡΡΡΡ ΠΏΠ°ΠΏΠΎΠΊ svn Π½Π° Π²Π΅ΡΠΊΠΈ. ΠΠ½ ΠΆΠ΅ ΠΏΡΠ΅Π΄Π»Π°Π³Π°Π΅Ρ ΠΈΠΌ ΠΎΡΠ½ΠΎΡΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ ΠΏΡΡΠΈ. Π ΡΠ²ΠΎΡ ΠΎΡΠ΅ΡΠ΅Π΄Ρ split_file_alwaystrunk ΡΠΏΡΠΎΡΠ°Π΅Ρ ΠΏΡΠΎΡΠ΅ΡΡ, Π³ΠΎΠ²ΠΎΡΡ ΠΎ ΡΠΎΠΌ, ΡΡΠΎ Π² ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΈ ΡΠΎΠ»ΡΠΊΠΎ trunk.
Π Schedulers ΡΠΊΠ°Π·ΡΠ²Π°Π΅ΡΡΡ ChangeFilter, ΠΊΠΎΡΠΎΡΡΠΉ Π²ΠΈΠ΄ΠΈΡ None ΠΈ Π°ΡΡΠΎΡΠΈΠΈΡΡΠ΅Ρ Ρ Π½ΠΈΠΌ Π²Π΅ΡΠΊΡ trunk ΠΏΠΎ Π·Π°Π΄Π°Π½Π½ΠΎΠΉ Π°ΡΡΠΎΡΠΈΠ°ΡΠΈΠΈ ΡΠ΅ΡΠ΅Π· split_file_alwaystrunk. Π Π΅Π°Π³ΠΈΡΡΡ Π½Π° ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π² trunk, Π·Π°ΠΏΡΡΠΊΠ°Π΅Ρ builder c ΠΈΠΌΠ΅Π½Π΅ΠΌ yourProject.
properties Π·Π΄Π΅ΡΡ Π½ΡΠΆΠ΅Π½ Π΄Π»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ Π°Π΄ΠΌΠΈΠ½ ΠΏΠΎΠ»ΡΡΠ°Π» ΡΠ°ΡΡΡΠ»ΠΊΡ Ρ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ°Ρ ΡΠ±ΠΎΡΠΊΠΈ ΠΈ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΊΠ°ΠΊ Π²Π»Π°Π΄Π΅Π»Π΅Ρ ΠΏΡΠΎΡΠ΅ΡΡΠ°.
Π¨Π°Π³ build-a checkout ΡΠΏΠΎΡΠΎΠ±Π΅Π½ Π΄Π΅Π»Π°ΡΡ ΠΏΠΎΠ»Π½ΠΎΠ΅ ΡΠ΄Π°Π»Π΅Π½ΠΈΠ΅ Π»ΡΠ±ΡΡ ΡΠ°ΠΉΠ»ΠΎΠ², Π»Π΅ΠΆΠ°ΡΠΈΡ Π² Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎΠΉ Π²Π΅ΡΡΠΈΠΈ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ Worker-Π°. A Π·Π°ΡΠ΅ΠΌ Π΄Π΅Π»Π°ΡΡ ΠΏΠΎΠ»Π½ΡΠΉ svn update. Π Π΅ΠΆΠΈΠΌ Π½Π°ΡΡΡΠΎΠ΅Π½ ΡΠ΅ΡΠ΅Π· ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ mode=full, method=fresh. ΠΠ°ΡΠ°ΠΌΠ΅ΡΡ haltOnTailure Π³ΠΎΠ²ΠΎΡΠΈΡ ΠΎ ΡΠΎΠΌ, ΡΡΠΎ Π΅ΡΠ»ΠΈ svn update Π±ΡΠ΄Π΅Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ Ρ ΠΎΡΠΈΠ±ΠΊΠΎΠΉ, ΡΠΎ Π²Π΅ΡΡ ΠΏΡΠΎΡΠ΅ΡΡ ΡΠ±ΠΎΡΠΊΠΈ ΠΈ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΏΡΠΈΠΎΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ, ΡΠ°ΠΊ ΠΊΠ°ΠΊ Π΄Π°Π»ΡΠ½Π΅ΠΉΡΠΈΠ΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ Π½Π΅ ΠΈΠΌΠ΅ΡΡ ΡΠΌΡΡΠ»Π°.
6.3 ΠΠ°ΠΌ ΠΏΠΈΡΡΠΌΠΎ: reporters ΡΠΏΠΎΠ»Π½ΠΎΠΌΠΎΡΠ΅Π½ Π·Π°ΡΠ²ΠΈΡΡ
reporters β ΡΡΠΎ ΡΠ΅ΡΠ²ΠΈΡ ΡΠ°ΡΡΡΠ»ΠΊΠΈ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉ Π½Π° ΠΏΠΎΡΡΡ.
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 β Π°Π΄ΡΠ΅Ρ, Ρ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ Π²ΡΠ΅ΠΌ Π±ΡΠ΄Π΅Ρ ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΡΡ ΡΠ°ΡΡΡΠ»ΠΊΠ°.
sendToInterestedUsers=True ΠΎΡΡΡΠ»Π°Π΅Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ Π²Π»Π°Π΄Π΅Π»ΡΡΡ ΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠ΄Π΅Π»Π°Π» commit.
lookup β ΡΡΡΡΠΈΠΊΡ, ΠΊΠΎΡΠΎΡΡΠΉ Π½Π°Π΄ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΠΊ ΠΈΠΌΠ΅Π½Π°ΠΌ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ, ΠΏΠΎΠ»ΡΡΠ°ΡΡΠΈΠΌ ΡΠ°ΡΡΡΠ»ΠΊΡ. Π’Π°ΠΊ admin ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΏΠΎΠ»ΡΡΠΈΡ ΡΠ°ΡΡΡΠ»ΠΊΡ ΠΏΠΎ Π°Π΄ΡΠ΅ΡΡ [email protected].
relayhost Π·Π°Π΄Π°Π΅Ρ ΠΈΠΌΡ Ρ ΠΎΡΡΠ°, Π½Π° ΠΊΠΎΡΠΎΡΠΎΠΌ ΠΎΡΠΊΡΡΡ ΡΠ΅ΡΠ²Π΅Ρ smtp, a smptPort Π·Π°Π΄Π°Π΅Ρ Π½ΠΎΠΌΠ΅Ρ ΠΏΠΎΡΡΠ° ΠΊΠΎΡΠΎΡΡΠΉ ΡΠ»ΡΡΠ°Π΅Ρ smtp ΡΠ΅ΡΠ²Π΅Ρ.
mode=Β«warningΒ» Π³ΠΎΠ²ΠΎΡΠΈΡ, ΡΡΠΎ ΡΠ°ΡΡΡΠ»ΠΊΡ Π½ΡΠΆΠ½ΠΎ Π΄Π΅Π»Π°ΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π² ΡΠ»ΡΡΠ°Π΅ Π½Π°Π»ΠΈΡΠΈΡ Ρ ΠΎΡΡ Π±Ρ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΠ°Π³Π° build-Π°, ΠΊΠΎΡΠΎΡΡΠΉ Π·Π°ΠΊΠΎΠ½ΡΠΈΠ»ΡΡ ΡΠΎ ΡΡΠ°ΡΡΡΠΎΠΌ failure ΠΈΠ»ΠΈ warning. Π ΡΠ»ΡΡΠ°Π΅ success ΡΠ°ΡΡΡΠ»ΠΊΡ Π΄Π΅Π»Π°ΡΡ Π½Π΅ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ.
extraRecipients ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΡΠΏΠΈΡΠΎΠΊ Π»ΠΈΡ, ΠΊΠΎΠΌΡ ΡΠ»Π΅Π΄ΡΠ΅Ρ ΡΠ΄Π΅Π»Π°ΡΡ ΡΠ°ΡΡΡΠ»ΠΊΡ ΠΏΠΎΠΌΠΈΠΌΠΎ Π²Π»Π°Π΄Π΅Π»ΡΡΠ° ΠΈ Π»ΠΈΡΠ°, ΠΎΡΡΡΠ΅ΡΡΠ²ΠΈΠ²ΡΠ΅Π³ΠΎ commit.
messageFormatter ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠΌ, Π·Π°Π΄Π°ΡΡΠΈΠΌ ΡΠΎΡΠΌΠ°Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ, Π΅Π³ΠΎ ΡΠ°Π±Π»ΠΎΠ½, ΠΈ Π½Π°Π±ΠΎΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ Π΄ΠΎΡΡΡΠΏΠ½ΡΡ ΠΈΠ· jinja2. Π’Π°ΠΊΠΈΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ, ΠΊΠ°ΠΊ wantProperties=True ΠΈ wantSteps=True Π·Π°Π΄Π°ΡΡ ΡΡΠΎΡ Π½Π°Π±ΠΎΡ Π΄ΠΎΡΡΡΠΏΠ½ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ .
Ρ[‘services’]=[sendMessageToAll] ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΏΠΈΡΠΎΠΊ ΡΠ΅ΡΠ²ΠΈΡΠΎΠ², ΡΡΠ΅Π΄ΠΈ ΠΊΠΎΡΠΎΡΡΡ ΠΈ Π±ΡΠ΄Π΅Ρ Π½Π°Ρ reporter.
ΠΡ ΡΠ΄Π΅Π»Π°Π»ΠΈ ΡΡΠΎ! ΠΠΎΠΈ ΠΏΠΎΠ·Π΄ΡΠ°Π²Π»Π΅Π½ΠΈΡ
ΠΡ ΡΠΎΠ·Π΄Π°Π»ΠΈ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΡ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ ΠΈ ΡΠ²ΠΈΠ΄Π΅Π»ΠΈ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π», Π½Π° ΠΊΠΎΡΠΎΡΡΠΉ ΡΠΏΠΎΡΠΎΠ±Π΅Π½ BuildBot. ΠΡΠΎΠ³ΠΎ, Π΄ΡΠΌΠ°Ρ, Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ Π΄Π»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ ΠΏΠΎΠ½ΡΡΡ, Π½ΡΠΆΠ΅Π½ Π»ΠΈ ΡΡΠΎΡ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ Π²Π°ΡΠ΅Π³ΠΎ ΠΏΡΠΎΠ΅ΠΊΡΠ°. ΠΠ½ Π²Π°ΠΌ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ΅Π½? ΠΠ½ Π²Π°ΠΌ ΠΏΡΠΈΠ³ΠΎΠ΄ΠΈΡΡΡ? Π‘ Π½ΠΈΠΌ ΡΠ΄ΠΎΠ±Π½ΠΎ ΡΠ°Π±ΠΎΡΠ°ΡΡ? Π’ΠΎΠ³Π΄Π° Ρ ΠΏΠΈΡΠ°ΡΡ ΡΡΡ ΡΡΠ°ΡΡΡ Π½Π΅ Π·ΡΡ.
Π Π΅ΡΠ΅. Π₯ΠΎΡΠ΅Π»ΠΎΡΡ Π±Ρ, ΡΡΠΎΠ±Ρ ΠΏΡΠΎΡΠ΅ΡΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΠ΅ ΡΠΎΠΎΠ±ΡΠ΅ΡΡΠ²ΠΎ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΠ΅Π΅ BuildBot, ΡΡΠ°Π»ΠΎ ΡΠΈΡΠ΅, ΠΌΠ°Π½ΡΠ°Π»Ρ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄ΠΈΠ»ΠΈΡΡ, ΠΈ ΠΏΡΠΈΠΌΠ΅ΡΠΎΠ² ΡΡΠ°Π½ΠΎΠ²ΠΈΠ»ΠΎΡΡ Π΅ΡΠ΅ Π±ΠΎΠ»ΡΡΠ΅.
ΠΡΠ΅ΠΌ ΡΠΏΠ°ΡΠΈΠ±ΠΎ Π·Π° Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅. Π£Π΄Π°ΡΠΈ.
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com