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

рдмрд┐рд▓реНрдбрдмреЛрдЯ рдкрд░реАрдХреНрд╖рдг рдЪрд░реНрдЪрд╛
( рдкрд┐рдХреНрд╕рд╛рдмреЗ рд╕реЗ рдХрдВрдкреНрдпреВрдЯрд░рд╛рдЗрдЬрд╝рд░ рджреНрд╡рд╛рд░рд╛ рдЫрд╡рд┐ )

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

рдореЗрд░рд╛ рдирд╛рдо рдЗрд╡рдЧреЗрдиреА рдЪреЗрд░рдХрд┐рди рд╣реИ , рдореИрдВ рдЦрдирди рдХрдВрдкрдиреА рдкреЙрд▓реАрдореЗрдЯрд▓ рдореЗрдВ рд╡рд┐рдХрд╛рд╕ рдЯреАрдо рдХрд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рд╣реВрдВред

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

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

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

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

1. рдмрд┐рд▓реНрдбрдмреЙрдЯ рдХреНрдпреЛрдВ рд╣реИ?2. рдмрд┐рд▓реНрдбрдорд╛рд╕реНрдЯрд░ рдХреЗ рдиреЗрддреГрддреНрд╡ рдореЗрдВ рдЕрд╡рдзрд╛рд░рдгрд╛3. рд╕реНрдерд╛рдкрдирд╛4. рдкрд╣рд▓рд╛ рдХрджрдо
5. рд╡рд┐рдиреНрдпрд╛рд╕ред рд╕реНрдЯреЗрдк рдмрд╛рдп рд╕реНрдЯреЗрдк рд░реЗрд╕рд┐рдкреА
5.1 рдмрд┐рд▓реНрдбрдорд╛рд╕реНрдЯрд░рдСрдирдлрд┐рдЧ5.2 рдХрд╛рд░реНрдпрдХрд░реНрддрд╛5.3 рдкрд░рд┐рд╡рд░реНрддрди_ рд╕реНрд░реЛрдд5.4 рд╢реЗрдбреНрдпреВрд▓рд░
5.5 рдмрд┐рд▓реНрдбрдлреИрдХреНрдЯ5.6 рдмрд┐рд▓реНрдбрд░реЛрдВ
6. рд╕реНрд╡рдпрдВ рдХреЗ рд╡рд┐рдиреНрдпрд╛рд╕ рдХрд╛ рдЙрджрд╛рд╣рд░рдг
6.1 рдЕрдкрдиреЗ рдорд╛рд╕реНрдЯрд░ рдХреЗ рд░рд╛рд╕реНрддреЗ рдкрд░6.2 svn рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВ6.3 рдЖрдкрдХреЗ рд▓рд┐рдП рдПрдХ рдкрддреНрд░: рдкрддреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХреГрдд рд╣реИ
рд╣рдордиреЗ рдХрд░ рджрд┐рдЦрд╛рдпрд╛! рдореЗрд░реА рдмрдзрд╛рдИ


1. рдмрд┐рд▓реНрдбрдмреЙрдЯ рдХреНрдпреЛрдВ рд╣реИ?



рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рд╣рдмреНрд░-рдИ рдкрд░, рдореИрдВ рдмрд┐рд▓реНрдбрдмреЛрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдирд┐рд░рдВрддрд░ рдПрдХреАрдХрд░рдг рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓реЗрдЦ рдкрд░ рдЖрдпрд╛ рдерд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рдореБрдЭреЗ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реАрдкреВрд░реНрдг рд▓рдЧ рд░рд╣рд╛ рдерд╛ред рдПрдХ рдФрд░ рдЙрджрд╛рд╣рд░рдг рд╣реИ - рд╕рд░рд▓ ред рдЗрди рд▓реЗрдЦреЛрдВ рдХреЛ рдореИрдиреБрдЕрд▓ рд╕реЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рд╕реАрдЬрд╝рди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдЕрдВрдЧреНрд░реЗрдЬреА рдореЗрдВ рд╣реИред рдХреВрдк рдПрдХ рдЕрдЪреНрдЫрд╛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдмрд┐рдВрджреБ рд╣реИред рдЗрди рд▓реЗрдЦреЛрдВ рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдк рд╢рд╛рдпрдж BuildBot рдкрд░ рддреБрд░рдВрдд рдХреБрдЫ рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗред

рдЗрд╕реЗ рд░реЛрдХреЛ! рдХреНрдпрд╛ рдХрд┐рд╕реА рдиреЗ рднреА рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдЗрд╕рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛? рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ, рдХрдИ рдиреЗ рдЗрд╕реЗ рдЕрдкрдиреЗ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рд╣реИред рдЖрдк Google рдХреЛрдб рдЕрднрд┐рд▓реЗрдЦрд╛рдЧрд╛рд░ рдореЗрдВ рдмрд┐рд▓реНрдбрдмреЙрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред

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

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

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



рдмрд┐рд▓реНрдбрдмреЙрдЯ рдмрд┐рд▓реНрдбрдорд╛рд╕реНрдЯрд░

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

  • рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реНрд░реЛрдд рдЯреНрд░реА рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдЯреНрд░реИрдХ рдХрд░рддрд╛ рд╣реИ
  • рдХрдорд╛рдВрдбреНрд╕ рднреЗрдЬрддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд░реНрдХрд░ рд╕рд░реНрд╡рд┐рд╕ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдЙрд╕рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП
  • рдХрд┐рдП рдЧрдП рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рд╕реВрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ

BuildMaster рдорд╛рд╕реНрдЯрд░.cfg рдлрд╝рд╛рдЗрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рдлрд╝рд╛рдЗрд▓ BuildMaster рдХреА рдЬрдбрд╝ рдореЗрдВ рд╣реИред рдмрд╛рдж рдореЗрдВ рдореИрдВ рджрд┐рдЦрд╛рдКрдВрдЧрд╛ рдХрд┐ рдпрд╣ рдЬрдбрд╝ рдХреИрд╕реЗ рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИред Master.cfg рдлрд╝рд╛рдЗрд▓ рдореЗрдВ python рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдПрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ BuildBot рдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИред

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

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

рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╡рд░реНрдХрд░ рдХреЛрдб рдХрд╛ рдЪреЗрдХрдЖрдЙрдЯ рд╣рд░ рд╡рд░реНрдХрд░ рдкрд░ рд╣реЛрддрд╛ рд╣реИред

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



рддреЛ рдЪрд▓рд┐рдП рдЪрд▓рддреЗ рд╣реИрдВред рдореИрдВ рдореЗрдЬрдмрд╛рди рдХреЗ рд░реВрдк рдореЗрдВ Ubuntu 18.04 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛ред рдЗрд╕ рдкрд░ рдореИрдВ рдПрдХ BuildMaster -a рдФрд░ рдПрдХ Worker -a рд░рдЦреВрдБрдЧрд╛ ред рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ рдЖрдкрдХреЛ python3.7 рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА:

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

рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЬрд┐рдиреНрд╣реЗрдВ 3.7.1 рдХреЗ рдмрдЬрд╛рдп python3.7.2 рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЖрдк рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдп рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 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. рдкрд╣рд▓рд╛ рдХрджрдо



рдПрдХ рдмрд┐рд▓реНрдбрдорд╛рд╕реНрдЯрд░ рдмрдирд╛рдиреЗ рдХрд╛ рд╕рдордпред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдпрд╣ рдлрд╝реЛрд▓реНрдбрд░ / рд╣реЛрдо / рд╣реИрдмрд░ / рдорд╛рд╕реНрдЯрд░ рдореЗрдВ рд╣реЛрдЧрд╛ ред
 mkdir master buildbot create-master master #     

рдЕрдЧрд▓рд╛ рдХрджрдоред рдПрдХ рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдмрдирд╛рдПрдБред рд╣рдо рдЗрд╕реЗ рдлреЛрд▓реНрдбрд░ / рд╣реЛрдо / рд╣реИрдмрд░ / рд╡рд░реНрдХрд░ рдореЗрдВ рд░рдЦреЗрдВрдЧреЗ ред
 mkdir worker buildbot-worker create-worker --umask=0o22 --keepalive=60 worker localhost:4000 yourWorkerName password 

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

рдЧреЛрд▓реНрдбрди рдХреА
рдФрд░ рдЕрдм рдореИрдВрдиреЗ рдкрд┐рдЫрд▓реЗ рдкреИрд░рд╛рдЧреНрд░рд╛рдл рдХреЗ рд▓рд┐рдП рдЬреЛ рд▓рд┐рдЦрд╛ рд╣реИ: рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЬрд┐рд╕реЗ рдорд╛рд╕реНрдЯрд░ рдХреЛ рд╡рд░реНрдХрд░ рдХреЛ рджреВрд░рд╕реНрде рд░реВрдк рд╕реЗ рдЗрд╕ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдЙрд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реИред рд╕реНрдерд┐рддрд┐ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдПрдХ рдХреБрдВрдЬреА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ --umask = 0o22 , рдЬреЛ рдЗрд╕ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреЛ рд▓рд┐рдЦрдиреЗ рдкрд░ рдкреНрд░рддрд┐рдмрдВрдз рд▓рдЧрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдЕрдзрд┐рдХрд╛рд░ рдЫреЛрдбрд╝ рджреЗрддрд╛ рд╣реИред рдФрд░ рд╣рдореЗрдВ рдХреЗрд╡рд▓ рдпрд╣реА рдЪрд╛рд╣рд┐рдПред

рдмрд┐рд▓реНрдбрдорд╛рд╕реНрдЯрд░ рдФрд░ рд╡рд░реНрдХрд░ рдЖрдкрд╕ рдореЗрдВ рд╕рдВрдмрдВрдз рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЯреВрдЯ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд╡рд░реНрдХрд░ рдХреБрдЫ рд╕рдордп рдХреЗ рд▓рд┐рдП рдмрд┐рд▓реНрдбрдорд╛рд╕реНрдЯрд░ рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдХреЛрдИ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдирд╣реАрдВ рдорд┐рд▓рддреА рд╣реИ, рддреЛ рдХрдиреЗрдХреНрд╢рди рдХреЛ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдХреБрдВрдЬреА - рд╢рд╛рд╕рдирд╛рддреНрдордХ = 60 рдмрд╕ рд╡рд╣ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдЙрд╕ рд╕рдордп рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рд░рд┐рдмреВрдЯ рдХрдиреЗрдХреНрдЯ рд╣реЛрддреЗ рд╣реИрдВ ред

5. рд╡рд┐рдиреНрдпрд╛рд╕ред рд╕реНрдЯреЗрдк рдмрд╛рдп рд╕реНрдЯреЗрдк рд░реЗрд╕рд┐рдкреА



рдмрд┐рд▓реНрдбрдорд╛рд╕реНрдЯрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдорд╢реАрди рдХреА рддрд░рдл рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рд╣рдордиреЗ create-master рдХрдорд╛рдВрдб рдЪрд▓рд╛рдпрд╛ред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ / рдШрд░ / рд╣реИрдмрд░ / рдорд╛рд╕реНрдЯрд░ рд╣реИ ред Master.cfg рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдЕрднреА рддрдХ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдХрдорд╛рдВрдб рдиреЗ рдкрд╣рд▓реЗ рд╣реА Master.cmg.sample рдлрд╝рд╛рдЗрд▓ рдмрдирд╛ рд▓реА рд╣реИред рдЖрдкрдХреЛ рдЗрд╕рдХрд╛ рдирд╛рдо рдмрджрд▓рдХрд░ Master.cfg.sample рдореЗрдВ master.cfg рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ
 mv master.cfg.sample 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.imtqy.com/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 рдмрд┐рд▓реНрдбрдорд╛рд╕реНрдЯрд░рдСрдирдлрд┐рдЧ


 c = BuildmasterConfig = {} 

BuildmasterConfig - рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдореВрд▓ рд╢рдмреНрджрдХреЛрд╢ред рдпрд╣ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЙрдкрдпреЛрдЧ рдореЗрдВ рдЖрд╕рд╛рдиреА рдХреЗ рд▓рд┐рдП, рдЗрд╕рдХрд╛ рдЙрдкрдирд╛рдо "c" рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛрдб рдореЗрдВ рджрд░реНрдЬ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╕реА рдореЗрдВ рдореБрдЦреНрдп рдирд╛рдо ["keyFromDist" BuildMaster рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рд╢реНрдЪрд┐рдд рддрддреНрд╡ рд╣реИрдВред рдкреНрд░рддреНрдпреЗрдХ рдХреБрдВрдЬреА рдХреЗ рддрд╣рдд, рд╕рдВрдмрдВрдзрд┐рдд рд╡рд╕реНрддреБ рдХреЛ рдПрдХ рдореВрд▓реНрдп рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

5.2 рдХрд╛рд░реНрдпрдХрд░реНрддрд╛


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

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

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)) 

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

рдкрд╣рд▓рд╛ рддрд░реНрдХ рдЖрдкрдХреЗ рднрдВрдбрд╛рд░ рдХрд╛ рдорд╛рд░реНрдЧ рд╣реИред

рдХрд╛рд░реНрдпрджрд┐рд╡рд╕ рдЙрд╕ рдлрд╝реЛрд▓реНрдбрд░ рдХрд╛ рдкрде рд╣реИ рдЬрд╣рд╛рдБ рдкрд░ рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдХреЗ рдкрде рдкрд░, рдкрде / рдШрд░ / рд╣реИрдмрд░ / рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ / yourProject / build рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖, git рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЗ рд╕реНрдерд╛рдиреАрдп рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдЧрд╛ред

рд╢рд╛рдЦрд╛ рдореЗрдВ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╢рд╛рдЦрд╛ рд╣реЛрддреА рд╣реИ рдЬрд┐рд╕рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдПред

рдкреЛрд▓рдЗрдВрдЯрд░рд╡рд▓ рдореЗрдВ рд╕реЗрдХрдВрдб рдХреА рд╕рдВрдЦреНрдпрд╛ рд╣реЛрддреА рд╣реИ рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рдмрд┐рд▓реНрдбрдорд╛рд╕реНрдЯрд░ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рд▓рд┐рдП рднрдВрдбрд╛рд░ рдХрд╛ рд╕рд░реНрд╡реЗрдХреНрд╖рдг рдХрд░реЗрдЧрд╛ред

рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреЗ рдХрдИ рддрд░реАрдХреЗ рд╣реИрдВред

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

рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдФрд░ рдЕрдзрд┐рдХ рд╕реБрдВрджрд░ рддрд░реАрдХрд╛ рд╕рд░реНрд╡рд░ рд╕реЗ рд╕реАрдзреЗ рд╕рдВрджреЗрд╢ рднреЗрдЬрдирд╛ рд╣реИ, рдЬрд┐рд╕ рдкрд░ рдпрд╣ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд╕реНрд░реЛрдд рдХреЛрдб рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд┐рд▓реНрдбрдорд╛рд╕реНрдЯрд░ рдХреЛ рд╕реНрдерд┐рдд рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЬреИрд╕реЗ рд╣реА рдбреЗрд╡рд▓рдкрд░ рдПрдХ рдкреНрд░рддрд┐рдмрджреНрдз рдХрд░рддрд╛ рд╣реИ, рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рд╡рд╛рд▓рд╛ рд╕рд░реНрд╡рд░ BuildMaster рдХреЛ рдПрдХ рд╕рдВрджреЗрд╢ рднреЗрдЬреЗрдЧрд╛ ред рдФрд░, рдмрджрд▓реЗ рдореЗрдВ, PBChangeSource рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдХрд░ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╢реЗрдбреНрдпреВрд▓рд░ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬреЛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдФрд░ рдЗрд╕рдХреЗ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдЪрд░рдгреЛрдВ рдХреЛ рд╕рдХреНрд░рд┐рдп рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рд╡рд┐рдзрд┐ рдХрд╛ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣рд┐рд╕реНрд╕рд╛ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рд╕рд░реНрд╡рд░ рд╣реБрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИред рдкреНрд░рддрд┐рдмрджреНрдз рдХреЗ рджреМрд░рд╛рди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реБрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ, рдЖрдкрдХреЛ рд╕реЗрдВрдбрд╡рд┐рдЪ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдФрд░ рдмрд┐рд▓реНрдбрдорд╛рд╕реНрдЯрд░ рдХреЗ рдиреЗрдЯрд╡рд░реНрдХ рдкрддреЗ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ ред рдЖрдкрдХреЛ рдиреЗрдЯрд╡рд░реНрдХ рдкреЛрд░реНрдЯ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ PBChangeSource рдХреЛ рд╕реБрдиреЗрдЧрд╛ ред PBChangeSource , рд╡реИрд╕реЗ, BuildMaster рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИред рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЗ рд▓рд┐рдП рд╕рд░реНрд╡рд░ рдкрд░ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ -рдПрдХ рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдЬрд╣рд╛рдВ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рд╕реНрдерд┐рдд рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рдПрдХ рдмреИрдХрдЕрдк рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

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"])) 

рдЕрдиреБрд╕реВрдЪрдХ рдПрдХ рддрддреНрд╡ рд╣реИ рдЬреЛ рдПрдХ рдЯреНрд░рд┐рдЧрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдкреВрд░реЗ рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдФрд░ рдкрд░реАрдХреНрд╖рдг рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЛ рдЪрд▓рд╛рддрд╛ рд╣реИред
рдмрд┐рд▓реНрдбрдмреЛрдЯ рд╢реЗрдбреНрдпреВрд▓рд░реНрд╕

рдЬреЛ рдмрджрд▓рд╛рд╡ change_source рджреНрд╡рд╛рд░рд╛ рджрд░реНрдЬ рдХрд┐рдП рдЧрдП рдереЗ, рд╡реЗ BuildBot -a рдХреЗ рдСрдкрд░реЗрд╢рди рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдмрджрд▓ рджрд┐рдП рдЧрдП рдереЗ рдФрд░ рдЕрдм рдЙрдирдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдкреНрд░рддреНрдпреЗрдХ Sheduler рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрд┐рд▓реНрдб рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рдХрд░рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрд╣ рднреА рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЗрди рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдХрддрд╛рд░ рдореЗрдВ рдХрдм рднреЗрдЬрд╛ рдЬрд╛рдПред рд╡рд╕реНрддреБ рдмрд┐рд▓реНрдбрд░ рдПрдХ рдЕрдиреБрд░реЛрдз рдХрддрд╛рд░ рд░рдЦрддрд╛ рд╣реИ рдФрд░ рдПрдХ рдЕрд▓рдЧ рд╡рд░реНрдХрд░ -рдИ рдкрд░ рд╡рд░реНрддрдорд╛рди рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдХреА рд╕реНрдерд┐рддрд┐ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░рддрд╛ рд╣реИред рдмрд┐рд▓реНрдбрд░ рджреЛрдиреЛрдВ рдмрд┐рд▓реНрдбрдореЗрд╕реНрдЯрд░ -рдИ рдФрд░ рд╡рд░реНрдХрд░ -рдИ рдкрд░ рдореМрдЬреВрдж рд╣реИред рд╡рд╣ BuildMaster рд╕реЗ Worker рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдмрд┐рд▓реНрдб рднреЗрдЬрддрд╛ рд╣реИ, рдЪрд░рдгреЛрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдЬрд┐рд╕рдХрд╛ рдкрд╛рд▓рди рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдРрд╕реЗ рдЕрдиреБрд╕реВрдЪрд┐рдпреЛрдВ рдХреЗ рд╡рд░реНрддрдорд╛рди рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, 2 рдЯреБрдХрдбрд╝реЗ рдмрдирд╛рдП рдЬрд╛рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкреНрд░рддреНрдпреЗрдХ рдХрд╛ рдЕрдкрдирд╛ рдкреНрд░рдХрд╛рд░ рд╣реИред

SingleBranchScheduler рд╕рдмрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп рд╢реЗрдбреНрдпреВрд▓ рд╡рд░реНрдЧреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред рдпрд╣ рдПрдХ рд╢рд╛рдЦрд╛ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рджрд░реНрдЬ рдмрджрд▓рд╛рд╡ рд╕реЗ рдЯреНрд░рд┐рдЧрд░ рд╣реЛрддрд╛ рд╣реИред рдЬрдм рд╡рд╣ рдкрд░рд┐рд╡рд░реНрддрди рджреЗрдЦрддрд╛ рд╣реИ, рддреЛ рд╡рд╣ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рднреЗрдЬ рд╕рдХрддрд╛ рд╣реИ (рд╡рд┐рд╢реЗрд╖ рдкреИрд░рд╛рдореАрдЯрд░ рдЯреНрд░реАрд╕реНрдЯреЗрдмрд▓рдЯреЗрдорд░ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЕрд╡рдзрд┐ рдХреЗ рд▓рд┐рдП рд╕реНрдердЧрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ )ред рдирд╛рдо рдЙрд╕ рдЕрдиреБрд╕реВрдЪреА рдХрд╛ рдирд╛рдо рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдмрд┐рд▓реНрдбрдмреЙрдЯ -web рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЪреЗрдВрдЬрдлрд╝рд┐рд▓реНрдЯрд░ рдореЗрдВ рдПрдХ рдлрд╝рд┐рд▓реНрдЯрд░ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ , рдЬрд┐рд╕рдХреЗ рдкрд╛рд╕ рд╕реЗ рдЧреБрдЬрд░рдиреЗ рдХреЗ рдмрд╛рдж рд╢рд╛рдЦрд╛ рдореЗрдВ рдмрджрд▓рд╛рд╡ рд╢реЗрдбреНрдпреВрд▓ рдХреЛ рдмрд┐рд▓реНрдб рдЕрдиреБрд░реЛрдз рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рд┐рдд рдХрд░рддрд╛ рд╣реИред рдмрд┐рд▓реНрдбрд░ -рдирд╛рдо рдирд╛рдо рдмрд┐рд▓реНрдбрд░ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╣реИ, рдЬрд┐рд╕реЗ рд╣рдо рдереЛрдбрд╝реА рджреЗрд░ рдмрд╛рдж рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВрдЧреЗред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдирд╛рдо рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдирд╛рдо рдХреЗ рд╕рдорд╛рди рд╣реЛрдЧрд╛: yourProject ред

ForceScheduler рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд╛рдзрд╛рд░рдг рдмрд╛рдд рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╢реЗрдбреНрдпреВрд▓ BuildBot -web рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдорд╛рдЙрд╕ рдХреНрд▓рд┐рдХ рд╕реЗ рдЪрд╛рд▓реВ рд╣реЛрддрд╛ рд╣реИред Parameters рдореЗрдВ SingleBranchScheduler рдХреА рддрд░рд╣ рд╣реА рд╕рд╛рд░ рд╣реИред

рдкреАрдПрд╕ рдирдВрдмрд░ 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": "."})) 

periodicBuildTimer рд╕реЗрдХрдВрдб рдореЗрдВ рдЗрд╕ рдЖрд╡рдзрд┐рдХрддрд╛ рдХрд╛ рд╕рдордп рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИред

BuildFactory рдПрдХ рдареЛрд╕ рдмрд┐рд▓реНрдб рдмрдирд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдлрд┐рд░ рдмрд┐рд▓реНрдбрд░ рд╡рд░реНрдХрд░ рдХреЛ рднреЗрдЬрддрд╛ рд╣реИред BuildFactory рдЙрди рдЪрд░рдгреЛрдВ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдПрдХ рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдХреЛ рдкрд╛рд▓рди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдРрдбрд╕реНрдЯреЗрдк рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ рдЪрд░рдг рдЬреЛрдбрд╝реЗ рдЬрд╛рддреЗ рд╣реИрдВ ред


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

рджреВрд╕рд░рд╛ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдЪрд░рдг рд╣реИ, рдЯреНрд░рд╛рдпрд▓ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рд╡рд░реНрдХрд░ / рд╣реЛрдо / рд╣реИрдмрд░ / рд╡рд░реНрдХрд░ / рд╣реЗрд▓реЛрдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╡рд░реНрдХрд░ рдХреА рдУрд░ рд╕реЗ рд╣реЗрд▓реЛ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рдкрд░реНрдпрд╛рд╡рд░рдг рд╡реИрд░рд┐рдПрдмрд▓ PATHONPATH = рдХреЗ рд╕рд╛рде рдХреЙрд▓ рдХрд░реЗрдВ ... рддрд╛рдХрд┐ рдЖрдк рдЕрдкрдиреА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓рд┐рдЦ рд╕рдХреЗрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╡рд░реНрдХрд░ рдХреА рддрд░рдл рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░ рд╕рдХреЗрдВред use.ShellCommand рдЪрд░рдг рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗред рдЗрди рд▓рд┐рдкрд┐рдпреЛрдВ рдХреЛ рд╕реАрдзреЗ рднрдВрдбрд╛рд░ рдореЗрдВ рдбрд╛рд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдлрд┐рд░ рдЪреАрдЪрдЖрдЙрдЯ рдХреЗ рджреМрд░рд╛рди рд╡реЗ / рдШрд░ / рд╣рд╛рдм / рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ / yourProject / build рдЬрд╛рдПрдВрдЧреЗ ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдлрд┐рд░ рджреЛ "рдмрдЯреНрд╕" рд╣реИрдВ:
  1. рд╡рд░реНрдХрд░ рдХреЛ --umask рд╕реНрд╡рд┐рдЪ рдХреЗ рд╕рд╛рде рдмрдирд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рддрд╛рдХрд┐ рдпрд╣ рдЪреЗрдХрдЖрдЙрдЯ рдХреЗ рдмрд╛рдж рдирд┐рд╖реНрдкрд╛рджрди рдЕрдзрд┐рдХрд╛рд░реЛрдВ рдХреЛ рдЕрд╡рд░реБрджреНрдз рди рдХрд░реЗред
  2. рдЬрдм git рдЗрди рд▓рд┐рдкрд┐рдпреЛрдВ рдХреЛ рдЖрдЧреЗ рдмрдврд╝рд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдПрдХреНрд╕реНрдЯреИрдЪреЗрдмрд▓ рдкреНрд░реЙрдкрд░реНрдЯреА рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рддрд╛рдХрд┐ chechout -e Git рдХреЗ рд╕рд╛рде рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдЕрдзрд┐рдХрд╛рд░ рди рдЦреЛ рдЬрд╛рдПред


5.6 рдмрд┐рд▓реНрдбрд░реЛрдВ


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

рдмрд┐рд▓реНрдбрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЕрдм рдореИрдВ рдЗрд╕реЗ рдмрдирд╛рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдмрд╛рдд рдХрд░реВрдВрдЧрд╛ред рдмрд┐рд▓реНрдбрд░рдХреЙрдиреНрдлрд┐рдЧ рдПрдХ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдмрд┐рд▓реНрдбрд░ рд╣реИ ред рдЖрдк рдРрд╕реЗ рдХрдИ рдмрд┐рд▓реНрдбрд░реЛрдВ рдХреЛ c ['рдмрд┐рд▓реНрдбрд░реЛрдВ'] рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдмрд┐рд▓реНрдбрд░ рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд╕реНрддреБрдУрдВ рдХреА рд╕реВрдЪреА рд╣реИред рдЕрдм рд╣рдо BuildBot рд╕реЗ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦреЗрдВрдЧреЗ, рдЗрд╕реЗ рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдп рдХреЗ рдХрд░реАрдм рд▓рд╛рдПрдВрдЧреЗред
 c['builders'] = [] c['builders'].append(util.BuilderConfig(name="yourProject", workernames=["yourWorkerName"], factory=factory)) 

рдЕрдм рдореИрдВ рдорд╛рдкрджрдВрдбреЛрдВ рдмрд┐рд▓реНрдбрд░рдХреЙрдиреНрдлрд┐рдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рдКрдВрдЧрд╛ ред

рдирд╛рдо рд╕реЗрдЯ рдмрд┐рд▓реНрдбрд░ -aред рдпрд╣рд╛рдБ рд╣рдордиреЗ рдЗрд╕реЗ рдЖрдкрдХрд╛Project рдХрд╣рд╛ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рд╡рд░реНрдХрд░ рдкрд░ рдпрд╣ рдмрд╣реБрдд рд╣реА рд░рд╛рд╕реНрддрд╛ / рдШрд░ / рд╣реИрдмрд░ / рд╡рд░реНрдХрд░ / yourProject / build рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред Sheduler рдЙрд╕ рдирд╛рдо рд╕реЗ рдПрдХ рдмрд┐рд▓реНрдбрд░ рдХреА рдЦреЛрдЬ рдХрд░рддрд╛ рд╣реИред

Workernames рдореЗрдВ рд╢реНрд░рдорд┐рдХреЛрдВ рдХреА рд╕реВрдЪреА рд╣реЛрддреА рд╣реИред рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЛ рд╕реА ['рд╢реНрд░рдорд┐рдХреЛрдВ'] рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдХрд╛рд░рдЦрд╛рдирд╛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдирд┐рд░реНрдорд╛рдг рд╣реИ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдмрд┐рд▓реНрдбрд░ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИред рдпрд╣ рд╡рд░реНрдХрд░ рдХреЛ рдмрд┐рд▓реНрдб -рдП рдмрдирд╛рдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рдЪрд░рдгреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд┐рд▓реНрдб рдСрдмреНрдЬреЗрдХреНрдЯ рднреЗрдЬреЗрдЧрд╛ред

6. рд╕реНрд╡рдпрдВ рдХреЗ рд╡рд┐рдиреНрдпрд╛рд╕ рдХрд╛ рдЙрджрд╛рд╣рд░рдг



рдпрд╣рд╛рдБ рдПрдХ рдирдореВрдирд╛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВ рдмрд┐рд▓реНрдбрдмреЙрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рджреЗрддрд╛ рд╣реВрдВ
ред

рд╣рдо svn рдХреЛ рдПрдХ рд╕рдВрд╕реНрдХрд░рдг рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рдгрд╛рд▓реА рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдЦреБрдж рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдмрд╛рджрд▓ рдореЗрдВ рд╣реЛрдЧреАред рдпрд╣рд╛рдБ рдЗрд╕ рдмрд╛рджрд▓ рдХрд╛ рдкрддрд╛ svn.host/svn/yourProject/trunk рд╣реИ ред Svn рдХреЗ рддрд╣рдд рдХреНрд▓рд╛рдЙрдб рдореЗрдВ рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо рд╣реИ: рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ , рдкрд╛рд╕рд╡рд╛рд░реНрдб: рдкрд╛рд╕рд╡рд░реНрдб рдЦрд╛рддрд╛ред рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЬреЛ рдмрд┐рд▓реНрдб -рдП рд╕реНрдЯреЗрдкреНрд╕ рд╣реЛрддреЗ рд╣реИрдВ, рд╡реЗ рднреА svn рд╢рд╛рдЦрд╛ рдореЗрдВ, рдПрдХ рдЕрд▓рдЧ рдмрд┐рд▓реНрдбрдмреЙрдЯ / рд╡рд░реНрдХрд░_рд▓рд┐рдирдХреНрд╕ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдкрдбрд╝реЗ рд╣реЛрдВрдЧреЗ ред рдпреЗ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд╕рд╛рде рднрдВрдбрд╛рд░ рдореЗрдВ рд╣реИрдВред

рдмрд┐рд▓реНрдбрдорд╛рд╕реНрдЯрд░ рдФрд░ рд╡рд░реНрдХрд░ рдПрдХ рд╣реА рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдкрд░ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ редрд╣реЛрд╕реНрдЯ рд╣реЛрд╕реНрдЯред рдмрд┐рд▓реНрдбрдорд╛рд╕реНрдЯрд░ рдЕрдкрдиреА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ / рд╣реЛрдо / рд╣реИрдмрд░ / рдорд╛рд╕реНрдЯрд░ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ ред рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрде / рдШрд░ / рд╣рд╛рдмрд░ / рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ ред рдмрд┐рд▓реНрдбрдмрд╕реНрдЯрд░ рдФрд░ рд╡рд░реНрдХрд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рдмреАрдЪ рд╕рдВрдЪрд╛рд░ рдмрд┐рд▓реНрдбрдмреЙрдЯ -рдП рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ 4000 рдкреЛрд░реНрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ 'pb' рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╣реИред

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

рд╣рдо рдкреНрд░реЛрдЬреЗрдХреНрдЯ.рд╣реЛрд╕реНрдЯ рдХреЗ рд▓рд┐рдП рдмрд┐рд▓реНрдбрдмреЙрдЯ рд╡реЗрдм рдореИрдкрд┐рдВрдЧ рдХреЛ рдкреЛрд░реНрдЯ 80 рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВрдЧреЗред Apatch рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣реИред рдЯреНрд╡рд┐рд╕реНрдЯреЗрдб рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рд╡реЗрдм рд╕рд░реНрд╡рд░ рд╣реИ, рдмрд┐рд▓реНрдбрдмреЙрдЯ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред

рдмрд┐рд▓реНрдбрдмреЙрдЯ рдХреЗ рд▓рд┐рдП рдЖрдВрддрд░рд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдо рд╕рд╛рдЗрдХреНрд▓рд╛рдЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред

рдореЗрд▓рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдореЗрдЬрдмрд╛рди smtp.your.domain рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ - рдпрд╣ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХреЗ рдмрд┐рдирд╛ projectHost@your.domain рд╕реЗ рдИрдореЗрд▓ рднреЗрдЬрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдореЗрдЬрдмрд╛рди ' smtp ' рдкрд░ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ 1025 рдкрд░ рд╕реБрдирд╛ рдЬрд╛рддрд╛ рд╣реИред

рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рджреЛ рд╡реНрдпрдХреНрддрд┐ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ: рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ ред рдмрд┐рд▓реНрдбрдмреЛрдЯ рдХреЛ рдкреНрд░рд╢рд╛рд╕рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд░рддрд┐рдмрджреНрдз рд╡реНрдпрдХреНрддрд┐ рд╣реИред

рдПрдХ рдПрдХреНрд╕реНрдЯреИрдЪреЗрдмрд▓ рдлрд╝рд╛рдЗрд▓ pyinstaller рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИ ред рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг doxygen рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИред

рдЗрд╕ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдЗрд╕ рдорд╛рд╕реНрдЯрд░ рдХреЛ рд▓рд┐рдЦрд╛ рд╣реИред

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="projectHost@your.domain", sendToInterestedUsers=True, lookup="your.domain", relayhost="smtp.your.domain", smtpPort=1025, mode="warnings", extraRecipients=['user@your.domain'], messageFormatter=reporters.MessageFormatter( template=template_html, template_type='html', wantProperties=True, wantSteps=True) ) c['services'] = [sendMessageToAll] c['title'] = "The process of bulding" c['titleURL'] = "http://project.host:80/" c['buildbotURL'] = "http://project.host" c['www'] = dict(port=80, plugins=dict(waterfall_view={}, console_view={}, grid_view={})) c['db'] = { 'db_url' : "sqlite:///state.sqlite" } 


рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдЖрдкрдХреЛ BuildMaster рдФрд░ Worker -a рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛ред рдлрд┐рд░ рдЗрд╕ рдорд╛рд╕реНрдЯрд░.рдХрдл рдлрд╝рд╛рдЗрд▓ рдХреЛ / рд╣реЛрдо / рд╣рдмреНрд░ / рдорд╛рд╕реНрдЯрд░ рдореЗрдВ рдкреЗрд╕реНрдЯ рдХрд░реЗрдВред

рдЕрдЧрд▓рд╛ рдХрджрдо рдмрд┐рд▓реНрдбрдорд╛рд╕реНрдЯрд░ рд╕реЗрд╡рд╛ рд╢реБрд░реВ рдХрд░рдирд╛ рд╣реИ
 sudo buildbot start /home/habr/master 

рдлрд┐рд░ рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ -рдП рд╕реЗрд╡рд╛ рд╢реБрд░реВ рдХрд░реЗрдВ
 buildbot-worker start /home/habr/worker 

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

рдиреАрдЪреЗ рдореИрдВ рдЙрдкрд░реЛрдХреНрдд Master.cfg рдХреА рдХреБрдЫ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реВрдВрдЧрд╛ ред


6.1 рдЕрдкрдиреЗ рдорд╛рд╕реНрдЯрд░ рдХреЗ рд░рд╛рд╕реНрддреЗ рдкрд░


рдЕрдкрдиреЗ Master.cfg рдХреЛ рд▓рд┐рдЦрддреЗ рд╕рдордп , рдмрд╣реБрдд рд╕рд╛рд░реА рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдХреА рдЬрд╛рдПрдВрдЧреА, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рд▓реЙрдЧ рдлрд╛рдЗрд▓ рдХреЛ рдкрдврд╝рдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣ рджреЛрдиреЛрдВ BuildMaster -ec рдХреЗ рдкреВрд░реНрдг рдкрде /home/habr/master/twistd.log рдФрд░ рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ -a рдХреЗ рд╕рд╛рде рдкреВрд░реНрдг рдкрде /home/habr/worker/twistd.log рдкрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИ ред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рддреНрд░реБрдЯрд┐ рдХреЛ рдкрдврд╝рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдареАрдХ рдХрд░рддреЗ рд╣реИрдВ, рдЖрдкрдХреЛ BuildMaster -a рд╕реЗрд╡рд╛ рдХреЛ рдкреБрдирд░рд╛рд░рдВрдн рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣ рдХреИрд╕реЗ рдХрд░рдирд╛ рд╣реИ:
 sudo buildbot stop /home/habr/master sudo buildbot upgrade-master /home/habr/master sudo buildbot start /home/habr/master 

6.2 svn рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВ


 svn_poller = changes.SVNPoller(repourl="https://svn.host/svn/yourProject/trunk", svnuser="user", svnpasswd="password", pollinterval=60, split_file=util.svn.split_file_alwaystrunk ) c['change_source'] = svn_poller hourlyscheduler = schedulers.SingleBranchScheduler( name="your-project-schedulers", change_filter=util.ChangeFilter(branch=None), builderNames=["yourProject"], properties = {'owner': 'admin'} ) c['schedulers'] = [hourlyscheduler] checkout = steps.SVN(repourl='https://svn.host/svn/yourProject/trunk', mode='full', method='fresh', username="user", password="password", haltOnFailure=True) 

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, svn_poller рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ ред рдпрд╣ рд╡рд╣реА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИ рдЬреЛ рдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ рдорд┐рдирдЯ рдореЗрдВ рдПрдХ рдмрд╛рд░ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХрд╛ рдЪреБрдирд╛рд╡ рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, svn_poller рдХреЗрд╡рд▓ рдЯреНрд░рдВрдХ рд╢рд╛рдЦрд╛ рддрдХ рдкрд╣реБрдВрдЪрддрд╛ рд╣реИред рд░рд╣рд╕реНрдпрдордп рдкреИрд░рд╛рдореАрдЯрд░ рд╕реНрдкреНрд▓рд┐рдЯ_рдлрд╛рдЗрд▓ = рдпреВрдЬрд╝ред рдПрд╕.рд╡рди.рдкреНрд▓реЗрдЯ_рдлрд╛рдЗрд▓_рд╡реИрд▓рд╕реНрдЯреНрд░рдВрдХ рдирд┐рдпрдо рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ: рд╢рд╛рдЦрд╛рдУрдВ рдореЗрдВ svn рдлрд╝реЛрд▓реНрдбрд░реЛрдВ рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдХреИрд╕реЗ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПред рд╡рд╣ рдЙрдиреНрд╣реЗрдВ рд╕рд╛рдкреЗрдХреНрд╖ рддрд░реАрдХреЗ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдмрджрд▓реЗ рдореЗрдВ, рд╡рд┐рднрд╛рдЬрди_рдлрд╛рдЗрд▓_рд╡реИрд▓рд╕реНрдЯреНрд░рдВрдХ рдпрд╣ рдХрд╣рдХрд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕рд░рд▓ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреЗрд╡рд▓ рдЯреНрд░рдВрдХ рднрдВрдбрд╛рд░ рдореЗрдВ рд╣реИред

рд╢реЗрдбреНрдпреВрд▓рд░ рдореЗрдВ , ChangeFilter рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ , рдЬреЛ рдХрд┐рд╕реА рдХреЛ рднреА рдирд╣реАрдВ рджреЗрдЦрддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рд╕рд╛рде рдЯреНрд░рдВрдХ рд╢рд╛рдЦрд╛ рдХреЛ рд╕рдВрдмрджреНрдз рдХрд░рддрд╛ рд╣реИ, рд╡рд┐рднрд╛рдЬрд┐рдд_рдлрд╛рдЗрд▓_рд╡реИрд▓рд╕реНрдЯреНрд░рдВрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдПрд╕реЛрд╕рд┐рдПрд╢рди рдХреЗ рдЕрдиреБрд╕рд╛рд░ред рдЯреНрд░рдВрдХ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХрд╛ рдЬрд╡рд╛рдм рджреЗрддреЗ рд╣реБрдП, рдпрд╣ рдЖрдкрдХреЗ Project рдирд╛рдо рдХреЗ рдмрд┐рд▓реНрдбрд░ рдХреЛ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИред

рдпрд╣рд╛рдВ рд╕рдВрдкрддреНрддрд┐рдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдХреЛ рд╡рд┐рдзрд╛рдирд╕рднрд╛ рд╕реЗ рдиреНрдпреВрдЬрд╝рд▓реЗрдЯрд░ рдорд┐рд▓реЗ рдФрд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдорд╛рд▓рд┐рдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдкрд░рд┐рдгрд╛рдо рдорд┐рд▓реЗред

рдмрд┐рд▓реНрдб -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="projectHost@your.domain", sendToInterestedUsers=True, lookup="your.domain", relayhost="smtp.your.domain", smtpPort=1025, mode="warnings", extraRecipients=['user@your.domain'], messageFormatter=reporters.MessageFormatter( template=template_html, template_type='html', wantProperties=True, wantSteps=True) ) c['services'] = [sendMessageToAll] 

рдпрд╣ рдХрдИ рддрд░реАрдХреЛрдВ рд╕реЗ рд╕рдВрджреЗрд╢ рднреЗрдЬ рд╕рдХрддрд╛ рд╣реИ ред

MailNotifier рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдореЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред

template_html рд╕рдорд╛рдЪрд╛рд░ рдкрддреНрд░ рдХреЗ рд▓рд┐рдП рдкрд╛рда рдЯреЗрдореНрдкрд▓реЗрдЯ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИред рдорд╛рд░реНрдХрдЕрдк рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, html рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдЗрд╕реЗ jinja2 рдЗрдВрдЬрди рджреНрд╡рд╛рд░рд╛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ ( django рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ)ред BuildBot рдореЗрдВ рдЪрд░ рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдорд╛рдиреЛрдВ рдХреЛ рд╕рдВрджреЗрд╢ рдкрд╛рда рдмрдирд╛рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпреЗ рдЪрд░ {{рдбрдмрд▓ рдШреБрдВрдШрд░рд╛рд▓реЗ рдмреНрд░реЗрд╕}} рдореЗрдВ рдЕрдВрдХрд┐рдд рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕рд╛рд░рд╛рдВрд╢ рдкреВрд░реНрдг рдХрд┐рдП рдЧрдП рд╕рдВрдЪрд╛рд▓рди, рдпрд╛рдиреА рд╕рдлрд▓рддрд╛ рдпрд╛ рд╡рд┐рдлрд▓рддрд╛ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред рдФрд░ рдкрд░рд┐рдпреЛрдЬрдирд╛рдПрдВ рдЖрдкрдХреЗ Project рдХреЛ рдЖрдЙрдЯрдкреБрдЯ рджреЗрдВрдЧреА ред рдЗрд╕рд▓рд┐рдП, jinja2 , BuildBot рд╡реИрд░рд┐рдПрдмрд▓ рдФрд░ рдЕрдЬрдЧрд░ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдлреЙрд░реНрдореЗрдЯрд░реНрд╕ рдореЗрдВ рдХрдВрдЯреНрд░реЛрд▓ рдХрдорд╛рдВрдбреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдк рдПрдХ рдмрд╣реБрдд рд╣реА рд╕реВрдЪрдирд╛рддреНрдордХ рд╕рдВрджреЗрд╢ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред

MailNotifier рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рддрд░реНрдХ рджрд┐рдП рдЧрдП рд╣реИрдВред

fromaddr - рд╡рд╣ рдкрддрд╛ рдЬрд┐рд╕рд╕реЗ рд╕рднреА рд▓реЛрдЧ рд╕рдорд╛рдЪрд╛рд░ рдкрддреНрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗред

sendToInterestedUsers = True рдЙрд╕ рд╕реНрд╡рд╛рдореА рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдПрдХ рд╕рдВрджреЗрд╢ рднреЗрдЬрддрд╛ рд╣реИ рдЬрд┐рд╕рдиреЗ рдХрдорд┐рдЯ рдХрд┐рдпрд╛ рд╣реИ ред

рд▓реБрдХрдЕрдк - рд╕рдорд╛рдЪрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рдирд╛рдо рдореЗрдВ рдкреНрд░рддреНрдпрдп рдЬреЛрдбрд╝рд╛ рдЬрд╛рдирд╛ред рддреЛ рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ admin@your.domain рдкрд░ рдиреНрдпреВрдЬрд╝рд▓реЗрдЯрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдЧрд╛ред

relayhost рд╣реЛрд╕реНрдЯ рдирд╛рдо рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕ рдкрд░ smtp рд╕рд░реНрд╡рд░ рдЦреБрд▓рд╛ рд╣реИ, рдФрд░ smptPort рдЙрд╕ рдкреЛрд░реНрдЯ рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕ рдкрд░ smtp рд╕рд░реНрд╡рд░ рд╕реБрдирддрд╛ рд╣реИред

рдореЛрдб = "рдЪреЗрддрд╛рд╡рдиреА" рдХрд╣рддреА рд╣реИ рдХрд┐ рдореЗрд▓рд┐рдВрдЧ рддрднреА рдХреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдП рдЬрдм рдХрдо рд╕реЗ рдХрдо рдПрдХ рдмрд┐рд▓реНрдб рд╕реНрдЯреЗрдк рдРрд╕рд╛ рд╣реЛ рдЬреЛ рд╡рд┐рдлрд▓рддрд╛ рдпрд╛ рдЪреЗрддрд╛рд╡рдиреА рдХреА рд╕реНрдерд┐рддрд┐ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдпрд╛ рд╣реЛред рд╕рдлрд▓рддрд╛ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдореЗрд▓рд┐рдВрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

extraRecipients рдореЗрдВ рдЙрди рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд╣реИ, рдЬрд┐рдирдХреЗ рд╕рд╛рде рдореЗрд▓рд┐рдВрдЧ рдХреЛ рд╕реНрд╡рд╛рдореА рдФрд░ рдкреНрд░рддрд┐рдмрджреНрдз рдмрдирд╛рдиреЗ рд╡рд╛рд▓реЗ рд╡реНрдпрдХреНрддрд┐ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП ред

messageFormatter рдПрдХ рдРрд╕реА рд╡рд╕реНрддреБ рд╣реИ рдЬреЛ рд╕рдВрджреЗрд╢ рдХреЗ рдкреНрд░рд╛рд░реВрдк, рдЙрд╕рдХреЗ рдЯреЗрдореНрдкрд▓реЗрдЯ рдФрд░ jinja2 рд╕реЗ рдЙрдкрд▓рдмреНрдз рдЪрд░реЛрдВ рдХреЗ рд╕реЗрдЯ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреА рд╣реИ ред рдЪрд╛рд╣рдиреЗ рд╡рд╛рд▓реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдкреИрд░рд╛рдореАрдЯрд░ = рдпрд╣ рд╕рдЪ рд╣реИ рдФрд░ рдЪрд╛рд╣рддреЗ рд╣реИрдВ = рдЙрдкрд▓рдмреНрдз рдЙрдкрд▓рдмреНрдз рдЪрд░ рдХреЗ рдЗрд╕ рд╕реЗрдЯ рдХреЛ рд╕рд╣реА рдХрд░реЗрдВред

['рд╕реЗрд╡рд╛рдУрдВ'] рдХреЗ рд╕рд╛рде = [sendMessageToAll] рд╕реЗрд╡рд╛рдУрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рдирдХреЗ рдмреАрдЪ рд╣рдорд╛рд░рд╛ рд╣реЛрдЧрд╛рд░рд┐рдкреЛрд░реНрдЯрд░ ред

рд╣рдордиреЗ рдХрд░ рджрд┐рдЦрд╛рдпрд╛! рдореЗрд░реА рдмрдзрд╛рдИ



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

рдФрд░ рдПрдХ рдмрд╛рддредрдореИрдВ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХрд┐ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рд╕рдореБрджрд╛рдп рдмрд┐рд▓реНрдбрдмреЙрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡реНрдпрд╛рдкрдХ, рдореИрдиреБрдЕрд▓ рдЕрдиреБрд╡рд╛рдж, рдФрд░ рдЕрдзрд┐рдХ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк рд╕рднреА рдХрд╛ рдзрдиреНрдпрд╡рд╛рджред рд╕реМрднрд╛рдЧреНрдп рд╣реИред

Source: https://habr.com/ru/post/hi460501/


All Articles