ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Continuous Integration с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ BuildBot

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Continuous Integration с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ BuildBot
(Image by Computerizer from Pixabay)

ΠŸΡ€ΠΈΠ²Π΅Ρ‚!

МСня Π·ΠΎΠ²ΡƒΡ‚ Π•Π²Π³Π΅Π½ΠΈΠΉ Π§Π΅Ρ€ΠΊΠΈΠ½, я программист ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² Π² Π³ΠΎΡ€Π½ΠΎΠ΄ΠΎΠ±Ρ‹Π²Π°ΡŽΡ‰Π΅ΠΉ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ Polymetal.

ΠŸΡ€ΠΈΡΡ‚ΡƒΠΏΠ°Ρ ΠΊ Π»ΡŽΠ±ΠΎΠΌΡƒ ΠΊΡ€ΡƒΠΏΠ½ΠΎΠΌΡƒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρƒ Π½Π°Ρ‡ΠΈΠ½Π°Π΅ΡˆΡŒ Π·Π°Π΄ΡƒΠΌΡ‹Π²Π°Ρ‚ΡŒΡΡ: «Какой ΠΆΠ΅ софт Π»ΡƒΡ‡ΡˆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для Π΅Π³ΠΎ обслуТивания?Β». IT-ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΏΠ΅Ρ€Π΅Π΄ выпуском ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠΉ вСрсии ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ ряд этапов. Π₯ΠΎΡ€ΠΎΡˆΠΎ, ΠΊΠΎΠ³Π΄Π° Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ° этих этапов Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π°. Π‘Π°ΠΌ ΠΏΠΎ сСбС Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ процСсс выпуска Π½ΠΎΠ²ΠΎΠΉ вСрсии IT-ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° называСтся Continuous Integration. BuildBot для нас оказался Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΌ ΠΏΠΎΠΌΠΎΡ‰Π½ΠΈΠΊΠΎΠΌ, Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰ΠΈΠΌ этот процСсс.

Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ я Ρ€Π΅ΡˆΠΈΠ» ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΎΠ±Π·ΠΎΡ€ возмоТностСй BuildBot. На Ρ‡Ρ‚ΠΎ способСн этот софт? Как ΠΊ Π½Π΅ΠΌΡƒ ΠΏΠΎΠ΄ΡΡ‚ΡƒΠΏΠΈΡ‚ΡŒΡΡ ΠΈ ΠΊΠ°ΠΊ Π²Ρ‹ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ с Π½ΠΈΠΌ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½Ρ‹Π΅ Π­Π€Π€Π•ΠšΠ’Π˜Π’ΠΠ«Π• Π ΠΠ‘ΠžΠ§Π˜Π• ΠžΠ’ΠΠžΠ¨Π•ΠΠ˜Π―? Наш ΠΎΠΏΡ‹Ρ‚ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΈ Ρƒ сСбя, создав Π½Π° своСй машинС Ρ€Π°Π±ΠΎΡ‡ΠΈΠΉ сСрвис сборки ΠΈ тСстирования вашСго ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°.

Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΠ΅

Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΠ΅

1. ΠŸΠΎΡ‡Π΅ΠΌΡƒ BuildBot?
2. ΠšΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΡ Π²ΠΎ Π³Π»Π°Π²Π΅ с BuildMaster
3. Установка
4. ΠŸΠ΅Ρ€Π²Ρ‹Π΅ шаги

5. ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ. ΠŸΠΎΡˆΠ°Π³ΠΎΠ²Ρ‹ΠΉ Ρ€Π΅Ρ†Π΅ΠΏΡ‚

5.1 BuildmasterConfig
5.2 workers
5.3 change_source
5.4 shedulers

5.5 BuildFactory
5.6 builders

6. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ собствСнной ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ

6.1 На ΠΏΡƒΡ‚ΠΈ ΠΊ своСму master.cfg
6.2 Π Π°Π±ΠΎΡ‚Π° с svn
6.3 Π’Π°ΠΌ письмо: reporters ΡƒΠΏΠΎΠ»Π½ΠΎΠΌΠΎΡ‡Π΅Π½ Π·Π°ΡΠ²ΠΈΡ‚ΡŒ

ΠœΡ‹ сдСлали это! Мои поздравлСния

1. ΠŸΠΎΡ‡Π΅ΠΌΡƒ BuildBot?

Π Π°Π½Π΅Π΅ Π½Π° habr-e я встрСчал ΡΡ‚Π°Ρ‚ΡŒΠΈ ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Continuous Integration с использованиСм BuildBot. К ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ, Π²ΠΎΡ‚ эта показалась ΠΌΠ½Π΅ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΠ²Π½ΠΎΠΉ. Π•ΡΡ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ β€” ΠΏΠΎΠΏΡ€ΠΎΡ‰Π΅. Π”Π°Π½Π½Ρ‹Π΅ ΡΡ‚Π°Ρ‚ΡŒΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΌ с ΠΌΠ°Π½ΡƒΠ°Π»Π°, Π° это Π²Π΄ΠΎΠ³ΠΎΠ½ΠΎΡ‡ΠΊΡƒ, Π½Π° английском языкС. Π’ ΠΊΡƒΠΏΠ΅ получаСтся нСплохая отправная Ρ‚ΠΎΡ‡ΠΊΠ°. ΠŸΡ€ΠΎΡ‡ΠΈΡ‚Π°Π² эти ΡΡ‚Π°Ρ‚ΡŒΠΈ, Π²Ρ‹ навСрняка сразу Π·Π°Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Ρ‡Ρ‚ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Π½Π° BuildBot ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ.

Π‘Ρ‚ΠΎΠΏ! А ΠΊΡ‚ΠΎ-Ρ‚ΠΎ Π²ΠΎΠΎΠ±Ρ‰Π΅ использовал Π΅Π³ΠΎ Π² своих ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°Ρ…? ΠžΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ΡΡ Π΄Π°, ΠΌΠ½ΠΎΠ³ΠΈΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠ»ΠΈ Π΅Π³ΠΎ Π² своих Π·Π°Π΄Π°Ρ‡Π°Ρ…. МоТно Π½Π°ΠΉΡ‚ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ использования BuildBot ΠΈ Π² Π°Ρ€Ρ…ΠΈΠ²Π°Ρ… ΠΊΠΎΠ΄ΠΎΠ² Google.

Π’Π°ΠΊ ΠΊΠ°ΠΊΠΎΠ²Π° ΠΆΠ΅ Π»ΠΎΠ³ΠΈΠΊΠ° людСй, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΡ… Buildbot? Π’Π΅Π΄ΡŒ Π΅ΡΡ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ инструмСнты: CruiseControl ΠΈ Jenkins. ΠžΡ‚Π²Π΅Ρ‡Ρƒ Ρ‚Π°ΠΊ. Для Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π° Π·Π°Π΄Π°Ρ‡ Jenkins ΠΈ ΠΏΡ€Π°Π²Π΄Π° Π±ΡƒΠ΄Π΅Ρ‚ достаточно. Π’ свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, BuildBot β€” Π±ΠΎΠ»Π΅Π΅ Π°Π΄Π°ΠΏΡ‚ΠΈΠ²Π½Ρ‹ΠΉ, ΠΏΡ€ΠΈ этом Π·Π°Π΄Π°Ρ‡ΠΈ Ρ‚Π°ΠΌ Ρ€Π΅ΡˆΠ°ΡŽΡ‚ΡΡ Ρ‚Π°ΠΊ ΠΆΠ΅ просто, ΠΊΠ°ΠΊ ΠΈ Π² Jenkins. Π’Ρ‹Π±ΠΈΡ€Π°Ρ‚ΡŒ Π²Π°ΠΌ. Но Ρ€Π°Π· ΡƒΠΆ ΠΌΡ‹ ΠΈΡ‰Π΅ΠΌ инструмСнт для Ρ€Π°Π·Π²ΠΈΠ²Π°ΡŽΡ‰Π΅Π³ΠΎΡΡ Ρ†Π΅Π»Π΅Π²ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°, Ρ‚ΠΎ ΠΏΠΎΡ‡Π΅ΠΌΡƒ Π±Ρ‹ Π½Π΅ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ Ρ‚ΠΎΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚, ΠΎΡ‚Ρ‚Π°Π»ΠΊΠΈΠ²Π°ΡΡΡŒ ΠΎΡ‚ простых шагов, ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ систСму сборки, ΠΈΠΌΠ΅ΡŽΡ‰ΡƒΡŽ ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ ΠΈ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ интСрфСйс.

Π£ Ρ‚Π΅Ρ…, Ρ‡Π΅ΠΉ Ρ†Π΅Π»Π΅Π²ΠΎΠΉ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ написан Π½Π° python, Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ вопрос: Β«ΠŸΠΎΡ‡Π΅ΠΌΡƒ Π±Ρ‹ Π½Π΅ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ систСму интСгрирования, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π΅ΡΡ‚ΡŒ понятный интСрфСйс с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния языка, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ³ΠΎ Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅?Β». И Ρ‚ΡƒΡ‚ самоС врСмя ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ прСимущСства BuildBot.

Π˜Ρ‚Π°ΠΊ, наш Β«ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΊΠ²Π°Ρ€Ρ‚Π΅Ρ‚Β». Для сСбя я ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠ» Ρ‡Π΅Ρ‚Π²Π΅Ρ€ΠΊΡƒ особСнностСй BuildBot:

  1. Π­Ρ‚ΠΎ framework c ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌ исходным ΠΊΠΎΠ΄ΠΎΠΌ ΠΏΠΎΠ΄ Π»ΠΈΡ†Π΅Π½Π·ΠΈΠ΅ΠΉ GPL
  2. Π­Ρ‚ΠΎ использованиС python ΠΊΠ°ΠΊ инструмСнт конфигурирования ΠΈ описания Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΡ‹Ρ… дСйствий
  3. Π­Ρ‚ΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ ΠΎΡ‚Π²Π΅Ρ‚ со стороны ΠΌΠ°ΡˆΠΈΠ½Ρ‹, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ происходит сборка
  4. Π­Ρ‚ΠΎ, Π½Π°ΠΊΠΎΠ½Π΅Ρ†, ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹Π΅ трСбования ΠΊ Π₯осту. Для развСртывания трСбуСтся python ΠΈ twisted, ΠΈ Π½Π΅ трСбуСтся Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Π°Ρ машина ΠΈ java-машина.

2. ΠšΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΡ Π²ΠΎ Π³Π»Π°Π²Π΅ с BuildMaster

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Continuous Integration с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ BuildBot

Π¦Π΅Π½Ρ‚Ρ€Π°Π»ΡŒΠ½ΠΎΠ΅ мСсто Π² Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π΅ распрСдСлСния Π·Π°Π΄Π°Ρ‡ Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ 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 # БобствСнно сдСсь ΠΈ создаСм

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ шаг. Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ Worker. Он Π±ΡƒΠ΄Π΅Ρ‚ Ρƒ нас Π² ΠΏΠ°ΠΏΠΊΠ΅ /home/habr/worker.

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-Π° ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎ Π² этой Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ, Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρƒ скрипта Π½Π΅Ρ‚ ΠΏΡ€Π°Π² для запуска. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ, потрСбуСтся ΠΊΠ»ΡŽΡ‡ΠΈΠΊ —umask=0o22, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π°ΠΊΠ»Π°Π΄Ρ‹Π²Π°Π΅Ρ‚ Π·Π°ΠΏΡ€Π΅Ρ‚ Π½Π° запись Π² эту Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ, Π½ΠΎ ΠΏΡ€Π°Π²Π° запуска оставит. А Π½Π°ΠΌ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ это ΠΈ Π½ΡƒΠΆΠ½ΠΎ.

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Β». Названия ΠΊΠ»ΡŽΡ‡Π΅ΠΉ Π² c[Β«keyFromDistΒ»] ΡΠ²Π»ΡΡŽΡ‚ΡΡ фиксированными элСмСнтами для взаимодСйствия с BuildMaster. Под ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΊΠ»ΡŽΡ‡ Π² качСствС значСния подставляСтся ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚.

5.2 workers

c['workers'] = [worker.Worker("example-worker", "pass")]

На этот Ρ€Π°Π· ΠΌΡ‹ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ BuildMaster-Ρƒ список ΠΈΠ· Worker-ΠΎΠ². Π‘Π°ΠΌ Worker ΠΌΡ‹ создавали Π²Ρ‹ΡˆΠ΅, ΡƒΠΊΠ°Π·Π°Π² you-worker-name ΠΈ password. Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΈΡ… ΠΆΠ΅ Π½Π°Π΄ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ вмСсто example-worker ΠΈ pass .

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-Π΅ создастся локальная копия рСпозитория. Π”Π΅Ρ‚Π°Π»ΠΈ этого процСсса Π±ΡƒΠ΄ΡƒΡ‚ раскрыты Π½ΠΈΠΆΠ΅ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Π΄Π²ΡƒΡ… Ρ€Π°Π·Π΄Π΅Π»Π°Ρ… (5.4 ΠΈ 5.5).

Π•Ρ‰Π΅ Π±ΠΎΠ»Π΅Π΅ изящным ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ отслСТивания ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π² Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ являСтся прямая ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠ° сообщСний ΠΎΡ‚ сСрвСра, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠ½ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½, ΠΊ 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 – это элСмСнт, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ выступаСт Ρ‚Ρ€ΠΈΠ³Π³Π΅Ρ€ΠΎΠΌ, Π·Π°ΠΏΡƒΡΠΊΠ°ΡŽΡ‰ΠΈΠΌ всю Ρ†Π΅ΠΏΠΎΡ‡ΠΊΡƒ сборки ΠΈ тСстирования ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°.
ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Continuous Integration с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ BuildBot

Π’Π΅ измСнСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±Ρ‹Π»ΠΈ зафиксированы change_source, ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π»ΠΈΡΡŒ Π² процСссС Ρ€Π°Π±ΠΎΡ‚Ρ‹ BuildBot-a Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Change ΠΈ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ Sheduler Π½Π° ΠΈΡ… основС строит запросы Π½Π° запуск процСсса сборки ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°. Однако ΠΎΠ½ опрСдСляСт ΠΈ Ρ‚ΠΎ, ΠΊΠΎΠ³Π΄Π° эти запросы ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ дальшС Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ. ΠžΠ±ΡŠΠ΅ΠΊΡ‚ Builder Ρ…Ρ€Π°Π½ΠΈΡ‚ Ρƒ сСбя ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ запросов ΠΈ отслСТиваСт состояниС Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ сборки Π½Π° ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΌ Worker-e. Builder сущСствуСт ΠΈ Π½Π° BuildMaster-e ΠΈ Π½Π° Worker-e. Он ΠΆΠ΅ посылаСт с BuildMaster-Π° Π½Π° Worker-Π° ΡƒΠΆΠ΅ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ build β€” ΡΠ΅Ρ€ΠΈΡŽ шагов, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ слСдуСт Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ.
ΠœΡ‹ Π²ΠΈΠ΄ΠΈΠΌ, Ρ‡Ρ‚ΠΎ Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Ρ‚Π°ΠΊΠΈΡ… 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. Однако Ρ‚ΠΎΠ³Π΄Π° Π΅ΡΡ‚ΡŒ Π΄Π²Π° Β«Π½ΠΎΒ»:

  1. Worker Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ создан с ΠΊΠ»ΡŽΡ‡Π΅ΠΌ —umask для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ Π½Π΅ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π» ΠΏΡ€Π°Π²Π° Π½Π° выполнСния послС checkout-a.
  2. ΠŸΡ€ΠΈ git push-Π΅ этих скриптов Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ свойство exacutable, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΡ‚ΠΎΠΌ ΠΏΡ€ΠΈ chechout-e ΠΏΡ€Π°Π²Π° Π½Π° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ скрипта Git Π½Π΅ потСрял.

5.6 builders


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

О Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Builder Π±Ρ‹Π»ΠΎ рассказано здСсь. БСйчас я ΠΏΠΎΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ расскаТу ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ Π΅Π³ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ. BuilderConfig являСтся конструктором builder. Π’Π°ΠΊΠΈΡ… конструкторов Π² c[‘builders’] ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π΄Π°Ρ‚ΡŒ нСсколько, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ это лист ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² builder Ρ‚ΠΈΠΏΠ°. БСйчас Ρ‡ΡƒΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡˆΠ΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΎΡ‚ BuildBot, ΠΏΡ€ΠΈΠ±Π»ΠΈΠ·ΠΈΠ² Π΅Π³ΠΎ ΠΊ нашСй Π·Π°Π΄Π°Ρ‡Π΅.


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. Π‘Π°ΠΌ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ Π±ΡƒΠ΄Π΅Ρ‚ находится Π² Π½Π΅ΠΊΠΎΠ΅ΠΌ ΠΎΠ±Π»Π°ΠΊΠ΅. Π’ΠΎΡ‚ адрСс этого ΠΎΠ±Π»Π°ΠΊΠ° svn.host/svn/yourProject/trunk. Π’ ΠΎΠ±Π»Π°ΠΊΠ΅ ΠΏΠΎΠ΄ svn Π΅ΡΡ‚ΡŒ ΡƒΡ‡Ρ‘Ρ‚ΠΊΠ° username: user, passwd: password. Π‘ΠΊΡ€ΠΈΠΏΡ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ ΠΈΠ· сСбя шаги build-a Π±ΡƒΠ΄ΡƒΡ‚ Ρ‚Π°ΠΊΠΆΠ΅ Π»Π΅ΠΆΠ°Ρ‚ΡŒ Π² Π²Π΅Ρ‚ΠΊΠ΅ svn, Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΏΠ°ΠΏΠΊΠ΅ buildbot/worker_linux. Π­Ρ‚ΠΈ скрипты Π»Π΅ΠΆΠ°Ρ‚ Π² Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ с сохранСнным свойством executable.

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-Π° ΠΈ Worker-a. Π—Π°Ρ‚Π΅ΠΌ Π²ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ этот Ρ„Π°ΠΉΠ» master.cfg Π² /home/habr/master.

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ шагом трСбуСтся Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ слуТбу 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. Он ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½ Π΄Π²ΠΈΠΆΠΊΠΎΠΌ jinja2 (ΠΌΠΎΠΆΠ½ΠΎ ΡΡ€Π°Π²Π½ΠΈΡ‚ΡŒ с django). BuildBot ΠΈΠΌΠ΅Π΅Ρ‚ Π½Π°Π±ΠΎΡ€ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, значСния ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΏΠΎΠ΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ΡΡ Π² шаблон Π² процСссС формирования тСкста сообщСния. Π­Ρ‚ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ вписаны Π² {{ Π΄Π²ΠΎΠΉΠ½Ρ‹Π΅ Ρ„ΠΈΠ³ΡƒΡ€Π½Ρ‹Π΅ скобки }}. Π’Π°ΠΊ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, summary Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ статус Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π½Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ success ΠΈΠ»ΠΈ failure. А projects Π²Ρ‹Π²Π΅Π΄Π΅Ρ‚ yourProject. Π’Π°ΠΊ, ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΠΈΡ… ΠΊΠΎΠΌΠ°Π½Π΄ Π² jinja2, ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… BuildBot-Π° ΠΈ срСдств форматирования строк python ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π²ΠΏΠΎΠ»Π½Π΅ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΠ²Π½ΠΎΠ΅ сообщСниС.

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