BuildBot рд╕рд╣ рд╕рддрдд рдПрдХрд╛рддреНрдорддреЗрдЪреЗ рдЙрджрд╛рд╣рд░рдг рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА

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

рд╣рд╛рдп

рдорд╛рдЭреЗ рдирд╛рд╡ рдЖрд╣реЗ рдЗрд╡реНрд╣рдЧреЗрдиреА рдЪреЗрд░реНрдХрд┐рди, рдореА рдПрдХрд╛ рдЦрд╛рдг рдХрдВрдкрдиреАрдд рд╡рд┐рдХрд╛рд╕ рдХрд╛рд░реНрдпрд╕рдВрдШрд╛рдЪрд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдЖрд╣реЗ рдкреЙрд▓реАрдореЗрдЯрд▓.

рдХреЛрдгрддрд╛рд╣реА рдореЛрдард╛ рдкреНрд░рдХрд▓реНрдк рд╕реБрд░реВ рдХрд░рддрд╛рдирд╛, рддреБрдореНрд╣реА рд╡рд┐рдЪрд╛рд░ рдХрд░реВ рд▓рд╛рдЧрддрд╛: "рддреЗ рд░рд╛рдЦрдгреНрдпрд╛рд╕рд╛рдареА рдХреЛрдгрддреЗ рд╕реЙрдлреНрдЯрд╡реЗрдЕрд░ рд╡рд╛рдкрд░рдгреЗ рдЪрд╛рдВрдЧрд▓реЗ рдЖрд╣реЗ?" рдкреБрдвреАрд▓ рдЖрд╡реГрддреНрддреА рд░рд┐рд▓реАрдЬ рдХрд░рдгреНрдпрд╛рдкреВрд░реНрд╡реА рдЖрдпрдЯреА рдкреНрд░рдХрд▓реНрдк рдЕрдиреЗрдХ рдЯрдкреНрдкреНрдпрд╛рдВрддреВрди рдЬрд╛рддреЛ. рдЬреЗрд╡реНрд╣рд╛ рдпрд╛ рдЯрдкреНрдкреНрдпрд╛рдВрдЪреА рд╕рд╛рдЦрд│реА рд╕реНрд╡рдпрдВрдЪрд▓рд┐рдд рдЕрд╕рддреЗ рддреЗрд╡реНрд╣рд╛ рддреЗ рдЪрд╛рдВрдЧрд▓реЗ рдЕрд╕рддреЗ. рд╕реНрд╡рддрдГ рдЖрдпрдЯреА рдкреНрд░рдХрд▓реНрдкрд╛рдЪреА рдирд╡реАрди рдЖрд╡реГрддреНрддреА рд░рд┐рд▓реАрдЭ рдХрд░рдгреНрдпрд╛рдЪреНрдпрд╛ рд╕реНрд╡рдпрдВрдЪрд▓рд┐рдд рдкреНрд░рдХреНрд░рд┐рдпреЗрд▓рд╛ рдореНрд╣рдгрддрд╛рдд рд╕рддрдд рдПрдХрддреНрд░реАрдХрд░рдг. рдмрд┐рд▓реНрдбрдмреЙрдЯ рдпрд╛ рдкреНрд░рдХреНрд░рд┐рдпреЗрдЪреА рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЖрдордЪреНрдпрд╛рд╕рд╛рдареА рдПрдХ рдЪрд╛рдВрдЧрд▓рд╛ рд╕рд╣рд╛рдпреНрдпрдХ рдард░рд▓рд╛.

рдпрд╛ рд▓реЗрдЦрд╛рдд рдореА рд╢рдХреНрдпрддрд╛рдВрдЪреЗ рд╡рд┐рд╣рдВрдЧрд╛рд╡рд▓реЛрдХрди рдкреНрд░рджрд╛рди рдХрд░рдгреНрдпрд╛рдЪрд╛ рдирд┐рд░реНрдгрдп рдШреЗрддрд▓рд╛ рдмрд┐рд▓реНрдбрдмреЙрдЯ. рд╣реЗ рд╕реЙрдлреНрдЯрд╡реЗрдЕрд░ рдХрд╛рдп рд╕рдХреНрд╖рдо рдЖрд╣реЗ? рддреНрдпрд╛рдЪреНрдпрд╛рд╢реА рдХрд╕реЗ рд╕рдВрдкрд░реНрдХ рд╕рд╛рдзрд╛рд╡рд╛ рдЖрдгрд┐ рддреНрдпрд╛рдЪреНрдпрд╛рд╢реА рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рднрд╛рд╡реА рдХрд╛рд░реНрдп рд╕рдВрдмрдВрдз рдХрд╕реЗ рддрдпрд╛рд░ рдХрд░рд╛рд╡реЗ? рддреБрдордЪреНрдпрд╛ рдорд╢реАрдирд╡рд░ рддреБрдордЪрд╛ рдкреНрд░рдХрд▓реНрдк рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЖрдгрд┐ рдЪрд╛рдЪрдгреА рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдХрд╛рд░реНрдпрд░рдд рд╕реЗрд╡рд╛ рддрдпрд╛рд░ рдХрд░реВрди рддреБрдореНрд╣реА рдЖрдордЪрд╛ рдЕрдиреБрднрд╡ рд╕реНрд╡рддрдГ рд▓рд╛рдЧреВ рдХрд░реВ рд╢рдХрддрд╛.

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

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

1. рдмрд┐рд▓реНрдбрдмреЙрдЯ рдХрд╛?
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. рдмрд┐рд▓реНрдбрдмреЙрдЯ рдХрд╛?

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

рдерд╛рдВрдмрд╛! рдХреЛрдгреА рддреНрдпрд╛рдВрдЪреНрдпрд╛ рдкреНрд░рдХрд▓реНрдкрд╛рдВрдордзреНрдпреЗ рддреНрдпрд╛рдЪрд╛ рд╡рд╛рдкрд░ рдХреЗрд▓рд╛ рдЖрд╣реЗ рдХрд╛? рддреЛ рд╣реЛрдп рдмрд╛рд╣реЗрд░ рд╡рд│рддреЗ рдЕрдиреЗрдХ рддреЗ рддреНрдпрд╛рдВрдЪреНрдпрд╛ рдХрд╛рд░реНрдпрд╛рдд рд▓рд╛рдЧреВ рдХреЗрд▓реЗ. рд╕рд╛рдкрдбреВ рд╢рдХрддреЛ рдЙрджрд╛рд╣рд░рдгреЗ рд╡рд╛рдкрд░рд╛ рдмрд┐рд▓реНрдбрдмреЙрдЯ рдЖрдгрд┐ Google рдХреЛрдб рд╕рдВрдЧреНрд░рд╣рдгрд╛рдВрдордзреНрдпреЗ.

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

рдЬреНрдпрд╛рдВрдЪреЗ рд▓рдХреНрд╖реНрдп рдкреНрд░рдХрд▓реНрдк рдкрд╛рдпрдердирдордзреНрдпреЗ рд▓рд┐рд╣рд┐рд▓реЗрд▓реЗ рдЖрд╣реЗ рддреНрдпрд╛рдВрдЪреНрдпрд╛рд╕рд╛рдареА рдкреНрд░рд╢реНрди рдЙрджреНрднрд╡рддреЛ: "рдкреНрд░реЛрдЬреЗрдХреНрдЯрдордзреНрдпреЗ рд╡рд╛рдкрд░рд▓реНрдпрд╛ рдЬрд╛рдгрд╛рд░реНтАНрдпрд╛ рднрд╛рд╖реЗрдЪреНрдпрд╛ рджреГрд╖реНрдЯреАрдиреЗ рд╕реНрдкрд╖реНрдЯ рдЗрдВрдЯрд░рдлреЗрд╕ рдЕрд╕рд▓реЗрд▓реА рдПрдХреАрдХрд░рдг рдкреНрд░рдгрд╛рд▓реА рдХрд╛ рдирд┐рд╡рдбрдд рдирд╛рд╣реА?" рдЖрдгрд┐ рдЖрддрд╛ рдлрд╛рдпрджреЗ рд╕рд╛рджрд░ рдХрд░рдгреНрдпрд╛рдЪреА рд╡реЗрд│ рдЖрд▓реА рдЖрд╣реЗ рдмрд┐рд▓реНрдбрдмреЙрдЯ.

рддрд░, рдЖрдордЪреА тАЬрдЗрдВрд╕реНрдЯреНрд░реБрдореЗрдВрдЯрд▓ рдЪреМрдХрдбреАтАЭ. рдорд╛рдЭреНрдпрд╛рд╕рд╛рдареА, рдореА рдЪрд╛рд░ рд╡реИрд╢рд┐рд╖реНрдЯреНрдпреЗ рдУрд│рдЦрд▓реА рдЖрд╣реЗрдд рдмрд┐рд▓реНрдбрдмреЙрдЯ:

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

2. рдмрд┐рд▓реНрдбрдорд╛рд╕реНрдЯрд░рдЪреНрдпрд╛ рдиреЗрддреГрддреНрд╡рд╛рдд рд╕рдВрдХрд▓реНрдкрдирд╛

BuildBot рд╕рд╣ рд╕рддрдд рдПрдХрд╛рддреНрдорддреЗрдЪреЗ рдЙрджрд╛рд╣рд░рдг рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА

рдХрд╛рд░реНрдп рд╡рд┐рддрд░рдг рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░рдЪреЗ рдХреЗрдВрджреНрд░рд╕реНрдерд╛рди рдЖрд╣реЗ рдмрд┐рд▓реНрдбрдорд╛рд╕реНрдЯрд░. рд╣реА рдПрдХ рд╕реЗрд╡рд╛ рдЖрд╣реЗ рдЬреА:

  • рдЯреНрд░реЕрдХ рдареЗрд╡рддреЗ рдкреНрд░рдХрд▓реНрдк рд╕реНрд░реЛрдд рд╡реГрдХреНрд╖ рдордзреНрдпреЗ рдмрджрд▓
  • рдкрд╛рдард╡рддреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЖрдгрд┐ рддреНрдпрд╛рдЪреА рдЪрд╛рдЪрдгреА рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдХрд╛рдордЧрд╛рд░ рд╕реЗрд╡реЗрджреНрд╡рд╛рд░реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХреЗрд▓реНрдпрд╛ рдЬрд╛рдгрд╛рд▒реНрдпрд╛ рдЖрджреЗрд╢
  • рд╕реВрдЪрд┐рдд рдХрд░рддреЗ рдХреЗрд▓реЗрд▓реНрдпрд╛ рдХреГрддреАрдВрдЪреНрдпрд╛ рдкрд░рд┐рдгрд╛рдорд╛рдВрдмрджреНрджрд▓ рд╡рд╛рдкрд░рдХрд░реНрддреЗ

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

рдкреБрдвреАрд▓ рд╕рд░реНрд╡рд╛рдд рдорд╣рддреНрд╡рд╛рдЪреА рд╡рд╕реНрддреВ рдмрд┐рд▓реНрдбрдмреЙрдЯ рдирд╛рд╡ рдЖрд╣реЗ рдХрд╛рдордЧрд╛рд░. рд╣реА рд╕реЗрд╡рд╛ рд╡реЗрдЧрд│реНрдпрд╛ OS рд╕рд╣ рджреБрд╕рд░реНтАНрдпрд╛ рд╣реЛрд╕реНрдЯрд╡рд░ рдХрд┐рдВрд╡рд╛ рдХрджрд╛рдЪрд┐рдд рдПрдХрд╛рд╡рд░ рд▓реЙрдиреНрдЪ рдХреЗрд▓реА рдЬрд╛рдК рд╢рдХрддреЗ рдмрд┐рд▓реНрдбрдорд╛рд╕реНрдЯрд░. рд╣реЗ рд╕реНрд╡рддрдГрдЪреНрдпрд╛ рдкреЕрдХреЗрдЬреЗрд╕ рдЖрдгрд┐ рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓реНрд╕рд╕рд╣ рдЦрд╛рд╕ рддрдпрд╛рд░ рдХреЗрд▓реЗрд▓реНрдпрд╛ рдЖрднрд╛рд╕реА рд╡рд╛рддрд╛рд╡рд░рдгрд╛рдд рджреЗрдЦреАрд▓ рдЕрд╕реНрддрд┐рддреНрд╡рд╛рдд рдЕрд╕реВ рд╢рдХрддреЗ. рд╣реЗ рдЖрднрд╛рд╕реА рд╡рд╛рддрд╛рд╡рд░рдг рдкрд╛рдпрдерди рдпреБрдЯрд┐рд▓рд┐рдЯреАрдЬ рд╡рд╛рдкрд░реВрди рддрдпрд╛рд░ рдХреЗрд▓реЗ рдЬрд╛рдК рд╢рдХрддреЗ virtualenv, venv.

рдмрд┐рд▓реНрдбрдорд╛рд╕реНрдЯрд░ рдкреНрд░рддреНрдпреЗрдХрд╛рд╕рд╛рдареА рдЖрджреЗрд╢ рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд░рддреЗ рдХрд╛рдордЧрд╛рд░-y, рдЖрдгрд┐ рддреЛ, рддреНрдпрд╛ рдмрджрд▓реНрдпрд╛рдд, рддреНрдпрд╛рдВрдирд╛ рдкреВрд░реНрдг рдХрд░рддреЛ. рдореНрд╣рдгрдЬреЗрдЪ, рдЕрд╕реЗ рджрд┐рд╕реВрди рдЖрд▓реЗ рдХреА рдкреНрд░рдХрд▓реНрдк рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рдЪреА рдЖрдгрд┐ рдЪрд╛рдЪрдгреА рдХрд░рдгреНрдпрд╛рдЪреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЪрд╛рд▓реВ рд╢рдХрддреЗ рдХрд╛рдордЧрд╛рд░-e рд╡рд┐рдВрдбреЛрдЬ рдЪрд╛рд▓рд╡рддреЗ рдЖрдгрд┐ рд▓рд┐рдирдХреНрд╕ рдЪрд╛рд▓рд╡рдгрд╛рд▒реНрдпрд╛ рджреБрд╕рд░реНтАНрдпрд╛ рд╡рд░реНрдХрд░рд╡рд░.

рддрдкрд╛рд╕рд╛ рдкреНрд░рдХрд▓реНрдк рд╕реНрддреНрд░реЛрдд рдХреЛрдб рдкреНрд░рддреНрдпреЗрдХрд╛рд╡рд░ рдпреЗрддреЛ рдХрд╛рдордЧрд╛рд░-рдИ

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

рддрд░ рдЪрд▓рд╛. рдореА рд╣реЛрд╕реНрдЯ рдореНрд╣рдгреВрди рдЙрдмрдВрдЯреВ 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

рдкреБрдвреАрд▓ рдЪрд░рдг рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдгреЗ рдЖрд╣реЗ рдЯреНрд╡рд┐рдЯ рдХреЗрд▓реЗ ╨╕ рдмрд┐рд▓реНрдбрдмреЙрдЯ, рддрд╕реЗрдЪ рдкреЕрдХреЗрдЬреЗрд╕ рдЬреЗ рддреБрдореНрд╣рд╛рд▓рд╛ рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╡рд╛рдкрд░рдгреНрдпрд╛рдЪреА рдкрд░рд╡рд╛рдирдЧреА рджреЗрддрд╛рдд рдмрд┐рд▓реНрдбрдмреЙрдЯ-рдж.


/*╨Т╤Б╨╡ ╤З╤В╨╛ ╨┐╨╛╨┤ 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.рдирдореБрдирд╛ ╨▓ 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"] рд╕рд╣ рдкрд░рд╕реНрдкрд░рд╕рдВрд╡рд╛рджрд╛рд╕рд╛рдареА рдирд┐рд╢реНрдЪрд┐рдд рдШрдЯрдХ рдЖрд╣реЗрдд рдмрд┐рд▓реНрдбрдорд╛рд╕реНрдЯрд░. рдкреНрд░рддреНрдпреЗрдХ рдХреАрд╕рд╛рдареА, рд╕рдВрдмрдВрдзрд┐рдд рдСрдмреНрдЬреЗрдХреНрдЯрд▓рд╛ рдореВрд▓реНрдп рдореНрд╣рдгреВрди рдмрджрд▓рд▓реЗ рдЬрд╛рддреЗ.

5.2 рдХрд╛рдордЧрд╛рд░

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

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

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 рдордзреНрдпреЗ рдЖрдореНрд╣рд╛рд▓рд╛ рддреНрдпрд╛ рд╕реВрдЪреАрдордзреНрдпреЗ рдкреНрд░рд╡реЗрд╢ рдорд┐рд│рддреЛ рдЬрд┐рдереЗ рдЖрдореНрд╣рд╛рд▓рд╛ рдПрдЦрд╛рджреА рд╡рд╕реНрддреВ рдареЗрд╡рд╛рдпрдЪреА рдЖрд╣реЗ рдЬреА рдкреНрд░рдХрд▓реНрдкрд╛рдЪреНрдпрд╛ рд╕реНрддреНрд░реЛрдд рдХреЛрдбрд╕рд╣ рд░реЗрдкреЙрдЬрд┐рдЯрд░реА рдкреЛрд▓ рдХрд░рддреЗ. рдЙрджрд╛рд╣рд░рдг рдЧрд┐рдЯ рд░реЗрдкреЙрдЬрд┐рдЯрд░реА рд╡рд╛рдкрд░рддреЗ рдЬреЗ рдард░рд╛рд╡рд┐рдХ рдЕрдВрддрд░рд╛рдиреЗ рдкреЛрд▓ рдХреЗрд▓реЗ рдЬрд╛рддреЗ.

рдкрд╣рд┐рд▓рд╛ рдпреБрдХреНрддрд┐рд╡рд╛рдж рдЖрдкрд▓реНрдпрд╛ рднрд╛рдВрдбрд╛рд░рд╛рдЪрд╛ рдорд╛рд░реНрдЧ рдЖрд╣реЗ.

workdir рдмрд╛рдЬреВрд▓рд╛ рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рдлреЛрд▓реНрдбрд░рдЪрд╛ рдорд╛рд░реНрдЧ рджрд░реНрд╢рд╡рддреЗ рдХрд╛рдордЧрд╛рд░- рдорд╛рд░реНрдЧрд╛рд╢реА рд╕рдВрдмрдВрдзрд┐рдд /home/habr/worker/yourProject/build git рд░реЗрдкреЙрдЬрд┐рдЯрд░реАрдЪреА рд╕реНрдерд╛рдирд┐рдХ рдЖрд╡реГрддреНрддреА рд╕рдВрдЧреНрд░рд╣рд┐рдд рдХрд░реЗрд▓.

рд╢рд╛рдЦрд╛ рд░реЗрдкреЙрдЬрд┐рдЯрд░реАрдордзреНрдпреЗ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╢рд╛рдЦрд╛ рдЖрд╣реЗ рдЬреНрдпрд╛рдЪреЗ рдЕрдиреБрд╕рд░рдг рдХреЗрд▓реЗ рдкрд╛рд╣рд┐рдЬреЗ.

pollInterval рддреНрдпрд╛рдирдВрддрд░рдЪреНрдпрд╛ рд╕реЗрдХрдВрджрд╛рдВрдЪреА рд╕рдВрдЦреНрдпрд╛ рд╕рдорд╛рд╡рд┐рд╖реНрдЯ рдЖрд╣реЗ рдмрд┐рд▓реНрдбрдорд╛рд╕реНрдЯрд░ рдмрджрд▓рд╛рдВрд╕рд╛рдареА рд░реЗрдкреЙрдЬрд┐рдЯрд░реА рдорддрджрд╛рди рдХрд░реЗрд▓.

рдкреНрд░рдХрд▓реНрдкрд╛рдЪреНрдпрд╛ рднрд╛рдВрдбрд╛рд░рд╛рддреАрд▓ рдмрджрд▓рд╛рдВрдЪрд╛ рдорд╛рдЧреЛрд╡рд╛ рдШреЗрдгреНрдпрд╛рд╕рд╛рдареА рдЕрдиреЗрдХ рдкрджреНрдзрддреА рдЖрд╣реЗрдд.

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

рд░реЗрдкреЙрдЬрд┐рдЯрд░реАрдордзреАрд▓ рдмрджрд▓рд╛рдВрдЪрд╛ рдорд╛рдЧреЛрд╡рд╛ рдШреЗрдгреНрдпрд╛рдЪреА рдЖрдгрдЦреА рдПрдХ рдореЛрд╣рдХ рдкрджреНрдзрдд рдореНрд╣рдгрдЬреЗ рддреЗ рд╣реЛрд╕реНрдЯ рдХрд░рдгрд╛рд░реНтАНрдпрд╛ рд╕рд░реНрд╡реНрд╣рд░рд╡рд░реВрди рдереЗрдЯ рд╕рдВрджреЗрд╢ рдкрд╛рдард╡рдгреЗ. рдмрд┐рд▓реНрдбрдорд╛рд╕реНрдЯрд░- рдкреНрд░рдХрд▓реНрдк рд╕реНрддреНрд░реЛрдд рдХреЛрдб рдмрджрд▓рдгреНрдпрд╛рдмрджреНрджрд▓. рдпрд╛ рдкреНрд░рдХрд░рдгрд╛рдд, рд╡рд┐рдХрд╛рд╕рдХ рдмрдирд╡рддрд╛рдЪ рд╡рдЪрдирдмрджреНрдз, рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдЕрд╕рд▓реЗрд▓рд╛ рд╕рд░реНрд╡реНрд╣рд░ рд╕рдВрджреЗрд╢ рдкрд╛рдард╡реЗрд▓ рдмрд┐рд▓реНрдбрдорд╛рд╕реНрдЯрд░-y рдЖрдгрд┐ рддреЛ, рддреНрдпрд╛ рдмрджрд▓реНрдпрд╛рдд, рдПрдЦрд╛рджреА рд╡рд╕реНрддреВ рддрдпрд╛рд░ рдХрд░реВрди рддреНрдпрд╛рд╕ рд░реЛрдЦреЗрд▓ PBCchangeSource. рдкреБрдвреЗ, рд╣рд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣рд╕реНрддрд╛рдВрддрд░рд┐рдд рдХреЗрд▓рд╛ рдЬрд╛рдИрд▓ рд╢реЗрдбреНрдпреВрд▓рд░, рдЬреЗ рдкреНрд░рдХрд▓реНрдк рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рдЪреНрдпрд╛ рдЪрд░рдгрд╛рдВрдирд╛ рд╕рдХреНрд░рд┐рдп рдХрд░рддреЗ рдЖрдгрд┐ рддреНрдпрд╛рдЪреА рдЪрд╛рдЪрдгреА рдХрд░рддреЗ. рдпрд╛ рдкрджреНрдзрддреАрдЪрд╛ рдПрдХ рдорд╣рддреНрддреНрд╡рд╛рдЪрд╛ рднрд╛рдЧ рдХрд╛рдо рдХрд░рдд рдЖрд╣реЗ рд╣реБрдХ- рд░реЗрдкреЙрдЬрд┐рдЯрд░реАрдордзреНрдпреЗ рд╕рд░реНрд╡реНрд╣рд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ. рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдордзреНрдпреЗ рд╣реБрдХ-a, рдЬреЗрд╡реНрд╣рд╛ рдХреНрд░рд┐рдпрд╛рдВрдЪреНрдпрд╛ рдкреНрд░рдХреНрд░рд┐рдпреЗрд╕рд╛рдареА рдЬрдмрд╛рдмрджрд╛рд░ рд╡рдЪрдирдмрджреНрдз-рдИ, рддреБрдореНрд╣рд╛рд▓рд╛ рдпреБрдЯрд┐рд▓рд┐рдЯреАрд▓рд╛ рдХреЙрд▓ рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ рдкрд╛рдард╡рд╛ рдмрджрд▓ рдЖрдгрд┐ рдиреЗрдЯрд╡рд░реНрдХ рдкрддреНрддрд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рд╛ рдмрд┐рд▓реНрдбрдорд╛рд╕реНрдЯрд░-рдП. рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рдиреЗрдЯрд╡рд░реНрдХ рдкреЛрд░реНрдЯ рджреЗрдЦреАрд▓ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ рдЬреЗ рдРрдХреЗрд▓ PBCchangeSource. PBCchangeSource, рддрд╕реЗ, рднрд╛рдЧ рдЖрд╣реЗ рдмрд┐рд▓реНрдбрдорд╛рд╕реНрдЯрд░-рдП. рдпрд╛ рдкрджреНрдзрддреАрд╕рд╛рдареА рдкрд░рд╡рд╛рдирдЧреА рдЖрд╡рд╢реНрдпрдХ рдЕрд╕реЗрд▓ рдкреНрд░рд╢рд╛рд╕рди-рдП рд╕рд░реНрд╡реНрд╣рд░рд╡рд░ рдЬреЗрдереЗ рдкреНрд░рдХрд▓реНрдк рднрд╛рдВрдбрд╛рд░ рд╕реНрдерд┐рдд рдЖрд╣реЗ. рддреБрдореНрд╣рд╛рд▓рд╛ рдкреНрд░рдердо рд░реЗрдкреЙрдЬрд┐рдЯрд░реАрдЪрд╛ рдмреЕрдХрдЕрдк рдШреЗрдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ.

5.4 рд╢реЗрдбреНрдпреБрд▓рд░


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

рд╢реЗрдбреНрдпреБрд▓рд░ - рд╣рд╛ рдПрдХ рдШрдЯрдХ рдЖрд╣реЗ рдЬреЛ рдЯреНрд░рд┐рдЧрд░ рдореНрд╣рдгреВрди рдХрд╛рд░реНрдп рдХрд░рддреЛ рдЬреЛ рдкреНрд░рдХрд▓реНрдкрд╛рдЪреНрдпрд╛ рдЕрд╕реЗрдВрдмреНрд▓реА рдЖрдгрд┐ рдЪрд╛рдЪрдгреАрдЪреА рд╕рдВрдкреВрд░реНрдг рд╕рд╛рдЦрд│реА рд╕реБрд░реВ рдХрд░рддреЛ.
BuildBot рд╕рд╣ рд╕рддрдд рдПрдХрд╛рддреНрдорддреЗрдЪреЗ рдЙрджрд╛рд╣рд░рдг рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА

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

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

рдлреЛрд░реНрд╕ рд╢реЗрдбреНрдпреВрд▓рд░ рдПрдХ рдЕрддрд┐рд╢рдп рд╕рд╛рдзреА рдЧреЛрд╖реНрдЯ. рдпрд╛ рдкреНрд░рдХрд╛рд░рдЪреЗ рд╢реЗрдбреНрдпреВрд▓ рдорд╛рдКрд╕ рдХреНрд▓рд┐рдХрджреНрд╡рд╛рд░реЗ рдЯреНрд░рд┐рдЧрд░ рдХреЗрд▓реЗ рдЬрд╛рддреЗ рдмрд┐рд▓реНрдбрдмреЙрдЯ- рд╡реЗрдм рдЗрдВрдЯрд░рдлреЗрд╕. рдкреЕрд░рд╛рдореАрдЯрд░реНрд╕рдордзреНрдпреЗ рд╕рд╛рд░рдЦреЗрдЪ рд╕рд╛рд░ рдЖрд╣реЗ рд╕рд┐рдВрдЧрд▓ рдмреНрд░рд╛рдВрдЪ рд╢реЗрдбреНрдпреБрд▓рд░.

рдкреБрдирд╢реНрдЪ рдХреНрд░рдорд╛рдВрдХ 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 рдкрджреНрдзрдд рдХреЙрд▓ рдХрд░реВрди рдкрд╛рдпрд▒реНрдпрд╛ рдЬреЛрдбрд▓реНрдпрд╛ рдЬрд╛рддрд╛рдд рдкрд╛рдКрд▓ рдЯрд╛рдХрд╛

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

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

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

5.6 рдмрд╛рдВрдзрдХрд╛рдо рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ


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

рдХрд╛рдп рдЖрд╣реЗ рдпрд╛рдмрджреНрджрд▓ рдмрд┐рд▓реНрдбрд░ рд╕рд╛рдВрдЧрд┐рддрд▓реЗ рд╣реЛрддреЗ рдпреЗрдереЗ. рдЖрддрд╛ рдореА рддреЗ рдХрд╕реЗ рддрдпрд╛рд░ рдХрд░рд╛рд╡реЗ рдпрд╛рдмрджреНрджрд▓ рдЕрдзрд┐рдХ рддрдкрд╢реАрд▓рд╡рд╛рд░ рд╕рд╛рдВрдЧреЗрди. BuilderConfig рдПрдХ рдХрдиреНрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдЖрд╣реЗ рдмрд┐рд▓реНрдбрд░. рдордзреНрдпреЗ рдЕрд╢рд╛ рдбрд┐рдЭрд╛рдЗрдирд░ c['рдмрд┐рд▓реНрдбрд░реНрд╕'] рдЖрдкрдг рдЕрдиреЗрдХ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реВ рд╢рдХрддрд╛, рдХрд╛рд░рдг рд╣реА рд╡рд╕реНрддреВрдВрдЪреА рд╢реАрдЯ рдЖрд╣реЗ рдмрд┐рд▓реНрдбрд░ рдкреНрд░рдХрд╛рд░ рдЖрддрд╛ рд╡рд░реВрди рдЙрджрд╛рд╣рд░рдг рдкреБрдиреНрд╣рд╛ рд▓рд┐рд╣реВ рдмрд┐рд▓реНрдбрдмреЙрдЯ, рдЖрдордЪреНрдпрд╛ рдХрд╛рд░реНрдпрд╛рдЪреНрдпрд╛ рдЬрд╡рд│ рдЖрдгрдд рдЖрд╣реЗ.


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

рдЖрддрд╛ рдореА рддреБрдореНрд╣рд╛рд▓рд╛ рдкреЕрд░рд╛рдореАрдЯрд░реНрд╕рдмрджреНрджрд▓ рд╕рд╛рдВрдЧреЗрди BuilderConfig.

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

рдХрд╛рдордЧрд╛рд░рд╛рдВрдЪреА рдирд╛рд╡реЗ рдкрддреНрд░рдХ рд╕рдорд╛рд╡рд┐рд╖реНрдЯ рдЖрд╣реЗ рдХрд╛рдордЧрд╛рд░-рдПрд╕. рддреНрдпрд╛рдкреИрдХреА рдкреНрд░рддреНрдпреЗрдХ рдЬреЛрдбрдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ c['рдХрд╛рдордЧрд╛рд░'].

рдХрд╛рд░рдЦрд╛рдирд╛ - рд╡рд┐рд╢рд┐рд╖реНрдЯ рддрдпрд╛рд░, рдЬреНрдпрд╛рд╢реА рддреЗ рд╕рдВрдмрдВрдзрд┐рдд рдЖрд╣реЗ рдмрд┐рд▓реНрдбрд░. рддреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд╛рдард╡реЗрд▓ рддрдпрд╛рд░ рд╡рд░ рдХрд╛рдордЧрд╛рд░ рдпрд╛рдордзреНрдпреЗ рд╕рдорд╛рд╡рд┐рд╖реНрдЯ рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рд╕рд░реНрд╡ рдкрд╛рдпрд▒реНрдпрд╛ рдкреВрд░реНрдг рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рддрдпрд╛рд░-рдж.

6. рддреБрдордЪреНрдпрд╛ рд╕реНрд╡рддрдГрдЪреНрдпрд╛ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рдирдЪреЗ рдЙрджрд╛рд╣рд░рдг

рдпреЗрдереЗ рдкреНрд░рдХрд▓реНрдк рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░рдЪреЗ рдЙрджрд╛рд╣рд░рдг рдЖрд╣реЗ рдЬреЗ рдореА рджреНрд╡рд╛рд░реЗ рдЕрдВрдорд▓рд╛рдд рдЖрдгрдгреНрдпрд╛рдЪрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рджреЗрддреЛ рдмрд┐рд▓реНрдбрдмреЙрдЯ
.

рдЖрдореНрд╣реА рдЖрд╡реГрддреНрддреА рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рдгрд╛рд▓реА рдореНрд╣рдгреВрди рд╡рд╛рдкрд░реВ svn. рд░реЗрдкреЙрдЬрд┐рдЯрд░реА рд╕реНрд╡рддрдГрдЪ рдХрд╛рд╣реА рдкреНрд░рдХрд╛рд░рдЪреНрдпрд╛ рдХреНрд▓рд╛рдЙрдбрдордзреНрдпреЗ рд╕реНрдерд┐рдд рдЕрд╕реЗрд▓. рд╣рд╛ рдпрд╛ рдврдЧрд╛рдЪрд╛ рдкрддреНрддрд╛ рдЖрд╣реЗ svn.host/svn/yourProject/trunk. рдврдЧрд╛рдЦрд╛рд▓реА svn рдЦрд╛рддреЗ рд╡рд╛рдкрд░рдХрд░реНрддрд╛рдирд╛рд╡ рдЖрд╣реЗ: рд╡рд╛рдкрд░рдХрд░реНрддрд╛, passwd: рдкрд╛рд╕рд╡рд░реНрдб. рдЪрд░рдгрд╛рдВрдЪреЗ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдгрд╛рд▒реНрдпрд╛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рддрдпрд╛рд░-a рджреЗрдЦреАрд▓ рд╢рд╛рдЦреЗрдд рдЕрд╕реЗрд▓ svn, рд╡реЗрдЧрд│реНрдпрд╛ рдлреЛрд▓реНрдбрд░рдордзреНрдпреЗ рдмрд┐рд▓реНрдбрдмреЙрдЯ/рд╡рд░реНрдХрд░_рд▓рд┐рдирдХреНрд╕. рдпрд╛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЬрддрди рдХреЗрд▓реЗрд▓реНрдпрд╛ рдорд╛рд▓рдорддреНрддреЗрд╕рд╣ рд░реЗрдкреЙрдЬрд┐рдЯрд░реАрдордзреНрдпреЗ рд╕реНрдерд┐рдд рдЖрд╣реЗрдд рдХрд╛рд░реНрдпрд╡рд╛рд╣реА рдХрд░рдгреНрдпрд╛рдпреЛрдЧреНрдп.

рдмрд┐рд▓реНрдбрдорд╛рд╕реНрдЯрд░ ╨╕ рдХрд╛рдордЧрд╛рд░ рддреНрдпрд╛рдЪ рд╣реЛрд╕реНрдЯрд╡рд░ рдЪрд╛рд▓рд╡рд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ.рд╣реЛрд╕реНрдЯ .рдмрд┐рд▓реНрдбрдорд╛рд╕реНрдЯрд░ рддреНрдпрд╛рдЪреНрдпрд╛ рдлрд╛рдпрд▓реА рдлреЛрд▓реНрдбрд░рдордзреНрдпреЗ рд╕рдВрдЧреНрд░рд╣рд┐рдд рдХрд░рддреЗ /home/habr/master. рдХрд╛рдордЧрд╛рд░ рддреЗ рдЦрд╛рд▓реАрд▓ рдорд╛рд░реНрдЧрд╛рдд рд╕рд╛рдард╡рд▓реЗ рдЖрд╣реЗ /home/habr/worker. рд╕рдВрдкреНрд░реЗрд╖рдг рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдмрд┐рд▓реНрдбрдорд╛рд╕реНрдЯрд░-a рдЖрдгрд┐ рдХрд╛рдордЧрд╛рд░-рдП рдкреНрд░реЛрдЯреЛрдХреЙрд▓рдиреБрд╕рд╛рд░ рдкреЛрд░реНрдЯ 4000 рджреНрд╡рд╛рд░реЗ рдЪрд╛рд▓рддреЗ рдмрд┐рд▓реНрдбрдмреЙрдЯ-рдЕ, рдореНрд╣рдгрдЬреЗ 'рдкреАрдмреА' рдкреНрд░реЛрдЯреЛрдХреЙрд▓

рд▓рдХреНрд╖реНрдп рдкреНрд░рдХрд▓реНрдк рдкреВрд░реНрдгрдкрдгреЗ рдкрд╛рдпрдердирдордзреНрдпреЗ рд▓рд┐рд╣рд┐рд▓реЗрд▓рд╛ рдЖрд╣реЗ. рддреНрдпрд╛рддреАрд▓ рдмрджрд▓рд╛рдВрдЪрд╛ рдорд╛рдЧреЛрд╡рд╛ рдШреЗрдгреЗ, рдПрдХреНрдЭрд┐рдХреНрдпреБрдЯреЗрдмрд▓ рдлрд╛рдЗрд▓ рддрдпрд╛рд░ рдХрд░рдгреЗ, рдХрд╛рдЧрджрдкрддреНрд░реЗ рддрдпрд╛рд░ рдХрд░рдгреЗ рдЖрдгрд┐ рдЪрд╛рдЪрдгреА рдШреЗрдгреЗ рд╣реЗ рдХрд╛рд░реНрдп рдЖрд╣реЗ. рдЕрдпрд╢рд╕реНрд╡реА рдЭрд╛рд▓реНрдпрд╛рд╕, рд╕рд░реНрд╡ рд╡рд┐рдХрд╛рд╕рдХрд╛рдВрдирд╛ рдИрдореЗрд▓рджреНрд╡рд╛рд░реЗ рд╕рдВрджреЗрд╢ рдкрд╛рдард╡рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ рдХреА рдПрдХ рдЕрдпрд╢рд╕реНрд╡реА рдХреНрд░рд┐рдпрд╛ рдЖрд╣реЗ.

рд╡реЗрдм рдкреНрд░рджрд░реНрд╢рди рдмрд┐рд▓реНрдбрдмреЙрдЯ рд╕рд╛рдареА рдЖрдореНрд╣реА рдкреЛрд░реНрдЯ 80 рд╢реА рдХрдиреЗрдХреНрдЯ рдХрд░реВ рдкреНрд░реЛрдЬреЗрдХреНрдЯ.рд╣реЛрд╕реНрдЯ. Apatch рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдирд╛рд╣реА. рдЧреНрд░рдВрдерд╛рд▓рдпрд╛рдЪрд╛ рднрд╛рдЧ рдореНрд╣рдгреВрди рдкреАрд│ рдЖрдзреАрдкрд╛рд╕реВрди рдПрдХ рд╡реЗрдм рд╕рд░реНрд╡реНрд╣рд░ рдЖрд╣реЗ, рдмрд┐рд▓реНрдбрдмреЙрдЯ рддреЗ рд╡рд╛рдкрд░рддреЗ.

рд╕рд╛рдареА рдЕрдВрддрд░реНрдЧрдд рдорд╛рд╣рд┐рддреА рд╕рд╛рдард╡рдгреНрдпрд╛рд╕рд╛рдареА рдмрд┐рд▓реНрдбрдмреЙрдЯ рдЖрдореНрд╣реА рд╡рд╛рдкрд░реВ рдЪреМрд░рд╕.

рдореЗрд▓рд┐рдВрдЧрд╕рд╛рдареА рд╣реЛрд╕реНрдЯ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ smtp.your.domain - рд╣реЗ рдореЗрд▓рд╡рд░реВрди рдкрддреНрд░реЗ рдкрд╛рдард╡рд┐рдгреНрдпрд╛рд╕ рдЕрдиреБрдорддреА рджреЗрддреЗ [рдИрдореЗрд▓ рд╕рдВрд░рдХреНрд╖рд┐рдд] рдкреНрд░рдорд╛рдгреАрдХрд░рдгрд╛рд╢рд┐рд╡рд╛рдп. рдпрдЬрдорд╛рдирдкрджрд╛рд╡рд░рд╣реА'SMTP ' рдкреЛрд╕реНрдЯ 1025 рд╡рд░ рдорд┐рдирд┐рдЯреЗ рдРрдХрд▓реА рдЬрд╛рдд рдЖрд╣реЗрдд.

рдкреНрд░рдХреНрд░рд┐рдпреЗрдд рджреЛрди рд▓реЛрдХ рд╕рд╛рдореАрд▓ рдЖрд╣реЗрдд: рдкреНрд░рд╢рд╛рд╕рди ╨╕ рд╡рд╛рдкрд░рдХрд░реНрддрд╛. рдкреНрд░рд╢рд╛рд╕рдХ рдкреНрд░рд╢рд╛рд╕рдХ рдмрд┐рд▓реНрдбрдмреЙрдЯ. рд╡рд╛рдкрд░рдХрд░реНрддрд╛ рд╡рдЪрдирдмрджреНрдз рд╡реНрдпрдХреНрддреА рдЖрд╣реЗ рд╡рдЪрдирдмрджреНрдз-рдПрд╕.

рдПрдХреНрдЭрд┐рдХреНрдпреБрдЯреЗрдмрд▓ рдлрд╛рдЗрд▓ рджреНрд╡рд╛рд░реЗ рд╡реНрдпреБрддреНрдкрдиреНрди рдХреЗрд▓реА рдЬрд╛рддреЗ рдкрд╛рдпрдЗрдиреНрд╕реНрдЯреЙрд▓рд░. рджреНрд╡рд╛рд░реЗ рджрд╕реНрддрдРрд╡рдЬреАрдХрд░рдг рддрдпрд╛рд░ рдХреЗрд▓реЗ рдЬрд╛рддреЗ рдбреЙрдХреНрд╕реАрдЬрди.

рдпрд╛ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░рд╕рд╛рдареА рдореА рд╣реЗ рд▓рд┐рд╣рд┐рд▓реЗ: 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"
}

рдкреНрд░рдердо рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдмрд┐рд▓реНрдбрдорд╛рд╕реНрдЯрд░-a рдЖрдгрд┐ рдХрд╛рдордЧрд╛рд░-рдЕ рдирдВрддрд░ рд╣реА рдлрд╛рдИрд▓ рдкреЗрд╕реНрдЯ рдХрд░рд╛ master.cfg ╨▓ /home/habr/master.

рдкреБрдвреАрд▓ рдкрд╛рдпрд░реА рдореНрд╣рдгрдЬреЗ рд╕реЗрд╡рд╛ рд╕реБрд░реВ рдХрд░рдгреЗ рдмрд┐рд▓реНрдбрдорд╛рд╕реНрдЯрд░aa


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_alwaystruk рд░реЗрдкреЙрдЬрд┐рдЯрд░реАрдордзреНрдпреЗ рдлрдХреНрдд рд╕рдорд╛рд╡рд┐рд╖реНрдЯ рдЖрд╣реЗ рдЕрд╕реЗ рд╕рд╛рдВрдЧреВрди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реБрд▓рдн рдХрд░рддреЗ рдЯреНрд░рдВрдХ.

╨Т рд╡реЗрд│рд╛рдкрддреНрд░рдХ рдЕрд╕реЗ рд╕реВрдЪрд┐рдд рдлрд┐рд▓реНрдЯрд░ рдмрджрд▓рд╛рдХреЛрдг рдкрд╛рд╣рддреЛ рдХрд╛рд╣реАрд╣реА рдирд╛рд╣реА рдЖрдгрд┐ рддреНрдпрд╛рдЪреНрдпрд╛рд╢реА рдПрдХ рд╢рд╛рдЦрд╛ рд╕рдВрдмрджреНрдз рдХрд░рддреЗ рдЯреНрд░рдВрдХ рджреНрд╡рд╛рд░реЗ рджрд┐рд▓реЗрд▓реНрдпрд╛ рдЕрд╕реЛрд╕рд┐рдПрд╢рдирдиреБрд╕рд╛рд░ split_file_alwaystruk. рдордзреАрд▓ рдмрджрд▓рд╛рдВрдирд╛ рдкреНрд░рддрд┐рд╕рд╛рдж рджреЗрдд рдЖрд╣реЗ рдЯреНрд░рдВрдХ, рд▓рд╛рдБрдЪ рдХрд░рддреЗ рдмрд┐рд▓реНрдбрд░ рдирд╛рд╡рд╛рд╕рд╣ рддреБрдордЪрд╛ рдкреНрд░рдХрд▓реНрдк.

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

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

6.3 рддреБрдореНрд╣рд╛рд▓рд╛ рдкрддреНрд░: рдкрддреНрд░рдХрд╛рд░рд╛рдВрдирд╛ рдШреЛрд╖рд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЕрдзрд┐рдХреГрдд рдЖрд╣реЗрдд


рдпрд╛рдВрдиреА рдИрдореЗрд▓рджреНрд╡рд╛рд░реЗ рд╕реВрдЪрдирд╛ рдкрд╛рдард╡рдгреНрдпрд╛рдЪреА рд╕реЗрд╡рд╛ рдЖрд╣реЗ.


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

рддреЛ рд╕рдВрджреЗрд╢ рдкрд╛рдард╡реВ рд╢рдХрддреЛ рд╡реЗрдЧрд│рд╛ рдорд╛рд░реНрдЧ.

MailNotifier рд╕реВрдЪрдирд╛ рдкрд╛рдард╡рдгреНрдпрд╛рд╕рд╛рдареА рдИрдореЗрд▓ рд╡рд╛рдкрд░рддреЗ.

template_html рд╡реГрддреНрддрдкрддреНрд░рд╛рд╕рд╛рдареА рдордЬрдХреВрд░ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╕реЗрдЯ рдХрд░рддреЗ. рдорд╛рд░реНрдХрдЕрдк рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА HTML рдЪрд╛ рд╡рд╛рдкрд░ рдХреЗрд▓рд╛ рдЬрд╛рддреЛ. рддреЗ рдЗрдВрдЬрд┐рдирджреНрд╡рд╛рд░реЗ рд╕реБрдзрд╛рд░рд┐рдд рдХреЗрд▓реЗ рдЬрд╛рддреЗ jinja2 (рд╢реА рддреБрд▓рдирд╛ рдХреЗрд▓реА рдЬрд╛рдК рд╢рдХрддреЗ django). рдмрд┐рд▓реНрдбрдмреЙрдЯ рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓реНрд╕рдЪрд╛ рдПрдХ рд╕рдВрдЪ рдЖрд╣реЗ рдЬреНрдпрд╛рдЪреА рдореВрд▓реНрдпреЗ рд╕рдВрджреЗрд╢ рдордЬрдХреВрд░ рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рдЪреНрдпрд╛ рдкреНрд░рдХреНрд░рд┐рдпреЗрджрд░рдореНрдпрд╛рди рдЯреЗрдореНрдкрд▓реЗрдЯрдордзреНрдпреЗ рдмрджрд▓рд▓реА рдЬрд╛рддрд╛рдд. рд╣реЗ рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓реНрд╕ {{ рдбрдмрд▓ рдХрд░реНрд▓реА рдмреНрд░реЗрд╕реЗрд╕ }} рдордзреНрдпреЗ рдмрдВрджрд┐рд╕реНрдд рдЖрд╣реЗрдд. рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рд╕рд╛рд░рд╛рдВрд╢ рдкреВрд░реНрдг рдЭрд╛рд▓реЗрд▓реНрдпрд╛ рдСрдкрд░реЗрд╢рдиреНрд╕рдЪреА рд╕реНрдерд┐рддреА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЗ, рдореНрд╣рдгрдЬреЗрдЪ рдпрд╢ рдХрд┐рдВрд╡рд╛ рдЕрдкрдпрд╢. рдП рдкреНрд░рдХрд▓реНрдк рдЖрдЙрдЯрдкреБрдЯ рдХрд░реЗрд▓ рддреБрдордЪрд╛ рдкреНрд░рдХрд▓реНрдк. рддрд░, рдордзреНрдпреЗ рдХрдВрдЯреНрд░реЛрд▓ рдХрдорд╛рдВрдб рд╡рд╛рдкрд░реБрди jinja2, рдЪрд▓ рдмрд┐рд▓реНрдбрдмреЙрдЯ-рдП рдЖрдгрд┐ рдкрд╛рдпрдерди рд╕реНрдЯреНрд░рд┐рдВрдЧ рдлреЙрд░рдореЕрдЯрд┐рдВрдЧ рдЯреВрд▓реНрд╕, рддреБрдореНрд╣реА рдЦреВрдк рдорд╛рд╣рд┐рддреАрдкреВрд░реНрдг рд╕рдВрджреЗрд╢ рддрдпрд╛рд░ рдХрд░реВ рд╢рдХрддрд╛.

MailNotifier рдЦрд╛рд▓реАрд▓ рдпреБрдХреНрддрд┐рд╡рд╛рдж рд╕рдорд╛рд╡рд┐рд╖реНрдЯреАрдд рдЖрд╣реЗ.

addr рдкрд╛рд╕реВрди - рдЬреНрдпрд╛ рдкрддреНрддреНрдпрд╛рд╡рд░реВрди рдкреНрд░рддреНрдпреЗрдХрд╛рд▓рд╛ рд╡реГрддреНрддрдкрддреНрд░ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдИрд▓.

рд╕реНрд╡рд╛рд░рд╕реНрдп рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рдВрдирд╛ рдкрд╛рдард╡рд╛=True рдмрдирд╡рд▓реЗрд▓реНрдпрд╛ рдорд╛рд▓рдХрд╛рд▓рд╛ рдЖрдгрд┐ рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рд▓рд╛ рд╕рдВрджреЗрд╢ рдкрд╛рдард╡рддреЗ рд╡рдЪрдирдмрджреНрдз.

рд╡рд░ рдмрдШ тАФ рдПрдХ рдкреНрд░рддреНрдпрдп рдЬреЛ рд╡реГрддреНрддрдкрддреНрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдгрд╛рд▒реНрдпрд╛ рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рдВрдЪреНрдпрд╛ рдирд╛рд╡рд╛рдВрдордзреНрдпреЗ рдЬреЛрдбрд▓рд╛ рдЬрд╛рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ. рддрд░ рдкреНрд░рд╢рд╛рд╕рди рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рд▓рд╛ рдкрддреНрддреНрдпрд╛рд╡рд░ рд╡реГрддреНрддрдкрддреНрд░ рдХрд╕реЗ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдИрд▓ [рдИрдореЗрд▓ рд╕рдВрд░рдХреНрд╖рд┐рдд].

relayhost рд╣реЛрд╕реНрдЯрдирд╛рд╡ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рдЬреНрдпрд╛рд╡рд░ рд╕рд░реНрд╡реНрд╣рд░ рдЙрдШрдбрд▓рд╛ рдЖрд╣реЗ SMTPрдПрдХ smptPort рдРрдХрдгрд╛рд░рд╛ рдкреЛрд░реНрдЯ рдХреНрд░рдорд╛рдВрдХ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ SMTP рд╕рд░реНрд╡реНрд╣рд░

рдореЛрдб="рдЪреЗрддрд╛рд╡рдгреА" рдХрд┐рдорд╛рди рдПрдХ рдкрд╛рдКрд▓ рдЕрд╕реЗрд▓ рддрд░рдЪ рдореЗрд▓рд┐рдВрдЧ рдХреЗрд▓реЗ рдкрд╛рд╣рд┐рдЬреЗ рдЕрд╕реЗ рдореНрд╣рдгрддрд╛рдд рддрдпрд╛рд░-рдП, рдЬреЗ рд╕реНрдерд┐рддреА рдЕрдпрд╢рд╕реНрд╡реА рдХрд┐рдВрд╡рд╛ рдЪреЗрддрд╛рд╡рдгреАрд╕рд╣ рд╕рдорд╛рдкреНрдд рдЭрд╛рд▓реЗ. рдпрд╢рд╛рдЪреНрдпрд╛ рдмрд╛рдмрддреАрдд, рд╡реГрддреНрддрдкрддреНрд░ рдкрд╛рдард╡рдгреНрдпрд╛рдЪреА рдЧрд░рдЬ рдирд╛рд╣реА.

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

рд╕рдВрджреЗрд╢ рд╕реНрд╡рд░реВрдк рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдЖрд╣реЗ рдЬреЛ рд╕рдВрджреЗрд╢ рд╕реНрд╡рд░реВрдк, рддреНрдпрд╛рдЪреЗ рдЯреЗрдореНрдкрд▓реЗрдЯ рдЖрдгрд┐ рдЙрдкрд▓рдмреНрдз рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓реНрд╕рдЪрд╛ рд╕рдВрдЪ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЛ jinja2. рд╕рд╛рд░рдЦреЗ рдкрд░реНрдпрд╛рдп wantProperties = рдЦрд░реЗ ╨╕ wantSteps = рдЦрд░реЗ рдЙрдкрд▓рдмреНрдз рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓реНрд╕рдЪрд╛ рд╣рд╛ рд╕рдВрдЪ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рд╛.

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

рдЖрдореНрд╣реА рддреЗ рдХреЗрд▓реЗ! рдЕрднрд┐рдирдВрджрди

рдЖрдореНрд╣реА рдЖрдордЪреЗ рд╕реНрд╡рддрдГрдЪреЗ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рддрдпрд╛рд░ рдХреЗрд▓реЗ рдЖрдгрд┐ рддреЗ рд╕рдХреНрд╖рдо рдЕрд╕рд▓реЗрд▓реА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдкрд╛рд╣рд┐рд▓реА. рдмрд┐рд▓реНрдбрдмреЙрдЯ. рдорд▓рд╛ рд╡рд╛рдЯрддрдВ, рддреБрдордЪрд╛ рдкреНрд░рдХрд▓реНрдк рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╣реЗ рд╕рд╛рдзрди рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ рдХреА рдирд╛рд╣реА рд╣реЗ рд╕рдордЬреВрди рдШреЗрдгреНрдпрд╛рд╕рд╛рдареА рд╣реЗ рдкреБрд░реЗрд╕реЗ рдЖрд╣реЗ. рддреБрдореНрд╣рд╛рд▓рд╛ рддреНрдпрд╛рдЪреНрдпрд╛рдд рд░рд╕ рдЖрд╣реЗ рдХрд╛? рддреЗ рддреБрдореНрд╣рд╛рд▓рд╛ рдЙрдкрдпреЛрдЧреА рдкрдбреЗрд▓ рдХрд╛? рддреНрдпрд╛рдЪреНрдпрд╛рд╕реЛрдмрдд рдХрд╛рдо рдХрд░рдгреЗ рд╕реЛрдпреАрдЪреЗ рдЖрд╣реЗ рдХрд╛? рдордЧ рдореА рд╣рд╛ рд▓реЗрдЦ рд╡реНрдпрд░реНрде рд▓рд┐рд╣рд┐рдд рдирд╛рд╣реА.

рдЖрдгрд┐ рдкреБрдвреЗ. рдорд▓рд╛ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рд╕рдореБрджрд╛рдп рд╡рд╛рдкрд░рд╛рдпрд▓рд╛ рдЖрд╡рдбреЗрд▓ рдмрд┐рд▓реНрдбрдмреЙрдЯ, рд╡рд┐рд╕реНрддреАрд░реНрдг рдЭрд╛рд▓реЗ, рд╣рд╕реНрддрдкреБрд╕реНрддрд┐рдХреЗрдЪреЗ рднрд╛рд╖рд╛рдВрддрд░ рдХреЗрд▓реЗ рдЧреЗрд▓реЗ рдЖрдгрд┐ рдЖрдгрдЦреА рдЙрджрд╛рд╣рд░рдгреЗ рдЖрд╣реЗрдд.

рддреБрдордЪреЗ рд▓рдХреНрд╖ рджрд┐рд▓реНрдпрд╛рдмрджреНрджрд▓ рд╕рд░реНрд╡рд╛рдВрдЪреЗ рдЖрднрд╛рд░. рд╢реБрднреЗрдЪреНрдЫрд╛.

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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛