BuildBot рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдирд┐рд░рдиреНрддрд░ рдПрдХреАрдХрд░рдг рд▓рд╛рдЧреВ рдЧрд░реНрдиреЗ рдЙрджрд╛рд╣рд░рдг

BuildBot рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдирд┐рд░рдиреНрддрд░ рдПрдХреАрдХрд░рдг рд▓рд╛рдЧреВ рдЧрд░реНрдиреЗ рдЙрджрд╛рд╣рд░рдг
(рджреНрд╡рд╛рд░рд╛ рдЫрд╡рд┐ рдХрдореНрдкреНрдпреБрдЯрд░рд╛рдЗрдЬрд░ рдмрд╛рдЯ Pixabay)

рдирдорд╕реНрддреЗ!

рдореЗрд░реЛ рдирд╛рдо Evgeniy Cherkin, рдо рдПрдХ рдЦрдирди рдХрдореНрдкрдиреА рдорд╛ рдПрдХ рд╡рд┐рдХрд╛рд╕ рдЯреЛрд▓реА рдорд╛ рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рд╣реБрдБ рдкреЛрд▓реАрдореЗрдЯрд▓.

рдХреБрдиреИ рдкрдирд┐ рдареВрд▓реЛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реБрд░реБ рдЧрд░реНрджрд╛, рддрдкрд╛рдЗрдБ рд╕реЛрдЪреНрди рдерд╛рд▓реНрдиреБрд╣реБрдиреНрдЫ: "рдпрд╕рд▓рд╛рдИ рдХрд╛рдпрдо рд░рд╛рдЦреНрди рдХреБрди рд╕рдлреНрдЯрд╡реЗрдпрд░ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рд░рд╛рдореНрд░реЛ рдЫ?" рдЕрд░реНрдХреЛ рд╕рдВрд╕реНрдХрд░рдг рдЬрд╛рд░реА рдЧрд░реНрдиреБ рдЕрдШрд┐ IT рдкрд░рд┐рдпреЛрдЬрдирд╛рд▓реЗ рдзреЗрд░реИ рдЪрд░рдгрд╣рд░реВ рдкрд╛рд░ рдЧрд░реНрджрдЫред рдпреА рдЪрд░рдгрд╣рд░реВрдХреЛ рд╢реНрд░реГрдВрдЦрд▓рд╛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд╣реБрдБрджрд╛ рдпреЛ рд░рд╛рдореНрд░реЛ рдЫред IT рдкрд░рд┐рдпреЛрдЬрдирд╛рдХреЛ рдирдпрд╛рдБ рд╕рдВрд╕реНрдХрд░рдг рдЬрд╛рд░реА рдЧрд░реНрдиреЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдкреНрд░рдХреНрд░рд┐рдпрд╛рд▓рд╛рдИ рдиреИ рднрдирд┐рдиреНрдЫ рдирд┐рд░рдиреНрддрд░ рдПрдХрддрд╛. BuildBot рдпреЛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЧрд░реНрди рд╣рд╛рдореНрд░реЛ рд▓рд╛рдЧрд┐ рд░рд╛рдореНрд░реЛ рд╕рд╣рд╛рдпрдХ рд╕рд╛рдмрд┐рдд рднрдпреЛред

рдпрд╕ рд▓реЗрдЦрдорд╛ рдореИрд▓реЗ рд╕рдореНрднрд╛рд╡рдирд╛рд╣рд░реВрдХреЛ рдПрдХ рд╕рд┐рдВрд╣рд╛рд╡рд▓реЛрдХрди рдкреНрд░рджрд╛рди рдЧрд░реНрдиреЗ рдирд┐рд░реНрдгрдп рдЧрд░реЗрдВ BuildBotред рдпреЛ рд╕рдлреНрдЯрд╡реЗрдпрд░ рдХреЗ рд╕рдХреНрд╖рдо рдЫ? рдЙрд╣рд╛рдБрд╕рдБрдЧ рдХрд╕рд░реА рд╕рдореНрдкрд░реНрдХ рдЧрд░реНрдиреЗ рд░ рдЙрд╣рд╛рдБрд╕рдБрдЧ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рднрд╛рд╡рдХрд╛рд░реА рдХрд╛рд░реНрдп рд╕рдореНрдмрдиреНрдз рдХрд╕рд░реА рдирд┐рд░реНрдорд╛рдг рдЧрд░реНрдиреЗ? рддрдкрд╛рдЗрдБрд▓реЗ рддрдкрд╛рдЗрдБрдХреЛ рдореЗрд╕рд┐рдирдорд╛ рддрдкрд╛рдЗрдБрдХреЛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдирд┐рд░реНрдорд╛рдг рд░ рдкрд░реАрдХреНрд╖рдг рдХреЛ рд▓рд╛рдЧреА рдПрдХ рдХрд╛рд░реНрдп рд╕реЗрд╡рд╛ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реЗрд░ рд╣рд╛рдореНрд░реЛ рдЕрдиреБрднрд╡ рдЖрдлреИрдВ рд▓рд╛рдЧреВ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред

рд╕рд╛рдордЧреНрд░реАрд╣рд░реВ

рд╕рд╛рдордЧреНрд░реАрд╣рд░реВ

1. рдХрд┐рди BuildBot?
2. рдмрд┐рд▓реНрдбрдорд╛рд╕реНрдЯрд░рдХреЛ рдиреЗрддреГрддреНрд╡рдорд╛ рдЕрд╡рдзрд╛рд░рдгрд╛
3. рд╕реНрдерд╛рдкрдирд╛
4. рдкрд╣рд┐рд▓реЛ рдЪрд░рдгрд╣рд░реВ

5. рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рдиред рдЪрд░рдг-рджрд░-рдЪрд░рдг рдиреБрд╕реНрдЦрд╛

5.1 BuildmasterConfig
5.2 рдХрд░реНрдордЪрд╛рд░реАрд╣рд░реВ
5.3 рдкрд░рд┐рд╡рд░реНрддрди_рд╕реНрд░реЛрдд
5.4 рдЕрдиреБрд╕реВрдЪрдХрд╣рд░реВ

5.5 рдирд┐рд░реНрдорд╛рдг рдХрд╛рд░рдЦрд╛рдирд╛
5.6 рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛рд╣рд░реВ

6. рддрдкрд╛рдИрдВрдХреЛ рдЖрдлреНрдиреИ рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рдирдХреЛ рдЙрджрд╛рд╣рд░рдг

6.1 рддрдкрд╛рдИрдВрдХреЛ master.cfg рдЬрд╛рдиреЗ рдмрд╛рдЯреЛрдорд╛
6.2 svn рд╕рдБрдЧ рдХрд╛рдо рдЧрд░реНрджреИ
6.3 рддрдкрд╛рдИрд▓рд╛рдИ рдкрддреНрд░: рд░рд┐рдкреЛрд░реНрдЯрд░рд╣рд░реВ рдШреЛрд╖рдгрд╛ рдЧрд░реНрди рдЕрдзрд┐рдХреГрдд рдЫрдиреН

рд╣рд╛рдореАрд▓реЗ рдЧрд░реНрдпреЛ! рдмрдзрд╛рдИ рдЫ

1. рдХрд┐рди BuildBot?

рдкрд╣рд┐рд▓реЗ habr-e рдорд╛ рдореИрд▓реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдмрд╛рд░реЗ рд▓реЗрдЦрд╣рд░реВ рднреЗрдЯреНрдЯрд╛рдПрдБ рдирд┐рд░рдиреНрддрд░ рдПрдХрддрд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджреИ BuildBotред рдЬрд╕реНрддреИ, рдпреЛ рдЪрд╛рд╣рд┐рдБ рдорд▓рд╛рдИ рдпреЛ рд╕рдмреИрднрдиреНрджрд╛ рдЬрд╛рдирдХрд╛рд░реАрдкреВрд░реНрдг рд▓рд╛рдЧреНрдпреЛред рдЕрд░реНрдХреЛ рдЙрджрд╛рд╣рд░рдг рдЫ- рд╕рд░рд▓ред рдпреА рд▓реЗрдЦрд╣рд░реВ рдореМрд╕рдореА рд╣реБрди рд╕рдХреНрдЫрдиреН рдкреБрд╕реНрддрд┐рдХрд╛рдмрд╛рдЯ рдЙрджрд╛рд╣рд░рдгрд░ рдпрд╕рд▓рд╛рдИ рддреНрдпрд╕ рдкрдЫрд┐, рдЕрдВрдЧреНрд░реЗрдЬреАрдорд╛ред рдХреВрдкрд▓реЗ рд░рд╛рдореНрд░реЛ рд╕реБрд░реБрд╡рд╛рдд рдмрд┐рдиреНрджреБ рдмрдирд╛рдЙрдБрдЫред рдпреА рд▓реЗрдЦрд╣рд░реВ рдкрдврд┐рд╕рдХреЗрдкрдЫрд┐, рддрдкрд╛рдИрд▓реЗ рддреБрд░реБрдиреНрддреИ рдХреЗрд╣рд┐ рдЧрд░реНрди рдЪрд╛рд╣рд╛рдиреБрд╣реБрдиреНрдЫ BuildBot рдЧрд░реНрди

рд░реЛрдХ! рдХреЗ рдХрд╕реИрд▓реЗ рд╡рд╛рд╕реНрддрд╡рдорд╛ рдЖрдлреНрдиреЛ рдкрд░рд┐рдпреЛрдЬрдирд╛рд╣рд░реВрдорд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрдХреЛ рдЫ? рдпреЛ рд╣реЛ рдмрд╛рд╣рд┐рд░ рдЬрд╛рдиреНрдЫ рдзреЗрд░реИ рдЖрдлреНрдиреЛ рдХрд╛рд░реНрдпрдорд╛ рд▓рд╛рдЧреВ рдЧрд░реЗред рдлреЗрд▓рд╛ рдкрд╛рд░реНрди рд╕рдХрд┐рдиреНрдЫ рдЙрджрд╛рд╣рд░рдгрд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреБрд╣реЛрд╕реН BuildBot рд░ рдЧреБрдЧрд▓ рдХреЛрдб рдЕрднрд┐рд▓реЗрдЦрд╣рд░реВрдорд╛ред

рддреНрдпрд╕реЛрднрдП рдорд╛рдирд┐рд╕рд╣рд░реВрд▓реЗ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗ рддрд░реНрдХ рдХреЗ рд╣реЛ рдмрд┐рд▓реНрдбрдмреЛрдЯ? рдЖрдЦрд┐рд░, рддреНрдпрд╣рд╛рдБ рдЕрдиреНрдп рдЙрдкрдХрд░рдгрд╣рд░реВ рдЫрдиреН: рдХреНрд░реВрдЬ рдХрдиреНрдЯреНрд░реЛрд▓ ╨╕ рдЬреЗрдирдХрд┐рдиреНрд╕ред рдо рдпрд╕рд░реА рдЬрд╡рд╛рдл рджрд┐рдиреЗрдЫреБред рдЕрдзрд┐рдХрд╛рдВрд╢ рдХрд╛рд░реНрдпрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рдЬреЗрдирдХрд┐рдиреНрд╕ рд░ рд╕рддреНрдп рдкрд░реНрдпрд╛рдкреНрдд рд╣реБрдиреЗрдЫред рдпрд╕рдХреЛ рдкрд╛рд▓реЛрдорд╛, BuildBot - рдЕрдзрд┐рдХ рдЕрдиреБрдХреВрд▓реА, рдЬрдмрдХрд┐ рд╕рдорд╕реНрдпрд╛рд╣рд░реВ рддреНрдпрд╣рд╛рдБ рд╕рд░рд▓ рд░реВрдкрдорд╛ рд╕рдорд╛рдзрд╛рди рдЧрд░рд┐рдиреНрдЫ рдЬреЗрдирдХрд┐рдиреНрд╕ред рдЫрдиреЛрдЯ рддрдкрд╛рдИрдХреЛ рд╣реЛред рддрд░ рдЬрдм рд╣рд╛рдореА рд╡рд┐рдХрд╛рд╕рд╢реАрд▓ рд▓рдХреНрд╖реНрдп рдкрд░рд┐рдпреЛрдЬрдирд╛рдХреЛ рд▓рд╛рдЧрд┐ рдЙрдкрдХрд░рдг рдЦреЛрдЬреНрджреИрдЫреМрдВ, рдЕрдиреНрддрд░рдХреНрд░рд┐рдпрд╛рд╢реАрд▓рддрд╛ рд░ рдПрдХ рдЕрджреНрд╡рд┐рддреАрдп рдЗрдиреНрдЯрд░рдлреЗрд╕ рднрдПрдХреЛ рдирд┐рд░реНрдорд╛рдг рдкреНрд░рдгрд╛рд▓реА рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрди рд╕рд░рд▓ рдЪрд░рдгрд╣рд░реВрдмрд╛рдЯ рд╕реБрд░реВ рдЧрд░реНрди рдЕрдиреБрдорддрд┐ рджрд┐рдиреЗ рдПрдЙрдЯрд╛ рдХрд┐рди рдЫрдиреМрдЯ рдирдЧрд░реНрдиреБрд╣реЛрд╕реНред

рдЬрд╕рдХреЛ рд▓рдХреНрд╖рд┐рдд рдкрд░рд┐рдпреЛрдЬрдирд╛ рдкрд╛рдЗрдердирдорд╛ рд▓реЗрдЦрд┐рдПрдХреЛ рдЫ, рдкреНрд░рд╢реНрди рдЙрдареНрдЫ: "рдХрд┐рди рдПрдХреАрдХрд░рдг рдкреНрд░рдгрд╛рд▓реА рдЫрдиреЛрдЯ рдирдЧрд░реНрдиреЗ рдЬреБрди рдкрд░рд┐рдпреЛрдЬрдирд╛рдорд╛ тАЛтАЛрдкреНрд░рдпреЛрдЧ рдЧрд░рд┐рдПрдХреЛ рднрд╛рд╖рд╛рдХреЛ рд╕рдиреНрджрд░реНрднрдорд╛ рд╕реНрдкрд╖реНрдЯ рдЗрдиреНрдЯрд░рдлреЗрд╕ рдЫ?" рд░ рдЕрдм рдпреЛ рдлрд╛рдЗрджрд╛рд╣рд░реВ рдкреНрд░рд╕реНрддреБрдд рдЧрд░реНрдиреЗ рд╕рдордп рд╣реЛ BuildBot.

рддреНрдпрд╕реИрд▓реЗ, рд╣рд╛рдореНрд░реЛ "рд╡рд╛рджреНрдп рдЪреМрдХрдбреА"ред рдореЗрд░реЛ рд▓рд╛рдЧрд┐, рдореИрд▓реЗ рдЪрд╛рд░рд╡рдЯрд╛ рд╡рд┐рд╢реЗрд╖рддрд╛рд╣рд░реВ рдкрд╣рд┐рдЪрд╛рди рдЧрд░реЗрдХреЛ рдЫреБ BuildBot:

  1. рдпреЛ GPL рд▓рд╛рдЗрд╕реЗрдиреНрд╕ рдЕрдиреНрддрд░реНрдЧрдд рдЦреБрд▓рд╛ рд╕реНрд░реЛрдд рдлреНрд░реЗрдорд╡рд░реНрдХ рд╣реЛ
  2. рдпреЛ рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рди рдЙрдкрдХрд░рдг рд░ рдЖрд╡рд╢реНрдпрдХ рдХрд╛рд░реНрдпрд╣рд░реВрдХреЛ рд╡рд┐рд╡рд░рдгрдХреЛ рд░реВрдкрдорд╛ рдкрд╛рдЗрдердирдХреЛ рдкреНрд░рдпреЛрдЧ рд╣реЛ
  3. рдпреЛ рдореЗрд╕рд┐рдирдмрд╛рдЯ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрдиреЗ рдЕрд╡рд╕рд░ рд╣реЛ рдЬрд╕рдорд╛ рд╕рднрд╛ рд╣реБрдиреНрдЫ
  4. рдпреА рд╣реБрдиреН, рдЕрдиреНрддрдорд╛, рд╣реЛрд╕реНрдЯрдХрд╛ рд▓рд╛рдЧрд┐ рдиреНрдпреВрдирддрдо рдЖрд╡рд╢реНрдпрдХрддрд╛рд╣рд░реВред рдбрд┐рдкреНрд▓реЛрдпрдореЗрдиреНрдЯрдХрд╛ рд▓рд╛рдЧрд┐ рдкрд╛рдЗрдерди рд░ рдЯреНрд╡рд┐рд╕реНрдЯреЗрдб рдЪрд╛рд╣рд┐рдиреНрдЫ, рд░ рднрд░реНрдЪреБрдЕрд▓ рдореЗрд╕рд┐рди рд░ рдЬрд╛рднрд╛ рдореЗрд╕рд┐рдирдХреЛ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдкрд░реНрджреИрдиред

2. рдмрд┐рд▓реНрдбрдорд╛рд╕реНрдЯрд░рдХреЛ рдиреЗрддреГрддреНрд╡рдорд╛ рдЕрд╡рдзрд╛рд░рдгрд╛

BuildBot рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдирд┐рд░рдиреНрддрд░ рдПрдХреАрдХрд░рдг рд▓рд╛рдЧреВ рдЧрд░реНрдиреЗ рдЙрджрд╛рд╣рд░рдг

рдХрд╛рд░реНрдп рд╡рд┐рддрд░рдг рд╡рд╛рд╕реНрддреБрдХрд▓рд╛рдХреЛ рдХреЗрдиреНрджреНрд░рдмрд┐рдиреНрджреБ рд╣реЛ рдмрд┐рд▓реНрдбрдорд╛рд╕реНрдЯрд░ред рдпреЛ рдПрдХ рд╕реЗрд╡рд╛ рд╣реЛ рдЬреБрди:

  • рдЯреНрд░рдпрд╛рдХ рд░рд╛рдЦреНрдЫ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реНрд░реЛрдд рд░реВрдЦ рдорд╛ рдкрд░рд┐рд╡рд░реНрддрди
  • рдкрдард╛рдЙрдБрдЫ рдЖрджреЗрд╢рд╣рд░реВ рдЬреБрди рдкрд░рд┐рдпреЛрдЬрдирд╛ рдирд┐рд░реНрдорд╛рдг рдЧрд░реНрди рд░ рдкрд░реАрдХреНрд╖рдг рдЧрд░реНрди рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рд╕реЗрд╡рд╛рджреНрд╡рд╛рд░рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЧрд░реНрдиреБрдкрд░реНрдЫ
  • рд╕реВрдЪрд┐рдд рдЧрд░реНрджрдЫ рд▓рд┐рдЗрдПрдХреЛ рдХрд╛рд░реНрдпрд╣рд░реВрдХреЛ рдирддрд┐рдЬрд╛ рдмрд╛рд░реЗ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рд╣рд░реВ

рдмрд┐рд▓реНрдбрдорд╛рд╕реНрдЯрд░ рдлрд╛рдЗрд▓ рдорд╛рд░реНрдлрдд рдХрдиреНрдлрд┐рдЧрд░ рдЧрд░рд┐рдпреЛ master.cfgред рдпреЛ рдлрд╛рдЗрд▓ рд░реВрдЯрдорд╛ рдЫ рдмрд┐рд▓реНрдбрдорд╛рд╕реНрдЯрд░ред рдкрдЫрд┐ рдо рдпреЛ рдЬрд░рд╛ рдХрд╕рд░реА рд╕рд┐рд░реНрдЬрдирд╛ рд╣реБрдиреНрдЫ рджреЗрдЦрд╛рдЙрдиреЗрдЫреБред рдлрд╛рдЗрд▓ рдЖрдлреИрдВ master.cfg рдХрд▓ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗ рдкрд╛рдЗрдерди рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕рдорд╛рд╡реЗрд╢ рдЧрд░реНрджрдЫ BuildBot.

рдЕрд░реНрдХреЛ рд╕рдмреИрднрдиреНрджрд╛ рдорд╣рддреНрддреНрд╡рдкреВрд░реНрдг рд╡рд╕реНрддреБ BuildBot рдирд╛рдо рдЫ рдХрд╛рдорджрд╛рд░ред рдпреЛ рд╕реЗрд╡рд╛ рдЕрд░реНрдХреЛ рд╣реЛрд╕реНрдЯрдорд╛ рдлрд░рдХ OS рдХреЛ рд╕рд╛рде рд╕реБрд░реВ рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫ, рд╡рд╛ рдЬрд╣рд╛рдБ рдПрдХрдорд╛ рдмрд┐рд▓реНрдбрдорд╛рд╕реНрдЯрд░ред рдпреЛ рд╡рд┐рд╢реЗрд╖ рд░реВрдкрдорд╛ рддрдпрд╛рд░ рдкрд╛рд░рд┐рдПрдХреЛ рднрд░реНрдЪреБрдЕрд▓ рд╡рд╛рддрд╛рд╡рд░рдгрдорд╛ рдпрд╕рдХреЛ рдЖрдлреНрдиреИ рдкреНрдпрд╛рдХреЗрдЬрд╣рд░реВ рд░ рдЪрд░рд╣рд░реВрд╕рдБрдЧ рдЕрд╡рд╕реНрдерд┐рдд рд╣реБрди рд╕рдХреНрдЫред рдпреА рднрд░реНрдЪреБрдЕрд▓ рд╡рд╛рддрд╛рд╡рд░рдгрд╣рд░реВ рдкрд╛рдЗрдерди рдЙрдкрдпреЛрдЧрд┐рддрд╛рд╣рд░реВ рдЬрд╕реНрддреИ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рддрдпрд╛рд░ рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫ virtualenv, venv.

рдмрд┐рд▓реНрдбрдорд╛рд╕реНрдЯрд░ рд╕рдмреИрд▓рд╛рдИ рдЖрджреЗрд╢ рдкреНрд░рд╕рд╛рд░рдг рдЧрд░реНрджрдЫ рдХрд╛рдорджрд╛рд░-y, рд░ рдЙрд╕рд▓реЗ, рдмрд╛рд░реАрдорд╛, рддрд┐рдиреАрд╣рд░реВрд▓рд╛рдИ рдкреВрд░рд╛ рдЧрд░реНрджрдЫред рддреНрдпреЛ рд╣реЛ, рдпреЛ рдмрд╛рд╣рд┐рд░ рдЬрд╛рдиреНрдЫ рдХрд┐ рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдирд┐рд░реНрдорд╛рдг рд░ рдкрд░реАрдХреНрд╖рдг рдХреЛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЬрд╛рди рд╕рдХреНрдЫ рдХрд╛рдорджрд╛рд░- рд╡рд┐рдиреНрдбреЛрдЬ рдЪрд▓рд╛рдЙрдиреЗ рд░ рд▓рд┐рдирдХреНрд╕ рдЪрд▓рд╛рдЙрдиреЗ рдЕрд░реНрдХреЛ рдХрд╛рд░реНрдпрдХрд░реНрддрд╛рдорд╛ред

рдЪреЗрдХрдЖрдЙрдЯ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реНрд░реЛрдд рдХреЛрдб рдкреНрд░рддреНрдпреЗрдХ рдорд╛ рд╣реБрдиреНрдЫ рдХрд╛рдорджрд╛рд░-рдИред

3. рд╕реНрдерд╛рдкрдирд╛

рддреНрдпрд╕реЛрднрдП, рдЬрд╛рдФрдВред рдо рд╣реЛрд╕реНрдЯрдХреЛ рд░реВрдкрдорд╛ Ubuntu 18.04 рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗрдЫреБред рдо рдпрд╕рдорд╛ рдПрдЙрдЯрд╛ рд░рд╛рдЦреНрдЫреБ рдмрд┐рд▓реНрдбрдорд╛рд╕реНрдЯрд░- рдПрдХ рд░ рдПрдХ рдХрд╛рдорджрд╛рд░-рдХред рддрд░ рдкрд╣рд┐рд▓реЗ рддрдкрд╛рдИрдВрд▓реЗ python3.7 рд╕реНрдерд╛рдкрдирд╛ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ:

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

3.7.2 рдХреЛ рд╕рдЯреНрдЯрд╛ python3.7.1 рдЪрд╛рд╣рд┐рдиреЗрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐, рддрдкрд╛рдИрдВрд▓реЗ рдирд┐рдореНрди рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ:


sudo apt-get update
sudo apt-get software-properties-common
sudo add-apt-repository ppa:deadsnakes/ppa
sudo apt-get install python3.7
sudo ln -fs /usr/bin/python3.7 /usr/bin/python3
pip3 install --upgrade pip

рдЕрд░реНрдХреЛ рдЪрд░рдг рд╕реНрдерд╛рдкрдирд╛ рдЧрд░реНрди рд╣реЛ рдЯреНрд╡рд┐рдЯ рдЧрд░реЗ ╨╕ BuildBot, рд╕рд╛рдереИ рдкреНрдпрд╛рдХреЗрдЬрд╣рд░реВ рдЬрд╕рд▓реЗ рддрдкрд╛рдИрдВрд▓рд╛рдИ рдердк рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рдЕрдиреБрдорддрд┐ рджрд┐рдиреНрдЫ BuildBot-рдПред


/*╨Т╤Б╨╡ ╤З╤В╨╛ ╨┐╨╛╨┤ sudo ╨▒╤Г╨┤╨╡╤В ╤Г╤Б╤В╨░╨╜╨╛╨▓╨╗╨╡╨╜╨╜╨╛ ╨┤╨╗╤П ╨▓╤Б╨╡╤Е ╨┐╨╛╨╗╤М╨╖╨╛╨▓╨░╤В╨╡╨╗╨╡╨╣ ╨▓ ╨┤╨╕╤А╨╡╨║╤В╨╛╤А╨╕╤О /usr/local/lib/python3.7/dist-packages*/

#╨Э╨░ ╤Е╨╛╤Б╤В╨╡ ╨║╨╛╤В╨╛╤А╤Л╨╣ ╨┐╤А╨╛╨╕╨╖╨▓╨╛╨┤╨╕╤В ╨╝╨╛╨╜╨╕╤В╨╛╤А╨╕╨╜╨│ Worker-╨╛╨▓ 
sudo pip install twisted #╨С╨╕╨▒╨╗╨╕╨╛╤В╨╡╨║╨░ twisted
sudo pip install buildbot #BuildMaster
#╨Ф╨╛╨┐╨╛╨╗╨╜╨╕╤В╨╡╨╗╤М╨╜╤Л╨╣ ╤Д╤Г╨╜╨║╤Ж╨╕╨╛╨╜╨░╨╗
pip install pysqlite3 #╨г╤Б╤В╨░╨╜╨░╨▓╨╗╨╕╨▓╨░╨╡╨╝ ╨▒╨░╨╖╤Г sqllite ╨▓ ╤Г╤З╨╡╨▒╨╜╤Л╤Е ╤Ж╨╡╨╗╤П╤Е
pip install jinja2 #framework ╨╜╨░╨┐╨╛╨┤╨╛╨▒╨╕╨╡ django, ╨┤╨╗╤П web ╨╕ ╨┤╨╗╤П ╨┐╨╛╤З╤В╨╛╨▓╤Л╤Е ╤А╨░╤Б╤Б╤Л╨╗╨╗╨╛╨║
pip install autobahn #Web c╨╛╨║╨╡╤В╤Л ╨┤╨╗╤П ╤Б╨▓╤П╨╖╨╕ BuildMaster->Worker
pip install sqlalchemy sqlalchemy-migrate #╨Ф╨╗╤П ╨╛╤В╨╛╨▒╤А╨░╨╢╨╡╨╜╨╕╤П ╤Б╤Е╨╡╨╝╤Л ╨▒╨░╨╖╤Л ╨┤╨░╨╜╨╜╤Л╤Е
#╨Ф╨╗╤П Web ╨╛╤В╨╛╨▒╤А╨░╨╢╨╡╨╜╨╕╤П BuildBot-a
pip install buildbot-www buildbot-grid-view buildbot-console-view buildbot-waterfall-view
pip install python-dateutil #╨Ю╤В╨╛╨▒╤А╨░╨╢╨╡╨╜╨╕╨╡ ╨┤╨░╤В ╨▓ web
#╨Э╨░ ╤Б╤В╨╛╤А╨╛╨╜╨╡ ╤Е╨╛╤Б╤В╨░ ╨║╨╛╤В╨╛╤А╤Л╨╣ ╨╜╨╡╨┐╨╛╤Б╤А╨╡╨┤╤Б╤В╨▓╨╡╨╜╨╜╨╛ ╨╛╤Б╤Г╤Й╨╡╤Б╤В╨▓╨╗╤П╨╡╤В ╤Б╨▒╨╛╤А╨║╤Г ╨╕ ╤В╨╡╤Б╤В╨╕╤А╨╛╨▓╨░╨╜╨╕╨╡ 
pip install buildbot-worker #Worker
#╨Ф╨╛╨┐╨╛╨╗╨╜╨╕╤В╨╡╨╗╤М╨╜╤Л╨╣ ╤Д╤Г╨╜╨║╤Ж╨╕╨╛╨╜╨░╨╗
sudo pip install virtualenv #╨Т╨╕╤А╤В╤Г╨░╨╗╤М╨╜╨░╤П ╤Б╤А╨╡╨┤╨░ 

4. рдкрд╣рд┐рд▓реЛ рдЪрд░рдгрд╣рд░реВ

рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреЗ рд╕рдордп рдмрд┐рд▓реНрдбрдорд╛рд╕реНрдЯрд░ред рдпреЛ рд╣рд╛рдореНрд░реЛ рдлреЛрд▓реНрдбрд░рдорд╛ рд╣реБрдиреЗрдЫ /home/habr/master.

mkdir master
buildbot create-master master # ╨б╨╛╨▒╤Б╤В╨▓╨╡╨╜╨╜╨╛ ╤Б╨┤╨╡╤Б╤М ╨╕ ╤Б╨╛╨╖╨┤╨░╨╡╨╝

рдЕрд░реНрдХреЛ рдкрд╛рдЗрд▓рд╛ред рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реМрдВ рдХрд╛рдорджрд╛рд░ред рдпреЛ рд╣рд╛рдореНрд░реЛ рдлреЛрд▓реНрдбрд░рдорд╛ рд╣реБрдиреЗрдЫ /home/habr/worker.

mkdir worker
buildbot-worker create-worker --umask=0o22 --keepalive=60 worker localhost:4000 yourWorkerName password

рдЬрдм рддрдкрд╛рдИрдВ рджреМрдбрдиреБрд╣реБрдиреНрдЫ рдХрд╛рдорджрд╛рд░, рддреНрдпрд╕рдкрдЫрд┐ рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд░реВрдкрдорд╛ рдпреЛ рд╕рд┐рд░реНрдЬрдирд╛ рд╣реБрдиреЗрдЫ /home/habr/worker рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рдирд╛рдо рд╕рдВрдЧ рдлреЛрд▓реНрдбрд░, рдорд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЧрд░рд┐рдПрдХреЛ рдЫ master.cfgред рд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯрдХреЛ рдирд╛рдордХреЛ рд╕рд╛рде рдлреЛрд▓реНрдбрд░рдорд╛ рдпрд╕рд▓реЗ рдбрд╛рдЗрд░реЗрдХреНрдЯрд░реА рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреЗрдЫ рдирд┐рд░реНрдорд╛рдг, рд░ рдпреЛ рдЧрд░реНрди рдЬрд╛рд░реА рд░рд╣рдиреЗрдЫ рдЪреЗрдХрдЖрдЙрдЯред рдХреЛ рд▓рд╛рдЧрд┐ рдХрд╛рд░реНрдп рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХрд╛рдорджрд╛рд░-рд░ рдпреЛ рдбрд╛рдЗрд░реЗрдХреНрдЯрд░реА рдмрдиреНрдиреЗрдЫ /home/habr/yourProject/build.

"рдЧреЛрд▓реНрдбреЗрди рдХреБрдЮреНрдЬреА
рд░ рдЕрдм рдореИрд▓реЗ рдЕрдШрд┐рд▓реНрд▓реЛ рдЕрдиреБрдЪреНрдЫреЗрдж рдХреЗ рд▓реЗрдЦреЗрдХреЛ рдЫреБ: рдПрдЙрдЯрд╛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЬреБрди рдорд╛рд╕реНрдЯрд░ рдмрд╛рдЯ рдорд╛рдЧ рдЧрд░реНрдиреЗрдЫ рдХрд╛рдорджрд╛рд░-рд░ рдпрд╕ рдбрд╛рдЗрд░реЗрдХреНрдЯрд░реАрдорд╛ рдЯрд╛рдвреИрдмрд╛рдЯ рдЧрд░рд┐рдПрдХреЛ рдХрд╛рд░реНрдп рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реБрдиреЗ рдЫреИрди рдХрд┐рдирднрдиреЗ рд╕реНрдХреНрд░рд┐рдкреНрдЯрд╕рдБрдЧ рдЪрд▓реНрдиреЗ рдЕрдиреБрдорддрд┐ рдЫреИрдиред рд╕реНрдерд┐рддрд┐ рд╕рдЪреНрдпрд╛рдЙрди, рддрдкрд╛рдИрдВрд▓рд╛рдИ рдПрдЙрдЯрд╛ рдХреБрдЮреНрдЬреА рдЪрд╛рд╣рд┐рдиреНрдЫ --umask=0o22, рдЬрд╕рд▓реЗ рдпрд╕ рдбрд╛рдЗрд░реЗрдХреНрдЯрд░реАрдорд╛ рд▓реЗрдЦреНрди рдирд┐рд╖реЗрдз рдЧрд░реНрджрдЫ, рддрд░ рд╕реБрд░реБрд╡рд╛рдд рдЕрдзрд┐рдХрд╛рд░рд╣рд░реВ рд░рд╛рдЦреНрдиреЗрдЫред рд░ рдпреЛ рд╕рдмреИ рд╣рд╛рдореАрд▓рд╛рдИ рдЪрд╛рд╣рд┐рдиреНрдЫред

рдмрд┐рд▓реНрдбрдорд╛рд╕реНрдЯрд░ ╨╕ рдХрд╛рдорджрд╛рд░ рдПрдХ рдЕрд░реНрдХрд╛рд╕рдБрдЧ рд╕рдореНрдмрдиреНрдз рд╕реНрдерд╛рдкрд┐рдд рдЧрд░реНрдиреБрд╣реЛрд╕реНред рдпрд╕реНрддреЛ рд╣реБрдиреНрдЫ рдХрд┐ рдпреЛ рдмрдиреНрдж рд╣реБрдиреНрдЫ рд░ рдХрд╛рдорджрд╛рд░ рдмрд╛рдЯ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдХреЛ рд▓рд╛рдЧрд┐ рдХреЗрд╣рд┐ рд╕рдордп рдкрд░реНрдЦрдиреБрд╣реЛрд╕реН рдмрд┐рд▓реНрдбрдорд╛рд╕реНрдЯрд░-рдПред рдпрджрд┐ рдХреБрдиреИ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЫреИрди рднрдиреЗ, рдЬрдбрд╛рди рдкреБрди: рд╕реБрд░реБ рд╣реБрдиреНрдЫред рдХреБрдЮреНрдЬреА --keepalive=60 рдХреЗрд╡рд▓ рддреНрдпрд╕ рдкрдЫрд┐рдХреЛ рд╕рдордп рд╕рдВрдХреЗрдд рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ рдХрдиреЗрдХреНрдЯрдЖрдЗрдкреАрдПрд╕ рдПрдк рд░рд┐рдмреБрдЯ рдЧрд░реНрджрдЫред

5. рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рдиред рдЪрд░рдг-рджрд░-рдЪрд░рдг рдиреБрд╕реНрдЦрд╛

рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рди рдмрд┐рд▓реНрдбрдорд╛рд╕реНрдЯрд░ рдореЗрд╕рд┐рдирдХреЛ рдЫреЗрдЙрдорд╛ рдЧрд░рд┐рдиреНрдЫ рдЬрд╣рд╛рдБ рд╣рд╛рдореАрд▓реЗ рдЖрджреЗрд╢ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЧрд░реНрдпреМрдВ рд╕рд┐рд░реНрдЬрдирд╛-рдорд╛рд╕реНрдЯрд░ред рд╣рд╛рдореНрд░реЛ рдорд╛рдорд▓рд╛ рдорд╛, рдпреЛ рдПрдХ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╣реЛ /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"] рдЕрдиреНрддрд░рдХреНрд░рд┐рдпрд╛рдХрд╛ рд▓рд╛рдЧрд┐ рдирд┐рд╢реНрдЪрд┐рдд рддрддреНрд╡рд╣рд░реВ рд╣реБрдиреН рдмрд┐рд▓реНрдбрдорд╛рд╕реНрдЯрд░ред рдкреНрд░рддреНрдпреЗрдХ рдХреБрдЮреНрдЬреАрдХреЛ рд▓рд╛рдЧрд┐, рд╕рдореНрдмрдиреНрдзрд┐рдд рд╡рд╕реНрддреБрд▓рд╛рдИ рдорд╛рдирдХреЛ рд░реВрдкрдорд╛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдЧрд░рд┐рдПрдХреЛ рдЫред

5.2 рдХрд░реНрдордЪрд╛рд░реАрд╣рд░реВ

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

рдпрд╕ рдкрдЯрдХ рд╣рд╛рдореА рд╕рдВрдХреЗрдд рдЧрд░реНрдЫреМрдВ рдмрд┐рд▓реНрдбрдорд╛рд╕реНрдЯрд░-y рдХреЛ тАЛтАЛрд╕реВрдЪреА рдХрд╛рдорджрд╛рд░-sред рдо рдЖрдлреИ рдХрд╛рдорджрд╛рд░ рд╣рд╛рдореАрд▓реЗ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдпреМрдВ рдЙрдЪреНрдЪ, рд╕рдВрдХреЗрдд рдЧрд░реНрджреИ рддрдкрд╛рдИрдВ-рдХрд╛рдорджрд╛рд░-рдирд╛рдо ╨╕ рдкрд╛рд╕рд╡рд░реНрдбред рдЕрдм рддрд┐рдиреАрд╣рд░реВрдХреЛ рд╕рдЯреНрдЯрд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ рдЙрджрд╛рд╣рд░рдг - рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ ╨╕ рдкрд╛рд░рд┐рдд .

5.3 рдкрд░рд┐рд╡рд░реНрддрди_рд╕реНрд░реЛрдд

c['change_source'] = []
c['change_source'].append(changes.GitPoller(
                            'git://github.com/buildbot/hello-world.git',
                             workdir='gitpoller-workdir', branch='master',
                             pollInterval=300))                

рдХреБрдЮреНрдЬреА рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рд╡рд░реНрддрди_рд╕реНрд░реЛрдд рд╢рдмреНрджрдХреЛрд╢ c рд╣рд╛рдореА рд╕реВрдЪреАрдорд╛ рдкрд╣реБрдБрдЪ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрдЫреМрдВ рдЬрд╣рд╛рдБ рд╣рд╛рдореА рдкрд░рд┐рдпреЛрдЬрдирд╛рдХреЛ рд╕реНрд░реЛрдд рдХреЛрдбрдХреЛ рд╕рд╛рде рднрдгреНрдбрд╛рд░рдорд╛ рдорддрджрд╛рди рдЧрд░реНрдиреЗ рд╡рд╕реНрддреБ рд░рд╛рдЦреНрди рдЪрд╛рд╣рдиреНрдЫреМрдВред рдЙрджрд╛рд╣рд░рдгрд▓реЗ Git рднрдгреНрдбрд╛рд░ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджрдЫ рдЬреБрди рдирд┐рд╢реНрдЪрд┐рдд рдЕрдиреНрддрд░рд╛рд▓рд╣рд░реВрдорд╛ рдкреЛрд▓ рдЧрд░рд┐рдиреНрдЫред

рдкрд╣рд┐рд▓реЛ рддрд░реНрдХ рддрдкрд╛рдИрдХреЛ рднрдгреНрдбрд╛рд░рдХреЛ рдмрд╛рдЯреЛ рд╣реЛред

workdir рдЫреЗрдЙрдорд╛ рднрдПрдХреЛ рдлреЛрд▓реНрдбрд░рдХреЛ рдмрд╛рдЯреЛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдЧрд░реНрджрдЫ рдХрд╛рдорджрд╛рд░- рдмрд╛рдЯреЛ рдХреЛ рд╕рд╛рдкреЗрдХреНрд╖ /home/habr/worker/yourProject/build git рднрдгреНрдбрд╛рд░рдХреЛ рд╕реНрдерд╛рдиреАрдп рд╕рдВрд╕реНрдХрд░рдг рднрдгреНрдбрд╛рд░рдг рдЧрд░реНрдиреЗрдЫред

рд╕рд╛рдЦрд╛ рднрдгреНрдбрд╛рд░рдорд╛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╢рд╛рдЦрд╛ рд╕рдорд╛рд╡реЗрд╢ рдЧрд░реНрджрдЫ рдЬреБрди рдЕрдиреБрд╕рд░рдг рдЧрд░реНрдиреБрдкрд░реНрдЫред

pollInterval рдкрдЫрд┐ рд╕реЗрдХреЗрдиреНрдб рдХреЛ рд╕рдВрдЦреНрдпрд╛ рд╕рдорд╛рд╡реЗрд╢ рдЧрд░реНрджрдЫ рдмрд┐рд▓реНрдбрдорд╛рд╕реНрдЯрд░ рдкрд░рд┐рд╡рд░реНрддрдирд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рднрдгреНрдбрд╛рд░ рдкреЛрд▓ рдЧрд░реНрдиреЗрдЫред

рдкрд░рд┐рдпреЛрдЬрдирд╛рдХреЛ рднрдгреНрдбрд╛рд░рдорд╛ рдкрд░рд┐рд╡рд░реНрддрдирд╣рд░реВ рдЯреНрд░реНрдпрд╛рдХ рдЧрд░реНрди рдзреЗрд░реИ рддрд░рд┐рдХрд╛рд╣рд░реВ рдЫрдиреНред

рд╕рдмреИрднрдиреНрджрд╛ рд╕рд░рд▓ рддрд░рд┐рдХрд╛ рд╣реЛ рдорддрджрд╛рди, рдЬрд╕рдХреЛ рдЕрд░реНрде рд╣реБрдиреНрдЫ рдмрд┐рд▓реНрдбрдорд╛рд╕реНрдЯрд░ рдЖрд╡рдзрд┐рдХ рд░реВрдкрдорд╛ рднрдгреНрдбрд╛рд░ рд╕рдВрдЧ рд╕рд░реНрднрд░ рдорддрджрд╛рди рдЧрд░реНрджрдЫред рдпрджрд┐ рдкреНрд░рддрд┐рдмрджреНрдз рд░рд┐рдкреЛрдЬрд┐рдЯрд░реА рдорд╛ рдкрд░рд┐рд╡рд░реНрддрди рдкреНрд░рддрд┐рдмрд┐рдореНрдмрд┐рдд, рддреНрдпрд╕рдкрдЫрд┐ рдмрд┐рд▓реНрдбрдорд╛рд╕реНрдЯрд░ рдХреЗрд╣рд┐ рдврд┐рд▓рд╛рдЗ рд╕рдВрдЧ рдПрдХ рдЖрдиреНрддрд░рд┐рдХ рд╡рд╕реНрддреБ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреЗрдЫ рдкрд░рд┐рд╡рд░реНрддрди рд░ рдШрдЯрдирд╛ рд╣реНрдпрд╛рдиреНрдбрд▓рд░рд▓рд╛рдИ рдкрдард╛рдЙрдиреБрд╣реЛрд╕реН рдЕрдиреБрд╕реВрдЪреА, рдЬрд╕рд▓реЗ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдирд┐рд░реНрдорд╛рдг рд░ рдкрд░реАрдХреНрд╖рдг рдЧрд░реНрди рдЪрд░рдгрд╣рд░реВ рд╕реБрд░реВ рдЧрд░реНрдиреЗрдЫ рдХрд╛рдорджрд╛рд░-рдИред рдпреА рдЪрд░рдгрд╣рд░реВ рдмреАрдЪ рд╕рдВрдХреЗрдд рдЧрд░рд┐рдиреЗрдЫ рдЕрджреНрдпрд╛рд╡рдзрд┐рдХ рднрдгреНрдбрд╛рд░ред рдареНрдпрд╛рдХреНрдХреИ рдорд╛ рдХрд╛рдорджрд╛рд░рдпрд╕рд▓реЗ рднрдгреНрдбрд╛рд░рдХреЛ рд╕реНрдерд╛рдиреАрдп рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреЗрдЫред рдпрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдХреЛ рд╡рд┐рд╡рд░рдг рддрд▓ рдЕрд░реНрдХреЛ рджреБрдИ рдЦрдгреНрдбрд╣рд░реВрдорд╛ рд╕рдореЗрдЯрд┐рдиреЗрдЫред (5.4 ╨╕ 5.5).

рд░рд┐рдкреЛрдЬрд┐рдЯрд░реАрдорд╛ рдкрд░рд┐рд╡рд░реНрддрдирд╣рд░реВ рдЯреНрд░реНрдпрд╛рдХ рдЧрд░реНрдиреЗ рдЕрдЭ рд░рд╛рдореНрд░реЛ рддрд░рд┐рдХрд╛ рднрдиреЗрдХреЛ рд╕рд░реНрднрд░рдмрд╛рдЯ рд╕реАрдзрд╛ рд╕рдиреНрджреЗрд╢рд╣рд░реВ рдкрдард╛рдЙрдиреБ рд╣реЛред рдмрд┐рд▓реНрдбрдорд╛рд╕реНрдЯрд░- рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реНрд░реЛрдд рдХреЛрдб рдкрд░рд┐рд╡рд░реНрддрди рдмрд╛рд░реЗред рдпрд╕ рдЕрд╡рд╕реНрдерд╛рдорд╛, рд╡рд┐рдХрд╛рд╕рдХрд░реНрддрд╛рд▓реЗ рдмрдирд╛рдЗрдиреЗ рдмрд┐рддреНрддрд┐рдХреИ рдкреНрд░рддрд┐рдмрджреНрдз, рдкрд░рд┐рдпреЛрдЬрдирд╛ рднрдгреНрдбрд╛рд░ рднрдПрдХреЛ рд╕рд░реНрднрд░рд▓реЗ рд╕рдиреНрджреЗрд╢ рдкрдард╛рдЙрдиреЗрдЫ рдмрд┐рд▓реНрдбрдорд╛рд╕реНрдЯрд░-yред рд░ рдЙрд╕рд▓реЗ, рдмрд╛рд░реАрдорд╛, рд╡рд╕реНрддреБ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реЗрд░ рдпрд╕рд▓рд╛рдИ рдЕрд╡рд░реЛрдз рдЧрд░реНрдиреЗрдЫ PBCchange рд╕реНрд░реЛрддред рдЕрд░реНрдХреЛ, рдпреЛ рд╡рд╕реНрддреБ рд╣рд╕реНрддрд╛рдиреНрддрд░рдг рдЧрд░рд┐рдиреЗрдЫ рдЕрдиреБрд╕реВрдЪреА, рдЬрд╕рд▓реЗ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдирд┐рд░реНрдорд╛рдг рд░ рдкрд░реАрдХреНрд╖рдг рдЧрд░реНрди рдЪрд░рдгрд╣рд░реВ рд╕рдХреНрд░рд┐рдп рдЧрд░реНрджрдЫред рдпреЛ рд╡рд┐рдзрд┐ рдХреЛ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рднрд╛рдЧ рд╕рдВрдЧ рдХрд╛рдо рдЫ рд╣реБрдХ- рднрдгреНрдбрд╛рд░рдорд╛ рд╕рд░реНрднрд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯрд╣рд░реВред рд╕реНрдХреНрд░рд┐рдкреНрдЯрдорд╛ рд╣реБрдХ-рдП, рдкреНрд░рд╢реЛрдзрди рдХрд╛рд░реНрдпрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рдЬрд┐рдореНрдореЗрд╡рд╛рд░ рдЬрдм рдкреНрд░рддрд┐рдмрджреНрдз-рдИ, рддрдкрд╛рдИрдВрд▓реЗ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХрд▓ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ рдкрдард╛рдЙрдиреЗ рдкрд░рд┐рд╡рд░реНрддрди рд░ рдиреЗрдЯрд╡рд░реНрдХ рдареЗрдЧрд╛рдирд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЧрд░реНрдиреБрд╣реЛрд╕реН рдмрд┐рд▓реНрдбрдорд╛рд╕реНрдЯрд░-рдПред рддрдкрд╛рдИрдВрд▓реЗ рд╕реБрдиреНрди рд╕рдХреНрдиреЗ рдиреЗрдЯрд╡рд░реНрдХ рдкреЛрд░реНрдЯ рдкрдирд┐ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ PBCchange рд╕реНрд░реЛрдд. PBCchange рд╕реНрд░реЛрдд, рд╡реИрд╕реЗ, рднрд╛рдЧ рд╣реЛ рдмрд┐рд▓реНрдбрдорд╛рд╕реНрдЯрд░-рдПред рдпреЛ рд╡рд┐рдзрд┐рд▓рд╛рдИ рдЕрдиреБрдорддрд┐ рдЪрд╛рд╣рд┐рдиреНрдЫ .-рдП рд╕рд░реНрднрд░рдорд╛ рдЬрд╣рд╛рдБ рдкрд░рд┐рдпреЛрдЬрдирд╛ рднрдгреНрдбрд╛рд░ рдЕрд╡рд╕реНрдерд┐рдд рдЫред рддрдкрд╛рдИрдВрд▓реЗ рдкрд╣рд┐рд▓реЗ рднрдгреНрдбрд╛рд░рдХреЛ рдЬрдЧреЗрдбрд╛ рдмрдирд╛рдЙрди рдЖрд╡рд╢реНрдпрдХ рд╣реБрдиреЗрдЫред

5.4 рдЕрдиреБрд╕реВрдЪрдХрд╣рд░реВ


c['schedulers'] = []
c['schedulers'].append(schedulers.SingleBranchScheduler(
        name="all",
        change_filter=util.ChangeFilter(branch='master'),
        treeStableTimer=None,
        builderNames=["runtests"]))
c['schedulers'].append(schedulers.ForceScheduler(
        name="force",
        builderNames=["runtests"]))

рдЕрдиреБрд╕реВрдЪрдХрд╣рд░реВ - рдпреЛ рдПрдХ рддрддреНрд╡ рд╣реЛ рдЬрд╕рд▓реЗ рдЯреНрд░рд┐рдЧрд░рдХреЛ рд░реВрдкрдорд╛ рдХрд╛рд░реНрдп рдЧрд░реНрджрдЫ рдЬрд╕рд▓реЗ рдкрд░рд┐рдпреЛрдЬрдирд╛рдХреЛ рд╡рд┐рдзрд╛рдирд╕рднрд╛ рд░ рдкрд░реАрдХреНрд╖рдгрдХреЛ рд╕рдореНрдкреВрд░реНрдг рд╢реНрд░реГрдВрдЦрд▓рд╛ рд╕реБрд░реБ рдЧрд░реНрджрдЫред
BuildBot рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдирд┐рд░рдиреНрддрд░ рдПрдХреАрдХрд░рдг рд▓рд╛рдЧреВ рдЧрд░реНрдиреЗ рдЙрджрд╛рд╣рд░рдг

рддреА рдкрд░рд┐рд╡рд░реНрддрдирд╣рд░реВ рд░реЗрдХрд░реНрдб рдЧрд░рд┐рдПрдХрд╛ рдерд┐рдП рдкрд░рд┐рд╡рд░реНрддрди_рд╕реНрд░реЛрдд, рдХрд╛рдо рдХреЛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдорд╛ рд░реВрдкрд╛рдиреНрддрд░рдг BuildBot- рдПрдХ рдЖрдкрддреНрддрд┐ рдкрд░рд┐рд╡рд░реНрддрди рд░ рдЕрдм рд╣рд░реЗрдХ рд╢реЗрдбреНрдпреБрд▓рд░ рддрд┐рдиреАрд╣рд░реВрдХреЛ рдЖрдзрд╛рд░рдорд╛, рдпрд╕рд▓реЗ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдирд┐рд░реНрдорд╛рдг рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реБрд░реБ рдЧрд░реНрди рдЕрдиреБрд░реЛрдзрд╣рд░реВ рдмрдирд╛рдЙрдБрдЫред рдпрджреНрдпрдкрд┐, рдпрд╕рд▓реЗ рдпреЛ рдкрдирд┐ рдирд┐рд░реНрдзрд╛рд░рдг рдЧрд░реНрджрдЫ рдХрд┐ рдХрд╣рд┐рд▓реЗ рдпреА рдЕрдиреБрд░реЛрдзрд╣рд░реВ рд▓рд╛рдордорд╛ рдердк рд╣рд╕реНрддрд╛рдиреНрддрд░рдг рд╣реБрдиреНрдЫрдиреНред рдПрдЙрдЯрд╛ рд╡рд╕реНрддреБ рдирд┐рд░реНрдорд╛рддрд╛ рдЕрдиреБрд░реЛрдзрд╣рд░реВрдХреЛ рд▓рд╛рдо рднрдгреНрдбрд╛рд░ рдЧрд░реНрджрдЫ рд░ рд╣рд╛рд▓рдХреЛ рд╡рд┐рдзрд╛рдирд╕рднрд╛рдХреЛ рдЕрд╡рд╕реНрдерд╛рд▓рд╛рдИ рдЫреБрдЯреНрдЯреИ рдорд╛ рдЯреНрд░реНрдпрд╛рдХ рдЧрд░реНрджрдЫ рдХрд╛рдорджрд╛рд░-рдИред рдирд┐рд░реНрдорд╛рддрд╛ рдорд╛ рдЕрд╡рд╕реНрдерд┐рдд рдЫ рдмрд┐рд▓реНрдбрдорд╛рд╕реНрдЯрд░- e рд░ on рдХрд╛рдорджрд╛рд░-рдИред рд╕рд╛рде рдкрдард╛рдЙрдБрдЫрдиреН рдмрд┐рд▓реНрдбрдорд╛рд╕реНрдЯрд░- рдПрдХ рдорд╛ рдХрд╛рдорджрд╛рд░- рд░ рдкрд╣рд┐рд▓реЗ рдиреИ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдирд┐рд░реНрдорд╛рдг - рдкрдЫреНрдпрд╛рдЙрдиреБ рдкрд░реНрдиреЗ рдЪрд░рдгрд╣рд░реВрдХреЛ рд╢реНрд░реГрдВрдЦрд▓рд╛ред
рдЕрд╣рд┐рд▓реЗрдХреЛ рдЙрджрд╛рд╣рд░рдгрдорд╛ рд╣рд╛рдореАрд▓реЗ рджреЗрдЦреЗрдХрд╛ рдЫреМрдВ рдЕрдиреБрд╕реВрдЪрдХрд╣рд░реВ 2 рдЯреБрдХреНрд░рд╛рд╣рд░реВ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░рд┐рдПрдХрд╛ рдЫрдиреНред рдпрд╕рдмрд╛рд╣реЗрдХ, рдкреНрд░рддреНрдпреЗрдХрдХреЛ рдЖрдлреНрдиреИ рдкреНрд░рдХрд╛рд░ рдЫред

рдПрдХрд▓ рд╢рд╛рдЦрд╛ рддрд╛рд▓рд┐рдХрд╛ - рддрд╛рд▓рд┐рдХрд╛рдорд╛ рд╕рдмреИрднрдиреНрджрд╛ рд▓реЛрдХрдкреНрд░рд┐рдп рдХрдХреНрд╖рд╛рд╣рд░реВ рдордзреНрдпреЗ рдПрдХред рдпрд╕рд▓реЗ рдПрдЙрдЯрд╛ рд╢рд╛рдЦрд╛ рд╣реЗрд░реНрдЫ рд░ рдпрд╕рдорд╛ рд░реЗрдХрд░реНрдб рдЧрд░рд┐рдПрдХреЛ рдкрд░рд┐рд╡рд░реНрддрдирджреНрд╡рд╛рд░рд╛ рдЯреНрд░рд┐рдЧрд░ рд╣реБрдиреНрдЫред рдЬрдм рдЙрд╕рд▓реЗ рдкрд░рд┐рд╡рд░реНрддрдирд╣рд░реВ рджреЗрдЦреНрдЫ, рдЙрд╕рд▓реЗ рдирд┐рд░реНрдорд╛рдг рдЕрдиреБрд░реЛрдз рдкрдард╛рдЙрди рдврд┐рд▓рд╛рдЗ рдЧрд░реНрди рд╕рдХреНрдЫ (рд╡рд┐рд╢реЗрд╖ рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░рдорд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЕрд╡рдзрд┐рдХреЛ рд▓рд╛рдЧрд┐ рд╕реНрдердЧрд┐рдд рдЧрд░реНрдиреБрд╣реЛрд╕реНред рдЯреНрд░реАрд╕реНрдЯреЗрдмрд▓ рдЯрд╛рдЗрдорд░)ред IN рдирд╛рдо рдорд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реБрдиреЗ рддрд╛рд▓рд┐рдХрд╛рдХреЛ рдирд╛рдо рд╕реЗрдЯ рдЧрд░реНрджрдЫ BuildBot- рд╡реЗрдм рдЗрдиреНрдЯрд░рдлреЗрд╕ред IN рдлрд┐рд▓реНрдЯрд░ рдкрд░рд┐рд╡рд░реНрддрди рдЧрд░реНрдиреБрд╣реЛрд╕реН рдПрдХ рдлрд┐рд▓реНрдЯрд░ рд╕реЗрдЯ рдЧрд░рд┐рдПрдХреЛ рдЫ, рдкрд╛рд╕ рдЧрд░реЗрдкрдЫрд┐ рд╢рд╛рдЦрд╛рдорд╛ рдХреБрди рдкрд░рд┐рд╡рд░реНрддрдирд╣рд░реВ рдирд┐рд░реНрдорд╛рдгрдХреЛ рд▓рд╛рдЧрд┐ рдЕрдиреБрд░реЛрдз рдкрдард╛рдЙрди рддрд╛рд▓рд┐рдХрд╛рд▓рд╛рдИ рдкреНрд░реЛрдореНрдкреНрдЯ рдЧрд░реНрджрдЫред IN рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛ рдирд╛рдорд╣рд░реВ рдирд╛рдо рдЙрд▓реНрд▓реЗрдЦ рдЧрд░рд┐рдПрдХреЛ рдЫ рдирд┐рд░реНрдорд╛рддрд╛-a, рдЬреБрди рд╣рд╛рдореА рдХреЗрд╣рд┐ рдкрдЫрд┐ рд╕реЗрдЯ рдЧрд░реНрдиреЗрдЫреМрдВред рд╣рд╛рдореНрд░реЛ рдорд╛рдорд▓рд╛ рдорд╛ рдирд╛рдо рдкрд░рд┐рдпреЛрдЬрдирд╛ рдирд╛рдо рдЬрд╕реНрддреИ рд╣реБрдиреЗрдЫ: рддрдкрд╛рдИрдВрдХреЛ рдкрд░рд┐рдпреЛрдЬрдирд╛.

рдлреЛрд░реНрд╕ рд╢реЗрдбреНрдпреБрд▓рд░ рдзреЗрд░реИ рд╕рд╛рдзрд╛рд░рдг рдХреБрд░рд╛ред рдпрд╕ рдкреНрд░рдХрд╛рд░рдХреЛ рддрд╛рд▓рд┐рдХрд╛ рдорд╛рдЙрд╕ рдХреНрд▓рд┐рдХ рдереНрд░реБ рджреНрд╡рд╛рд░рд╛ рдЯреНрд░рд┐рдЧрд░ рдЧрд░рд┐рдПрдХреЛ рдЫ BuildBot- рд╡реЗрдм рдЗрдиреНрдЯрд░рдлреЗрд╕ред рдорд╛рдкрджрдгреНрдбрд╣рд░реВ рдорд╛ рдЬрд╕реНрддреИ рд╕рд╛рд░ рдЫ рдПрдХрд▓ рд╢рд╛рдЦрд╛ рддрд╛рд▓рд┐рдХрд╛.

PS рдирдореНрдмрд░ 3ред рд╕рд╛рдпрдж рдпреЛ рдХрд╛рдордорд╛ рдЖрдЙрдиреЗрдЫ
рдЖрд╡рдзрд┐рдХ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдордп-рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдЖрд╡реГрддреНрддрд┐рдорд╛ рдЪрд▓реНрдиреЗ рддрд╛рд▓рд┐рдХрд╛ рд╣реЛред рдХрд▓ рдХреЗрд╣рд┐ рдпрд╕реНрддреЛ рджреЗрдЦрд┐рдиреНрдЫ


from buildbot.plugins import schedulers
nightly = schedulers.Periodic(name="daily",
                              builderNames=["full-solaris"],
                              periodicBuildTimer=24*60*60)
c['schedulers'] = [nightly]                    

5.5 рдирд┐рд░реНрдорд╛рдг рдХрд╛рд░рдЦрд╛рдирд╛


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": "."}))

рдЖрд╡рдзрд┐рдХ рдирд┐рд░реНрдорд╛рдг рдЯрд╛рдЗрдорд░ рд╕реЗрдХреЗрдиреНрдбрдорд╛ рдпреЛ рдЖрд╡рдзрд┐рдХрддрд╛рдХреЛ рд╕рдордп рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЧрд░реНрджрдЫред

рдирд┐рд░реНрдорд╛рдг рдХрд╛рд░рдЦрд╛рдирд╛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрджрдЫ рдирд┐рд░реНрдорд╛рдг, рддреНрдпрд╕рдкрдЫрд┐ рдирд┐рд░реНрдорд╛рддрд╛ рдорд╛ рдкрдард╛рдЙрдБрдЫ рдХрд╛рдорджрд╛рд░ред рдХреЛ рдирд┐рд░реНрдорд╛рдг рдХрд╛рд░рдЦрд╛рдирд╛ рдкрдЫреНрдпрд╛рдЙрдиреЗ рдЪрд░рдгрд╣рд░реВ рд╕рдВрдХреЗрдд рдЧрд░реНрджрдЫ рдХрд╛рдорджрд╛рд░-yред рд╡рд┐рдзрд┐ рдХрд▓ рдЧрд░реЗрд░ рдЪрд░рдгрд╣рд░реВ рдердкрд┐рдПрдХрд╛ рдЫрдиреН addStep

рдпрд╕ рдЙрджрд╛рд╣рд░рдгрдорд╛ рдкрд╣рд┐рд▓реЛ рдердкрд┐рдПрдХреЛ рдЪрд░рдг рд╣реЛ git рдХреНрд▓реАрди -d -f -f -xрддреНрдпрд╕реЛ рднрдП git рдЪреЗрдХрдЖрдЙрдЯред рдпреА рдХрд╛рд░реНрдпрд╣рд░реВ рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░рдорд╛ рд╕рдорд╛рд╡реЗрд╢ рдЫрдиреН рд╡рд┐рдзрд┐, рдЬреБрди рд╕реНрдкрд╖реНрдЯ рд░реВрдкрдорд╛ рднрдирд┐рдПрдХреЛ рдЫреИрди рддрд░ рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдорд╛рдирд▓рд╛рдИ рд╕рдВрдХреЗрдд рдЧрд░реНрджрдЫ рддрд╛рдЬрд╛... рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░ рдореЛрдб = 'рдмреГрджреНрдзрд┐рд╢реАрд▓' рд╕рдВрдХреЗрдд рдЧрд░реНрджрдЫ рдХрд┐ рдлрд╛рдЗрд▓рд╣рд░реВ рдбрд╛рдЗрд░реЗрдХреНрдЯрд░реАрдмрд╛рдЯ рд╣реЛ рдЬрд╣рд╛рдБ рдЪреЗрдХрдЖрдЙрдЯ, рднрдгреНрдбрд╛рд░рдмрд╛рдЯ рд╣рд░рд╛рдЗрд░рд╣реЗрдХреЛ рдмреЗрд▓рд╛, рдЕрдЫреБрддреЛ рд░рд╣рдиреБрд╣реЛрд╕реНред

рджреЛрд╕реНрд░реЛ рдердкрд┐рдПрдХреЛ рдЪрд░рдг рд▓рд┐рдкрд┐ рдХрд▓ рдЧрд░реНрджреИрдЫ рдкрд░реАрдХреНрд╖рдг рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░ рд╕рдВрдЧ рдирдорд╕реНрддреЗ рдЫреЗрдЙрдорд╛ рдХрд╛рдорджрд╛рд░- рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдмрд╛рдЯ /home/habr/worker/yourProject/build рдкрд░рд┐рд╡реЗрд╢ рдЪрд░ PATHONPATH=... рдпрд╕рд░реА, рддрдкрд╛рдИрдВрд▓реЗ рдЖрдлреНрдиреИ рд▓рд┐рдкрд┐рд╣рд░реВ рд▓реЗрдЦреНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ рд░ рддрд┐рдиреАрд╣рд░реВрд▓рд╛рдИ рдЫреЗрдЙрдорд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред рдХрд╛рдорджрд╛рд░- рд╣рд░реЗрдХ рдХрджрдо util.ShellCommandред рдпреА рд╕реНрдХреНрд░рд┐рдкреНрдЯрд╣рд░реВ рд╕рд┐рдзреИ рднрдгреНрдбрд╛рд░рдорд╛ рд░рд╛рдЦреНрди рд╕рдХрд┐рдиреНрдЫред рддреНрдпрд╕рдкрдЫрд┐ рдорд╛ рдЪреЗрдХрдЖрдЙрдЯ-рдИ рддрд┐рдиреАрд╣рд░реВ рдорд╛ рдкрд░реНрдиреЗрдЫ /home/habr/worker/yourProject/buildред рдпрджреНрдпрдкрд┐, рддреНрдпрд╕рдкрдЫрд┐ рддреНрдпрд╣рд╛рдБ рджреБрдИ "рддрд░" рдЫрдиреН:

  1. рдХрд╛рдорджрд╛рд░ рдПрдХ рдХреБрдЮреНрдЬреА рд╕рдВрдЧ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреБрдкрд░реНрдЫ --рдЙрдорд╛рд╕реНрдХ рддрд╛рдХрд┐ рдпрд╕рд▓реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЕрдзрд┐рдХрд╛рд░рд╣рд░реВ рдкрдЫрд┐ рд░реЛрдХреНрджреИрди рдЪреЗрдХрдЖрдЙрдЯ-рдПред
  2. рдорд╛ git рдзрдХреНрдХрд╛-рдИ рдпреА рд▓рд┐рдкрд┐рд╣рд░реВ рдордзреНрдпреЗ рддрдкрд╛рдИрдВрд▓реЗ рдЧреБрдг рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдирдпреЛрдЧреНрдпрддреНрдпрд╕реИрд▓реЗ рдкрдЫрд┐ рдЪреЗрдХрдЖрдЙрдЯ-e рд▓реЗ Git рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЧрд░реНрдиреЗ рдЕрдзрд┐рдХрд╛рд░ рдЧреБрдорд╛рдПрдХреЛ рдЫреИрдиред

5.6 рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛рд╣рд░реВ


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

рдХреЗ рд╣реЛ рднрдиреНрдиреЗ рдмрд╛рд░реЗ рдирд┐рд░реНрдорд╛рддрд╛ рднрдирд┐рдПрдХреЛ рдерд┐рдпреЛ рдпрд╣рд╛рдБред рдЕрдм рдо рдпрд╕рд▓рд╛рдИ рдХрд╕рд░реА рдмрдирд╛рдЙрдиреЗ рдмрд╛рд░реЗ рдердк рд╡рд┐рд╡рд░рдгрдорд╛ рдмрддрд╛рдЙрдиреЗрдЫреБред BuilderConfig рдПрдХ рдХрдиреНрд╕реНрдЯреНрд░рдХреНрдЯрд░ рд╣реЛ рдирд┐рд░реНрдорд╛рддрд╛ред рддреНрдпрд╕реНрддрд╛ рдбрд┐рдЬрд╛рдЗрдирд░рд╣рд░реВ рдорд╛ c['рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛'] рддрдкрд╛рдИрд▓реЗ рдзреЗрд░реИ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ, рдХрд┐рдирдХрд┐ рдпреЛ рд╡рд╕реНрддреБрд╣рд░реВрдХреЛ рдкрд╛рдирд╛ рд╣реЛ рдирд┐рд░реНрдорд╛рддрд╛ рдкреНрд░рдХрд╛рд░ред рдЕрдм рдмрд╛рдЯ рдЙрджрд╛рд╣рд░рдг рдкреБрди: рд▓реЗрдЦреМрдВ BuildBot, рдпрд╕рд▓рд╛рдИ рд╣рд╛рдореНрд░реЛ рдХрд╛рд░реНрдпрдХреЛ рдирдЬрд┐рдХ рд▓реНрдпрд╛рдЙрдБрджреИред


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

рдЕрдм рдо рддрдкрд╛рдИрдВрд▓рд╛рдИ рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░рд╣рд░реВрдХреЛ рдмрд╛рд░реЗрдорд╛ рдмрддрд╛рдЙрдиреЗрдЫреБ BuilderConfig.

рдирд╛рдо рдирд╛рдо рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЧрд░реНрджрдЫ рдирд┐рд░реНрдорд╛рддрд╛-рдХред рдпрд╣рд╛рдБ рд╣рд╛рдореАрд▓реЗ рдпрд╕рд▓рд╛рдИ рдирд╛рдо рджрд┐рдПрдХрд╛ рдЫреМрдВ рддрдкрд╛рдИрдВрдХреЛ рдкрд░рд┐рдпреЛрдЬрдирд╛... рдпрд╕рдХреЛ рдорддрд▓рдм рдпреЛ рд╣реЛ рдХрд╛рдорджрд╛рд░- рдпреЛ рдмрд╛рдЯреЛ рдмрдирд╛рдЗрдиреЗрдЫ /home/habr/worker/yourProject/build. рд╢реЗрдбреНрдпреБрд▓рд░ рдЦреЛрдЬреНрджреИ рдирд┐рд░реНрдорд╛рддрд╛ рдХреЗрд╡рд▓ рдпреЛ рдирд╛рдо рджреНрд╡рд╛рд░рд╛ред

рдХрд╛рдорджрд╛рд░рдХреЛ рдирд╛рдо рдкрд╛рдирд╛ рд╕рдорд╛рд╡реЗрд╢ рдЧрд░реНрджрдЫ рдХрд╛рдорджрд╛рд░-sред рдЬрд╕рдордзреНрдпреЗ рдкреНрд░рддреНрдпреЗрдХрдорд╛ рдердкрд┐рдиреБрдкрд░реНрдЫ рдЧ['рдХрд╛рдорджрд╛рд░'].

рдХрд╛рд░рдЦрд╛рдирд╛ - рд╡рд┐рд╢рд┐рд╖реНрдЯ рдирд┐рд░реНрдорд╛рдг, рдЬрд╕рд╕рдБрдЧ рдпреЛ рд╕рдореНрдмрдиреНрдзрд┐рдд рдЫ рдирд┐рд░реНрдорд╛рддрд╛ред рдЙрд╕рд▓реЗ рд╡рд╕реНрддреБ рдкрдард╛рдЙрдиреЗрдЫ рдирд┐рд░реНрдорд╛рдг рдорд╛ рдХрд╛рдорджрд╛рд░ рдпрд╕рдорд╛ рд╕рдорд╛рд╡реЗрд╢ рд╕рдмреИ рдЪрд░рдгрд╣рд░реВ рдкреВрд░рд╛ рдЧрд░реНрди рдирд┐рд░реНрдорд╛рдг-рдПред

6. рддрдкрд╛рдИрдВрдХреЛ рдЖрдлреНрдиреИ рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рдирдХреЛ рдЙрджрд╛рд╣рд░рдг

рдпрд╣рд╛рдБ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛рдХреЛ рдЙрджрд╛рд╣рд░рдг рд╣реЛ рдЬреБрди рдореИрд▓реЗ рдорд╛рд░реНрдлрдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЧрд░реНрди рдкреНрд░рд╕реНрддрд╛рд╡ рдЧрд░реЗрдХреЛ рдЫреБ BuildBot
.

рд╣рд╛рдореА рд╕рдВрд╕реНрдХрд░рдг рдирд┐рдпрдиреНрддреНрд░рдг рдкреНрд░рдгрд╛рд▓реАрдХреЛ рд░реВрдкрдорд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗрдЫреМрдВ svnред рднрдгреНрдбрд╛рд░ рдЖрдлреИ рдХреНрд▓рд╛рдЙрдб рдХреЛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдорд╛ рд╕реНрдерд┐рдд рд╣реБрдиреЗрдЫред рдпреЛ рдХреНрд▓рд╛рдЙрдб рдХреЛ рдареЗрдЧрд╛рдирд╛ рдЫ svn.host/svn/yourProject/trunkред рдмрд╛рджрд▓ рдореБрдирд┐рдорд╛ svn рддреНрдпрд╣рд╛рдБ рдПрдХ рдЦрд╛рддрд╛ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо рдЫ: рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛, passwd: рдкрд╛рд╕рд╡рд░реНрдбред рдЪрд░рдгрд╣рд░реВ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдЧрд░реНрдиреЗ рд▓рд┐рдкрд┐рд╣рд░реВ рдирд┐рд░реНрдорд╛рдг-рдП рдкрдирд┐ рд╢рд╛рдЦрд╛рдорд╛ рд╣реБрдиреЗрдЫ svn, рдЫреБрдЯреНрдЯреИ рдлреЛрд▓реНрдбрд░рдорд╛ buildbot/worker_linuxред рдпреА рд╕реНрдХреНрд░рд┐рдкреНрдЯрд╣рд░реВ рднрдгреНрдбрд╛рд░рдгрдорд╛ рд╕реБрд░рдХреНрд╖рд┐рдд рдЧрд░рд┐рдПрдХрд╛ рдЧреБрдгрд╣рд░реВрд╕рдБрдЧ рдЕрд╡рд╕реНрдерд┐рдд рдЫрдиреН рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдпреЛрдЧреНрдп.

рдмрд┐рд▓реНрдбрдорд╛рд╕реНрдЯрд░ ╨╕ рдХрд╛рдорджрд╛рд░ рдПрдЙрдЯреИ рд╣реЛрд╕реНрдЯрдорд╛ рдЪрд▓рд╛рдЙрдиреБрд╣реЛрд╕реН рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╣реЛрд╕реНрдЯ .рдмрд┐рд▓реНрдбрдорд╛рд╕реНрдЯрд░ рдлреЛрд▓реНрдбрд░рдорд╛ рдпрд╕рдХреЛ рдлрд╛рдЗрд▓рд╣рд░реВ рднрдгреНрдбрд╛рд░рдг рдЧрд░реНрджрдЫ /home/habr/master. рдХрд╛рдорджрд╛рд░ рдпрд╕рд▓рд╛рдИ рдирд┐рдореНрди рдорд╛рд░реНрдЧрдорд╛ рднрдгреНрдбрд╛рд░ рдЧрд░рд┐рдПрдХреЛ рдЫ /home/habr/workerред рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕рдВрдЪрд╛рд░ рдмрд┐рд▓реНрдбрдорд╛рд╕реНрдЯрд░-рдП рд░ рдХрд╛рдорджрд╛рд░-рдП рдкреНрд░реЛрдЯреЛрдХрд▓ рдЕрдиреБрд╕рд╛рд░ рдкреЛрд░реНрдЯ 4000 рдорд╛рд░реНрдлрдд рдЧрд░рд┐рдиреНрдЫ BuildBot-рдП, рддреНрдпреЛ рд╣реЛ 'pb' рдкреНрд░реЛрдЯреЛрдХрд▓ред

рд▓рдХреНрд╖реНрдп рдкрд░рд┐рдпреЛрдЬрдирд╛ рдкреВрд░реНрдгрддрдпрд╛ рдкрд╛рдЗрдердирдорд╛ рд▓реЗрдЦрд┐рдПрдХреЛ рдЫред рдХрд╛рд░реНрдп рднрдиреЗрдХреЛ рдпрд╕рдХреЛ рдкрд░рд┐рд╡рд░реНрддрдирд╣рд░реВ рдЯреНрд░реНрдпрд╛рдХ рдЧрд░реНрдиреБ, рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдирдпреЛрдЧреНрдп рдлрд╛рдЗрд▓ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреБ, рдХрд╛рдЧрдЬрд╛рддрд╣рд░реВ рдЙрддреНрдкрдиреНрди рдЧрд░реНрдиреБ, рд░ рдкрд░реАрдХреНрд╖рдг рд╕рдЮреНрдЪрд╛рд▓рди рдЧрд░реНрдиреБ рд╣реЛред рдЕрд╕рдлрд▓рддрд╛рдХреЛ рдЕрд╡рд╕реНрдерд╛рдорд╛, рд╕рдмреИ рд╡рд┐рдХрд╛рд╕рдХрд░реНрддрд╛рд╣рд░реВрд▓реЗ рдИрдореЗрд▓ рдорд╛рд░реНрдлрдд рд╕рдиреНрджреЗрд╢ рдкрдард╛рдЙрди рдЖрд╡рд╢реНрдпрдХ рдЫ рдХрд┐ рддреНрдпрд╣рд╛рдБ рдЕрд╕рдлрд▓ рдХрд╛рд░реНрдп рд╣реЛред

рд╡реЗрдм рдкреНрд░рджрд░реНрд╢рди BuildBot рд╣рд╛рдореА рдкреЛрд░реНрдЯ 80 рдорд╛ рдЬрдбрд╛рди рдЧрд░реНрдиреЗрдЫреМрдВ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╣реЛрд╕реНрдЯред Apatch рд╕реНрдерд╛рдкрдирд╛ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫреИрдиред рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ рдПрдХ рднрд╛рдЧ рдХреЛ рд░реВрдк рдорд╛ рдореБрдб рддреНрдпрд╣рд╛рдБ рдкрд╣рд┐рд▓реЗ рдиреИ рд╡реЗрдм рд╕рд░реНрднрд░ рдЫ, BuildBot рдпрд╕рд▓рд╛рдИ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджрдЫред

рдХреЛ рд▓рд╛рдЧрд┐ рдЖрдиреНрддрд░рд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рднрдгреНрдбрд╛рд░рдг рдЧрд░реНрди BuildBot ╨╕╤Б╨┐╨╛╨╗╤М╨╖╨╛╨▓╨░╤В╤М ╨╕╤Б╨┐╨╛╨╗╤М╨╖╨╛╨▓╨░╤В╤М sqlite.

рдореЗрд▓рд┐рдЩрдХрд╛ рд▓рд╛рдЧрд┐ рд╣реЛрд╕реНрдЯ рдЪрд╛рд╣рд┐рдиреНрдЫ smtp.your.domain - рдпрд╕рд▓реЗ рдореЗрд▓рдмрд╛рдЯ рдкрддреНрд░рд╣рд░реВ рдкрдард╛рдЙрди рдЕрдиреБрдорддрд┐ рджрд┐рдиреНрдЫ [рдИрдореЗрд▓ рд╕реБрд░рдХреНрд╖рд┐рдд] рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдмрд┐рдирд╛ред рд╣реЛрд╕реНрдЯрдорд╛ рдкрдирд┐'рдПрд╕рдПрдордЯреАрдкреА ' рдорд┐рдиреЗрдЯ рдкреЛрд╕реНрдЯ 1025 рдорд╛ рд╕реБрдиреБрд╡рд╛рдЗ рднрдЗрд░рд╣реЗрдХреЛ рдЫред

рддреНрдпрд╣рд╛рдБ рджреБрдИ рд╡реНрдпрдХреНрддрд┐рд╣рд░реВ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдорд╛ рд╕рдВрд▓рдЧреНрди рдЫрдиреН: . ╨╕ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛ред рдкреНрд░рд╢рд╛рд╕рдХ рдкреНрд░рд╢рд╛рд╕рдХ BuildBotред рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд░рддрд┐рдмрджреНрдз рд╡реНрдпрдХреНрддрд┐ рд╣реЛ рдкреНрд░рддрд┐рдмрджреНрдз-sред

рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдирдпреЛрдЧреНрдп рдлрд╛рдЗрд▓ рдорд╛рд░реНрдлрдд рдЙрддреНрдкрдиреНрди рд╣реБрдиреНрдЫ рдкрд╛рдЗрдЗрдиреНрд╕реНрдЯрд▓рд░ред рдХрд╛рдЧрдЬрд╛рдд рдорд╛рд░реНрдлрдд рдЙрддреНрдкрдиреНрди рд╣реБрдиреНрдЫ рдбрдХреНрд╕рд┐рдЬрди.

рдпрд╕ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛рдХреЛ рд▓рд╛рдЧрд┐ рдореИрд▓реЗ рдпреЛ рд▓реЗрдЦреЗ: 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"
}

рдкрд╣рд┐рд▓реЗ рддрдкрд╛рдЗрдБрд▓рд╛рдИ рдЪрд╛рд╣рд┐рдиреНрдЫ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреБрд╣реЛрд╕реН рдмрд┐рд▓реНрдбрдорд╛рд╕реНрдЯрд░-рдП рд░ рдХрд╛рдорджрд╛рд░-рдХред рддреНрдпрд╕рдкрдЫрд┐ рдпреЛ рдлрд╛рдЗрд▓ рдЯрд╛рдБрд╕реНрдиреБрд╣реЛрд╕реН master.cfg ╨▓ /home/habr/master.

рдЕрд░реНрдХреЛ рдЪрд░рдг рд╕реЗрд╡рд╛ рд╕реБрд░реБ рдЧрд░реНрди рд╣реЛ рдмрд┐рд▓реНрдбрдорд╛рд╕реНрдЯрд░a


sudo buildbot start /home/habr/master

рддреНрдпрд╕рдкрдЫрд┐ рд╕реЗрд╡рд╛ рд╕реБрд░реБ рдЧрд░реНрдиреБрд╣реЛрд╕реН рдХрд╛рдорджрд╛рд░-a


buildbot-worker start /home/habr/worker

рддрдпрд╛рд░! рдЕрдм рдмрд┐рд▓реНрдбрдмреЛрдЯ рдкрд░рд┐рд╡рд░реНрддрдирд╣рд░реВ рдЯреНрд░реНрдпрд╛рдХ рдЧрд░реНрдиреЗрдЫ рд░ рдЯреНрд░рд┐рдЧрд░ рдЧрд░реНрдиреЗрдЫ рдкреНрд░рддрд┐рдмрджреНрдз- y рдорд╛ svn, рдорд╛рдерд┐рдХреЛ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛рдХреЛ рд╕рд╛рде рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдирд┐рд░реНрдорд╛рдг рд░ рдкрд░реАрдХреНрд╖рдгрдХреЛ рдЪрд░рдгрд╣рд░реВ рдкреНрд░рджрд░реНрд╢рди рдЧрд░реНрджреИред

рддрд▓ рдо рдорд╛рдерд┐рдХрд╛ рдХреЗрд╣реА рд╡рд┐рд╢реЗрд╖рддрд╛рд╣рд░реВ рд╡рд░реНрдгрди рдЧрд░реНрдиреЗрдЫреБ master.cfgред

6.1 рддрдкрд╛рдИрдВрдХреЛ master.cfg рдЬрд╛рдиреЗ рдмрд╛рдЯреЛрдорд╛


рд▓реЗрдЦреНрджрд╛ рдореЗрд░реЛ master.cfg рдзреЗрд░реИ рддреНрд░реБрдЯрд┐рд╣рд░реВ рдмрдирд╛рдЗрдиреЗрдЫрдиреН, рддреНрдпрд╕реИрд▓реЗ рд▓рдЧ рдлрд╛рдЗрд▓ рдкрдвреНрди рдЖрд╡рд╢реНрдпрдХ рд╣реБрдиреЗрдЫред рдХреЛ рд░реВрдкрдорд╛ рднрдгреНрдбрд╛рд░ рдЧрд░рд┐рдПрдХреЛ рдЫ рдмрд┐рд▓реНрдбрдорд╛рд╕реНрдЯрд░-рдИрд╕реА рдирд┐рд░рдкреЗрдХреНрд╖ рдорд╛рд░реНрдЧ /home/habr/master/twistd.log, рд░ рдЫреЗрдЙрдорд╛ рдХрд╛рдорджрд╛рд░- рдирд┐рд░рдкреЗрдХреНрд╖ рдорд╛рд░реНрдЧ рд╕рдВрдЧ /home/habr/worker/twistd.logред рддрдкрд╛рдИрдВрд▓реЗ рддреНрд░реБрдЯрд┐ рдкрдвреНрдиреБрднрдпреЛ рд░ рдпрд╕рд▓рд╛рдИ рдареАрдХ рдЧрд░реНрдиреБрднрдпреЛ, рддрдкрд╛рдИрдВрд▓реЗ рд╕реЗрд╡рд╛ рдкреБрди: рд╕реБрд░реБ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рд╣реБрдиреЗрдЫ рдмрд┐рд▓реНрдбрдорд╛рд╕реНрдЯрд░-рдПред рдпрд╣рд╛рдБ рдпреЛ рдХрд╕рд░реА рдЧрд░рд┐рдиреНрдЫ:


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_alwaystruk рдирд┐рдпрдорд╣рд░реВ рд╕реЗрдЯ рдЧрд░реНрджрдЫ: рдХрд╕рд░реА рдлреЛрд▓реНрдбрд░ рд╕рдВрд░рдЪрдирд╛ рддреЛрдбреНрдиреЗ svn рд╢рд╛рдЦрд╛рд╣рд░реВрдорд╛ред рдЙрд╣рд╛рдБрд▓реЗ рддрд┐рдиреАрд╣рд░реВрд▓рд╛рдИ рд╕рд╛рдкреЗрдХреНрд╖ рдорд╛рд░реНрдЧрд╣рд░реВ рдкрдирд┐ рдкреНрд░рджрд╛рди рдЧрд░реНрдиреБрд╣реБрдиреНрдЫред рдпрд╕рдХреЛ рдкрд╛рд▓реЛ рдорд╛ split_file_alwaystruunk рднрдгреНрдбрд╛рд░рдорд╛ рдорд╛рддреНрд░ рд╕рдорд╛рд╡реЗрд╢ рдЫ рднрдиреА рдкреНрд░рдХреНрд░рд┐рдпрд╛рд▓рд╛рдИ рд╕рд░рд▓ рдмрдирд╛рдЙрдБрдЫ рдЯреНрд░рдВрдХ.

╨Т рдЕрдиреБрд╕реВрдЪрдХ рд╕рдВрдХреЗрдд рдлрд┐рд▓реНрдЯрд░ рдкрд░рд┐рд╡рд░реНрддрди рдЧрд░реНрдиреБрд╣реЛрд╕реНрдЬрд╕рд▓реЗ рджреЗрдЦреНрдЫ рдХреБрдиреИ рдкрдирд┐ рд░ рдпрд╕рдХреЛ рд╕рд╛рде рдПрдХ рд╢рд╛рдЦрд╛ рд╕рдореНрдмрджреНрдз рдЯреНрд░рдВрдХ рдорд╛рд░реНрдлрдд рджрд┐рдЗрдПрдХреЛ рд╕рдВрдШ рдЕрдиреБрд╕рд╛рд░ split_file_alwaystruunkред рдорд╛ рдкрд░рд┐рд╡рд░реНрддрдирд╣рд░реВрдХреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджрд┐рдБрджреИ рдЯреНрд░рдВрдХ, рд╕реБрд░реБ рд╣реБрдиреНрдЫ рдирд┐рд░реНрдорд╛рддрд╛ рдирд╛рдо рд╕рдВрдЧ рддрдкрд╛рдИрдВрдХреЛ рдкрд░рд┐рдпреЛрдЬрдирд╛.

рдЧреБрдг рдпрд╣рд╛рдБ рдпреЛ рдЖрд╡рд╢реНрдпрдХ рдЫ рдХрд┐ рдкреНрд░рд╢рд╛рд╕рдХрд▓реЗ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдХреЛ рдорд╛рд▓рд┐рдХрдХреЛ рд░реВрдкрдорд╛ рдирд┐рд░реНрдорд╛рдг рд░ рдкрд░реАрдХреНрд╖рдг рдкрд░рд┐рдгрд╛рдорд╣рд░реВрдХреЛ рдореЗрд▓рд┐рдЩ рд╕реВрдЪреАрд╣рд░реВ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрджрдЫред

рдЪрд░рдг рдирд┐рд░реНрдорд╛рдг-a рдЪреЗрдХрдЖрдЙрдЯ рднрдгреНрдбрд╛рд░рдХреЛ рд╕реНрдерд╛рдиреАрдп рд╕рдВрд╕реНрдХрд░рдгрдорд╛ рдЕрд╡рд╕реНрдерд┐рдд рдХреБрдиреИ рдкрдирд┐ рдлрд╛рдЗрд▓рд╣рд░реВ рдкреВрд░реНрдг рд░реВрдкрдорд╛ рдореЗрдЯрд╛рдЙрди рд╕рдХреНрд╖рдо рдХрд╛рдорджрд╛рд░-рдПред рд░ рддреНрдпрд╕рдкрдЫрд┐ рдкреВрд░рд╛ рдЧрд░реНрдиреБрд╣реЛрд╕реН svn рдЕрдкрдбреЗрдЯред рдореЛрдб рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░ рдорд╛рд░реНрдлрдд рдХрдиреНрдлрд┐рдЧрд░ рдЧрд░рд┐рдПрдХреЛ рдЫ рдореЛрдб = рдкреВрд░реНрдг, рд╡рд┐рдзрд┐ = рддрд╛рдЬрд╛... рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░ haltOnTailure рднрдиреНрдЫ рдХрд┐ рдпрджрд┐ svn рдЕрдкрдбреЗрдЯ рддреНрд░реБрдЯрд┐рдХреЛ рд╕рд╛рде рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЧрд░рд┐рдиреЗрдЫ, рддреНрдпрд╕рдкрдЫрд┐ рдирд┐рд░реНрдорд╛рдг рд░ рдкрд░реАрдХреНрд╖рдгрдХреЛ рд╕рдореНрдкреВрд░реНрдг рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдирд┐рд▓рдореНрдмрд┐рдд рд╣реБрдиреБрдкрд░реНрдЫ, рдХрд┐рдирдХрд┐ рдердк рдХрд╛рд░реНрдпрд╣рд░реВрдХреЛ рдЕрд░реНрде рдЫреИрдиред

6.3 рддрдкрд╛рдИрд▓рд╛рдИ рдкрддреНрд░: рд░рд┐рдкреЛрд░реНрдЯрд░рд╣рд░реВ рдШреЛрд╖рдгрд╛ рдЧрд░реНрди рдЕрдзрд┐рдХреГрдд рдЫрдиреН


рд╕рдВрд╡рд╛рджрджрд╛рддрд╛ рдЗрдореЗрд▓ рдорд╛рд░реНрдлрдд рд╕реВрдЪрдирд╛рд╣рд░реВ рдкрдард╛рдЙрдиреЗ рд╕реЗрд╡рд╛ рд╣реЛред


template_html=u'''
<h4>╨б╤В╨░╤В╤Г╤Б ╨┐╨╛╤Б╤В╤А╨╛╨╡╨╜╨╜╨╛╨│╨╛ ╤А╨╡╨╗╨╕╨╖╨░: {{ summary }}</h4>
<p>╨Ш╤Б╨┐╨╛╨╗╤М╨╖╤Г╨╡╨╝╤Л╨╣ ╤Б╨╡╤А╨▓╨╕╤Б ╨┤╨╗╤П ╨┐╨╛╤Б╤В╤А╨░╨╡╨╜╨╕╤П: {{ workername }}</p>
<p>╨Я╤А╨╛╨╡╨║╤В: {{ projects }}</p>
<p>╨Ф╨╗╤П ╤В╨╛╨│╨╛ ╤З╤В╨╛ ╨▒╤Л ╨┐╨╛╤Б╨╝╨╛╤В╤А╨╡╤В╤М ╨╕╨╜╤В╨╡╤А╤Д╨╡╨╣╤Б ╤Г╨┐╤А╨░╨▓╨╗╨╡╨╜╨╕╤П ╨┐╤А╨╛╨╣╨┤╨╕╤В╨╡ ╨┐╨╛ ╤Б╤Б╤Л╨╗╨║╨╡: {{ buildbot_url }}</p>
<p>╨Ф╨╗╤П ╤В╨╛╨│╨╛ ╤З╤В╨╛ ╨▒╤Л ╨┐╨╛╤Б╨╝╨╛╤В╤А╨╡╤В╤М ╤А╨╡╨╖╤Г╨╗╤М╤В╨░╤В ╤Б╨▒╨╛╤А╨║╨╕ ╨┐╤А╨╛╨╣╨┤╨╕╤В╨╡ ╨┐╨╛ ╤Б╤Б╤Л╨╗╨║╨╡: {{ build_url }}</p>
<p>╨Ш╤Б╨┐╨╛╨╗╤М╨╖╤Г╤П WinSCP ╨╝╨╛╨╢╨╜╨╛ ╨┐╨╛╨┤╨║╨╗╤О╤З╨╕╤В╤М╤Б╤П ╨║ ╤Б╨╡╤А╨▓╨╡╤А╤Г c ip:xxx.xx.xxx.xx. ╨Т╨╛╨╣╨┤╤П ╨┐╨╛╨┤ habr/password, ╨╖╨░╨▒╤А╨░╤В╤М ╤Б╨╛╨▒╤А╨░╨╜╨╜╤Л╨╣ executable ╤Д╨░╨╣╨╗ ╤Б ╨┤╨╕╤А╨╡╨║╤В╨╛╤А╨╕╨╕ ~/worker/yourProject/build/dist.</p>
<p><b>╨Я╨╛╤Б╤В╤А╨╛╨╡╨╜╨╕╨╡ ╨▒╤Л╨╗╨╛ ╨┐╤А╨╛╨╕╨╖╨▓╨╡╨┤╨╡╨╜╨╛ ╤З╨╡╤А╨╡╨╖ Buildbot</b></p>
'''
                        
sendMessageToAll = reporters.MailNotifier(fromaddr="[email protected]",
                                          sendToInterestedUsers=True,
                                          lookup="your.domain",
                                          relayhost="smtp.your.domain",
                                          smtpPort=1025,
                                          mode="warnings",
                                          extraRecipients=['[email protected]'],
                                    messageFormatter=reporters.MessageFormatter(
                                                    template=template_html,
                                                    template_type='html',
                                                    wantProperties=True, 
                                                    wantSteps=True)
                                        )
c['services'] = [sendMessageToAll]

рдЙрд╕рд▓реЗ рд╕рдиреНрджреЗрд╢ рдкрдард╛рдЙрди рд╕рдХреНрдЫ рд╡рд┐рднрд┐рдиреНрди рддрд░рд┐рдХрд╛рд╣рд░реВ.

рдореЗрд▓ рдиреЛрдЯрд┐рдлрд╛рдпрд░ рд╕реВрдЪрдирд╛рд╣рд░реВ рдкрдард╛рдЙрди рдЗрдореЗрд▓ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджрдЫред

рдЯреЗрдореНрдкреНрд▓реЗрдЯ_html рдиреНрдпреВрдЬрд▓реЗрдЯрд░рдХреЛ рд▓рд╛рдЧрд┐ рдкрд╛рда рдЯреЗрдореНрдкреНрд▓реЗрдЯ рд╕реЗрдЯ рдЧрд░реНрджрдЫред HTML рдорд╛рд░реНрдХрдЕрдк рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрди рдкреНрд░рдпреЛрдЧ рдЧрд░рд┐рдиреНрдЫред рдпреЛ рдЗрдиреНрдЬрд┐рди рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рдорд╛рд░реНрдЬрди рдЧрд░рд┐рдПрдХреЛ рдЫ jinja2 (рд╕рдБрдЧ рддреБрд▓рдирд╛ рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫ Django). BuildBot рдЪрд░рд╣рд░реВрдХреЛ рд╕реЗрдЯ рдЫ рдЬрд╕рдХреЛ рдорд╛рдирд╣рд░реВ рд╕рдиреНрджреЗрд╢ рдкрд╛рда рдЙрддреНрдкрдиреНрди рдЧрд░реНрдиреЗ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдХреЛ рдХреНрд░рдордорд╛ рдЯреЗрдореНрдкреНрд▓реЗрдЯрдорд╛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рд╣реБрдиреНрдЫрдиреНред рдпреА рдЪрд░рд╣рд░реВ {{ рдбрдмрд▓ рдХрд░реНрд▓реА рдмреНрд░реЗрд╕реЗрд╕ }} рдорд╛ рдмрдиреНрдж рдЫрдиреНред рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, рд╕рд╛рд░рд╛рдВрд╢ рдкреВрд░рд╛ рд╕рдЮреНрдЪрд╛рд▓рдирдХреЛ рд╕реНрдерд┐рддрд┐ рджреЗрдЦрд╛рдЙрдБрдЫ, рддреНрдпреЛ рд╣реЛ, рд╕рдлрд▓рддрд╛ рд╡рд╛ рд╡рд┐рдлрд▓рддрд╛ред рдП рдкрд░рд┐рдпреЛрдЬрдирд╛рд╣рд░реВ рдЖрдЙрдЯрдкреБрдЯ рдЧрд░реНрдиреЗрдЫ рддрдкрд╛рдИрдВрдХреЛ рдкрд░рд┐рдпреЛрдЬрдирд╛ред рддреНрдпрд╕реЛрднрдП, рдирд┐рдпрдиреНрддреНрд░рдг рдЖрджреЗрд╢рд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ jinja2, рдЪрд░ BuildBot-a рд░ рдкрд╛рдЗрдерди рд╕реНрдЯреНрд░рд┐рдЩ рдврд╛рдБрдЪрд╛ рдЙрдкрдХрд░рдг, рддрдкрд╛рдИрдВ рдПрдХ рдзреЗрд░реИ рдЬрд╛рдирдХрд╛рд░реАрдкреВрд░реНрдг рд╕рдиреНрджреЗрд╢ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред

рдореЗрд▓ рдиреЛрдЯрд┐рдлрд╛рдпрд░ рдирд┐рдореНрди рддрд░реНрдХрд╣рд░реВ рд╕рдорд╛рд╡реЗрд╢ рдЫрдиреНред

рдердкрдмрд╛рдЯ - рдареЗрдЧрд╛рдирд╛ рдЬрд╣рд╛рдБрдмрд╛рдЯ рд╕рдмреИрд▓реЗ рдиреНрдпреВрдЬрд▓реЗрдЯрд░ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрдиреЗрдЫрдиреНред

рдЗрдЪреНрдЫреБрдХ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рд╣рд░реВрд▓рд╛рдИ рдкрдард╛рдЙрдиреБрд╣реЛрд╕реН=True рд▓реЗ рдорд╛рд▓рд┐рдХ рд░ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рд▓рд╛рдИ рд╕рдиреНрджреЗрд╢ рдкрдард╛рдЙрдБрдЫ рдЬрд╕рд▓реЗ рдмрдирд╛рдПрдХреЛ рд╣реЛ рдкреНрд░рддрд┐рдмрджреНрдз.

рдорд╛рдерд┐ рд╣реЗрд░ тАФ рд╕рдорд╛рдЪрд╛рд░рдкрддреНрд░ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрдиреЗ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рд╣рд░реВрдХреЛ рдирд╛рдордорд╛ рдЬреЛрдбрд┐рдПрдХреЛ рдкреНрд░рддреНрдпрдпред рддреНрдпрд╕реИрд▓реЗ . рдХрд╕рд░реА рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рд▓реЗ рдареЗрдЧрд╛рдирд╛рдорд╛ рдиреНрдпреВрдЬрд▓реЗрдЯрд░ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрдиреЗрдЫ [рдИрдореЗрд▓ рд╕реБрд░рдХреНрд╖рд┐рдд].

рд░рд┐рд▓реЗрд╣реЛрд╕реНрдЯ рд╕рд░реНрднрд░ рдЦреЛрд▓рд┐рдПрдХреЛ рд╣реЛрд╕реНрдЯрдирд╛рдо рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЧрд░реНрджрдЫ рдПрд╕рдПрдордЯреАрдкреАрдПрдХ smptPort рд╕реБрдиреНрдиреЗ рдкреЛрд░реНрдЯ рдирдореНрдмрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЧрд░реНрджрдЫ рдПрд╕рдПрдордЯреАрдкреА ╤Б╨╡╤А╨▓╨╡╤Аред

рдореЛрдб="рдЪреЗрддрд╛рд╡рдиреА" рдХрдореНрддрд┐рдорд╛ рдПрдХ рдкрд╛рдЗрд▓рд╛ рднрдПрдорд╛ рдорд╛рддреНрд░ рдкрддреНрд░рд╛рдЪрд╛рд░ рдЧрд░реНрдиреБрдкрд░реНрдиреЗ рдмрддрд╛рдЙрдБрдЫрдиреН рдирд┐рд░реНрдорд╛рдг-a, рдЬреБрди рд╕реНрдерд┐рддрд┐ рдЕрд╕рдлрд▓рддрд╛ рд╡рд╛ рдЪреЗрддрд╛рд╡рдиреА рд╕рдВрдЧ рд╕рдорд╛рдкреНрдд рднрдпреЛред рд╕рдлрд▓рддрд╛ рдХреЛ рдорд╛рдорд▓рд╛ рдорд╛, рдПрдХ рдиреНрдпреВрдЬрд▓реЗрдЯрд░ рдкрдард╛рдЙрди рдЖрд╡рд╢реНрдпрдХ рдЫреИрдиред

рдЕрддрд┐рд░рд┐рдХреНрдд рдкреНрд░рд╛рдкреНрддрдХрд░реНрддрд╛рд╣рд░реВ рдорд╛рд▓рд┐рдХ рд░ рд╡реНрдпрдХреНрддрд┐ рдмрд╛рд╣реЗрдХ рдЬрд╕рд▓рд╛рдИ рдкрддреНрд░рд╛рдЪрд╛рд░ рдкрдард╛рдЗрдиреБ рдкрд░реНрдЫ рд╡реНрдпрдХреНрддрд┐рд╣рд░реВрдХреЛ рд╕реВрдЪреА рд╕рдорд╛рд╡реЗрд╢ рдЧрд░реНрджрдЫред рдкреНрд░рддрд┐рдмрджреНрдз.

рд╕рдиреНрджреЗрд╢ рдврд╛рдБрдЪрд╛ рд╕рдиреНрджреЗрд╢ рдврд╛рдБрдЪрд╛, рдпрд╕рдХреЛ рдЯреЗрдореНрдкреНрд▓реЗрдЯ, рд░ рдЙрдкрд▓рдмреНрдз рдЪрд░рд╣рд░реВрдХреЛ рд╕реЗрдЯ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЧрд░реНрдиреЗ рд╡рд╕реНрддреБ рд╣реЛред jinja2ред рд╡рд┐рдХрд▓реНрдкрд╣рд░реВ рдЬрд╕реНрддреИ wantProperties=рд╕рддреНрдп ╨╕ wantSteps=True рдЙрдкрд▓рдмреНрдз рдЪрд░рд╣рд░реВрдХреЛ рдпреЛ рд╕реЗрдЯ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдЧрд░реНрдиреБрд╣реЛрд╕реНред

['рд╕реЗрд╡рд╛рд╣рд░реВ']=[sendMessageToAll] рд╕рдБрдЧ рд╕реЗрд╡рд╛рд╣рд░реВрдХреЛ рд╕реВрдЪреА рдкреНрд░рджрд╛рди рдЧрд░реНрджрдЫ, рдЬрд╕рдордзреНрдпреЗ рд╣рд╛рдореНрд░реЛ рд╣реБрдиреЗрдЫ рд░рд┐рдкреЛрд░реНрдЯрд░.

рд╣рд╛рдореАрд▓реЗ рдЧрд░реНрдпреЛ! рдмрдзрд╛рдИ рдЫ

рд╣рд╛рдореАрд▓реЗ рд╣рд╛рдореНрд░реЛ рдЖрдлреНрдиреИ рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рди рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдпреМрдВ рд░ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рджреЗрдЦреНрдпреМрдВ рдЬреБрди рдпреЛ рд╕рдХреНрд╖рдо рдЫред BuildBotред рдпреЛ, рдорд▓рд╛рдИ рд▓рд╛рдЧреНрдЫ, рдпреЛ рдЙрдкрдХрд░рдг рдЖрдлреНрдиреЛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ рдХрд┐ рднрдиреЗрд░ рдмреБрдЭреНрди рдкрд░реНрдпрд╛рдкреНрдд рдЫред рдХреЗ рддрдкрд╛рдЗрдБ рдЙрд╣рд╛рдБрдорд╛ рд░реБрдЪрд┐ рд░рд╛рдЦреНрдиреБрд╣реБрдиреНрдЫ? рдХреЗ рдпреЛ рддрдкрд╛рдИрд▓рд╛рдИ рдЙрдкрдпреЛрдЧреА рд╣реБрдиреЗрдЫ? рдХреЗ рдЙрд╣рд╛рдБрд╕рдБрдЧ рдХрд╛рдо рдЧрд░реНрди рд╕рд╣рдЬ рдЫ? рддрдм рдо рдпреЛ рд▓реЗрдЦ рд╡реНрдпрд░реНрдердорд╛ рд▓реЗрдЦрд┐рд░рд╣реЗрдХреЛ рдЫреИрдиред

рд░ рдердкред рдо рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рд╕рдореБрджрд╛рдп рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рдЪрд╛рд╣рдиреНрдЫреБ BuildBot, рдлрд░рд╛рдХрд┐рд▓реЛ рднрдпреЛ, рдореНрдпрд╛рдиреБрдЕрд▓рд╣рд░реВ рдЕрдиреБрд╡рд╛рдж рдЧрд░рд┐рдпреЛ, рд░ рддреНрдпрд╣рд╛рдБ рдЕрдЭ рдзреЗрд░реИ рдЙрджрд╛рд╣рд░рдгрд╣рд░реВ рдерд┐рдПред

рдзреНрдпрд╛рди рджрд┐рдиреБрднрдПрдХреЛрдорд╛ рд╕рдмреИрд▓рд╛рдИ рдзрдиреНрдпрд╡рд╛рджред рднрд╛рдЧреНрдпрд▓реЗ рд╕рд╛рде рджрд┐рдУрд╕реНред

рд╕реНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдердкреНрди