
рдЪрдХреНрд░ рдХрд╛ рдПрдХ рдкреНрд░рд╛рдердорд┐рдХ рдЙрджрд╛рд╣рд░рдг
.NET рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдкрд░ "рд╕рд╣реА" рд╡рд┐рдХрд╛рд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЬреЗрдирдХрд┐рдВрд╕ CI рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдЖрджрд┐рдо ASP.NET (рдореЛрдиреЛ) рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛
рд╡рд┐рдХрд╛рд╕ рд╣реИ ред
рдкреНрд░рд╕реНрддреБрдд рдЙрджрд╛рд╣рд░рдг рд╡реНрдпрд╛рдкрдХ рджрд░реНрд╢рдХреЛрдВ рдХреЗ рд▓рд┐рдП рд░реБрдЪрд┐ рдХрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдЗрд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ рдХрд┐рд╕реА рдЕрдиреНрдп рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдХреЗ рд▓рд┐рдП рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐
рдпрд╣ рд▓реЗрдЦ рдХрднреА рдирд╣реАрдВ рд▓рд┐рдЦрд╛ рд╣реЛрддрд╛ рдЕрдЧрд░ рдпрд╣ рдореВрд▓ рд▓реЗрдЦ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд╣реЛрддрд╛, рдЬреЛ рдПрдХ рд╕рдордп рдореЗрдВ рд╡рд┐рдХрд╛рд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреА рдореЗрд░реА рд╕рдордЭ рдХреЛ рдЖрдХрд╛рд░ рджреЗрдиреЗ рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рднреВрдорд┐рдХрд╛ рдирд┐рднрд╛рддрд╛ рдерд╛ред рдФрд░, рдЬреИрд╕рд╛ рдХрд┐ рд╡реЗ рдХрд╣рддреЗ рд╣реИрдВ, "рдореИрдВ рдЗрд╕ рдЕрд╡рд╕рд░ рдХреЛ рд▓реЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред" рдореИрдВ рдЕрдкрдиреЗ рдЕрджреНрднреБрдд рд▓реЗрдЦ рдХреЗ рд▓рд┐рдП рдпреВрдЬреАрди рдХреЛ рдзрдиреНрдпрд╡рд╛рдж рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдЬреЛ рд╢реБрд░реБрдЖрддреА рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рд╕рд┐рд░реНрдл рдПрдХ рд╢рд╛рдирджрд╛рд░ рд╢реБрд░реБрдЖрдд рд╣реИ! рдмрд╣реБрдд рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рдж!
рдпрд╣ рд▓реЗрдЦ, рджреНрд╡рд╛рд░рд╛ рдФрд░ рдмрдбрд╝реЗ, рдореМрд▓рд┐рдХ рд░реВрдк рд╕реЗ рдХреБрдЫ рдирдпрд╛ рдирд╣реАрдВ рд╣реИред рд╕рдорд╛рди C # рдкреНрд░реЛрдЬреЗрдХреНрдЯ, NUnit рдкрд░ рд╕рдорд╛рди рдкрд░реАрдХреНрд╖рдг рдФрд░ NAnt рдкрд░ рд╕рдорд╛рди рд╕реНрд╡рдЪрд╛рд▓рдиред рд▓реЗрдХрд┐рди рдмрд╛рд░реАрдХрд┐рдпрд╛рдВ рд╣реИрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ: рдЬреЗрдирдХрд┐рдВрд╕ CI рдПрдХ CI рд╕рд░реНрд╡рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рджреВрд╕рд░реА рдмрд╛рдд, рдЗрд╕рдХреА рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдХреЗ рджреМрд░рд╛рди рд╡рд┐рднрд┐рдиреНрди рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдФрд░ рдкреНрд░рд╕реНрддреБрддрд┐ рдкрд░ рдХрд╛рдлреА рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЖрд▓реЗрдЦ рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рдХрд╛рд░реНрдпрд╢реАрд▓ рд╡рд╛рддрд╛рд╡рд░рдг рдХреА рд╕реНрдерд╛рдкрдирд╛ рдФрд░ рдПрдХ рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдмрдирд╛рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реЗрдЧрд╛ рдЬреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╕реНрд░реЛрдд рдХреЛрдб рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХреЛ рдЯреНрд░реИрдХ рдХрд░реЗрдЧрд╛, рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдЧрд╛, рдЗрдХрд╛рдИ рдФрд░ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкрд░реАрдХреНрд╖рдг рдХрд░реЗрдЧрд╛, рдФрд░ рдореИрдЯреНрд░рд┐рдХреНрд╕ рднреА рдПрдХрддреНрд░ рдХрд░реЗрдЧрд╛, рдЬреИрд╕реЗ рдХреЛрдб рдХреА рд▓рд╛рдЗрдиреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛, рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐, рдЙрдкрд╕реНрдерд┐рддрд┐ рддрдХрдиреАрдХреА рдЛрдг рдХреЗ рд╕реНрд░реЛрдд рдХреЛрдб рдореЗрдВ (TODO, FIXME, рдЖрджрд┐) рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рдореВрд▓ NAnt рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╣реЛрдЧрд╛, рдЬреЛ рд╕рд╛рдордЧреНрд░реА рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛рдПрдЧрд╛ред рдХрд┐рд╕реА рднреА рд╕реНрддрд░ рдкрд░, рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛рдо рдХрд░ рд░рд╣реА рд╣реИ рдФрд░ рдкреВрд░реА рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ, рдЬреЛ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛ рд╕рдХрддреА рд╣реИ рдЬреЛ рдПрдХ рд╕рдордп рдореЗрдВ рдкреВрд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдмрдирд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реИрдВ рдпрд╛ рдкреНрд░рд╕реНрддреБрдд рд╕рднреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ (рдФрд░, рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ, рдпрд╣ рдХреБрдЫ рдореБрджреНрджреЛрдВ рдореЗрдВ рдмреЗрдорд╛рдиреА рд╣реИ)ред
рдХрд╛рд░реНрдпрд╕реНрдерд╛рди
рдХрд╛рд░реНрдпрдХреНрд╖реЗрддреНрд░ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдирд┐рдореНрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА:
рдУрдПрд╕ | GNU / Linux ( рдУрдкрдирдПрд╕рдпреВрдПрд╕рдИ 12.1, рдПрд▓рдПрдХреНрд╕рдбреАрдИ ) | рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдЬрд┐рд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдирд┐рд░рдВрддрд░ рдПрдХреАрдХрд░рдг рд╕рд░реНрд╡рд░ рддреИрдирд╛рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред |
рд╕реАрдЖрдИрдПрд╕ | рдЬреЗрдирдХрд┐рдВрд╕ CI 1.450 | рдирд┐рд░рдВрддрд░ рдПрдХреАрдХрд░рдг рд╕рд░реНрд╡рд░ред |
VCS | рддреЛрдбрд╝рдлреЛрдбрд╝ 1.6.17 | рдХреЗрдВрджреНрд░реАрдХреГрдд рд╕рдВрд╕реНрдХрд░рдг рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рдгрд╛рд▓реА (рддреЛрдбрд╝рдлреЛрдбрд╝ рдХреЗ рдмрдЬрд╛рдп, рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рд╡реАрд╕реАрдПрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ) |
CLR | рдореЛрдиреЛ 2.6.10 | рд╡рд╣ рдордВрдЪ рдЬрд┐рд╕рдХреЗ рдиреАрдЪреЗ рд╡рд┐рдХрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред |
рдкрд░реАрдХреНрд╖рдг | NUnit 2.4.8 | рдкрд░реАрдХреНрд╖рдг рдмрдирд╛рдиреЗ рдФрд░ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдХрд░рдг (рдЗрдХрд╛рдИ, рдЧреИрд░-рдЗрдХрд╛рдИ - рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕ рдмрд╛рдд рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдкрд░реАрдХреНрд╖рдг рдХреМрди рдмрдирд╛рдПрдЧрд╛)ред |
рд╕реЗрд▓реЗрдирд┐рдпрдо рдЖрд░рд╕реА 2.18.0 | рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдХрд░рдгред |
рд╕реНрдереИрддрд┐рдХ рдХреЛрдб рд╡рд┐рд╢реНрд▓реЗрд╖рдг | рдЬреЗрдВрдбрд░рдореЗ 2.10.0.0 | рд╕реНрдереИрддрд┐рдХ рдХреЛрдб рд╡рд┐рд╢реНрд▓реЗрд╖рдХред |
2005-05-30 рдХреЛ рдХреНрд▓реЛрдирд┐рдирд▓реАрдЬрд╝рд░ | рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдХреЛрдб рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдпреЛрдЧрд┐рддрд╛ред |
рд╕реНрдЯрд╛рдЗрд▓рдХреЙрдкреНрдбрдо 0.2.1 | рд╕реНрдереИрддрд┐рдХ рдХреЛрдб рд╡рд┐рд╢реНрд▓реЗрд╖рдХред |
рдЕрдиреНрдп рдЙрдкрдХрд░рдг | рдиреЙрдЯ 0.90 | рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧрд┐рддрд╛ред |
рдлрд╝рд╛рдпрд░рдлрд╝реЙрдХреНрд╕ 7.0.1 | рд╡реЗрдм рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкрд░реАрдХреНрд╖рдг рдмрдирд╛рдП рдЬрд╛рдПрдВрдЧреЗ рдФрд░ рдЪрд▓рд╛рдП рдЬрд╛рдПрдВрдЧреЗ (рдЕрдиреНрдп рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд░реАрдХреНрд╖рдг рднреА рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ) |
рд╕реЗрд▓реЗрдирд┐рдпрдо рдЖрдИрдбреАрдИ 1.6.0 | рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкрд░реАрдХреНрд╖рдг рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдИрдбреАрдИред |
рдХрд╛рд░реНрдп рдкрд░рд┐рд╡реЗрд╢ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдирд┐рдореНрди рдЪрд░рдгреЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░рдирд╛ рд╣реЛрдЧрд╛:
1. рдбреАрд╡реАрдбреА рдЫрд╡рд┐
рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ рдФрд░ рдУрдПрд╕ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ (рдбреЗрд╕реНрдХрдЯреЙрдк рд╡рд╛рддрд╛рд╡рд░рдг рдЪреБрдирддреЗ рд╕рдордп, рдПрд▓рдПрдХреНрд╕рдбреАрдИ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВ)ред рдХрдбрд╝рд╛рдИ рд╕реЗ рдмреЛрд▓рддреЗ рд╣реБрдП, рдПрдХ рдФрд░ рдбреЗрд╕реНрдХрдЯреЙрдк рдкрд░реНрдпрд╛рд╡рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╛ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рд╕реЗрдЯрдЕрдк рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕рд░рд▓ рдФрд░ рдЕрдзрд┐рдХ рдирд╣реАрдВ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП LXDE рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред
2. рд░рд┐рдкреЛрдЬрд┐рдЯрд░реА рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ:
sudo zypper ar http://download.opensuse.org/repositories/Mono/openSUSE_11.4/ Mono sudo zypper ar http://pkg.jenkins-ci.org/opensuse/ Jenkins
3. рдЖрд╡рд╢реНрдпрдХ рдкреИрдХреЗрдЬ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ:
sudo zypper in jenkins mono-complete mono-nunit mono-tools nant subversion-server apache2 http://www.dwheeler.com/sloccount/sloccount-2.26-1.i386.rpm
4. рдЖрд╡рд╢реНрдпрдХ рдЙрдкрдпреЛрдЧрд┐рддрд╛рдУрдВ рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ рдФрд░ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░реЗрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЖрд░рдкреАрдПрдо рдкреИрдХреЗрдЬ (рд╕реНрдЯрд╛рдЗрд▓рдХреЙрдкреНрдбрдо рдФрд░ рдХреНрд▓реЛрдирдСрдирд▓рд┐рдпрд░) рдХреЗ рд░реВрдк рдореЗрдВ рдЖрдкреВрд░реНрддрд┐ рдирд╣реАрдВ рдХреА рдЧрдИ рд╣реИред рдХрдИ рдмрд╛рд░реАрдХрд┐рдпрд╛рдВ рд╣реИрдВред
рдкрд╣рд▓рд╛: рдмреЙрдХреНрд╕ рдХреЗ рдмрд╛рд╣рд░ рд▓рд┐рдирдХреНрд╕ рдХреЗ рддрд╣рдд
рдмрд╛рдпрдиреЗрд░рд┐рдЬрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИред рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдПрдХ рд╕рдВрдкреВрд░реНрдг рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди ReportBuilder.cs рдлрд╝рд╛рдЗрд▓ рдХреА рд▓рд╛рдЗрди 460 рдореЗрдВ рд╣рд╛рд░реНрдб-рд╕реЗрдЯ рдкрде рд╡рд┐рднрд╛рдЬрдХ рдХреЗ рдХрд╛рд░рдг, рд░рд┐рдкреЛрд░реНрдЯ рдлрд╝рд╛рдЗрд▓ рд╡рд╣ рдЬрдЧрд╣ рдирд╣реАрдВ рд╣реИ рдЬрд╣рд╛рдБ рдпрд╣ рдЕрдкреЗрдХреНрд╖рд┐рдд рд╣реИ:
private static string GetViolationsFile(string outputXmlFile) { var offp = Path.GetFullPath(outputXmlFile); var f = string.Format( CultureInfo.CurrentCulture, "{0}\\{1}.violations.xml",
рд╕рд╣реА рдХрд┐рдП рдЧрдП рд╕рдВрд╕реНрдХрд░рдг, рд╕рд╛рде рд╣реА рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдХреЛ
рдпрд╣рд╛рдВ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛
рд╣реИ ред
рджреВрд╕рд░реА рдмрд╛рдд: DRY рдкреНрд▓рдЧ-рдЗрди CloneAnalyze рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХреА рд░рд┐рдкреЛрд░реНрдЯреЛрдВ рдХреЛ рдирд╣реАрдВ рдкрд╣рдЪрд╛рдирддрд╛ рд╣реИ рдФрд░ рдЗрд╕рд▓рд┐рдП рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ CloneAnalyze рд░рд┐рдкреЛрд░реНрдЯ рдХреЛ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рдЬреЗрдирдХреАрдВрд╕ рдореЗрдВ рд╕реЗ рдПрдХ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдП (рдореИрдВрдиреЗ
CPD рдЪреБрдирд╛)ред рд░рд┐рдкреЛрд░реНрдЯ рдХреЗ рдЙрджрд╛рд╣рд░рдг, рд╕рд╛рде рд╣реА рд╕реНрд░реЛрдд рдХреЛрдб рдХреЗ рд╕рд╛рде рдПрдХ рд╡реНрд╣реАрдкреНрдб рдХрдирд╡рд░реНрдЯрд░ рдХреЛ
рдпрд╣рд╛рдВ рд▓рд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛
рд╣реИ ред
рдЕрддрд┐рд░рд┐рдХреНрдд рдЙрдкрдпреЛрдЧрд┐рддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдмрдирд╛рдПрдБ:
sudo mkdir -p /var/lib/jenkins/tools/{StyleCop,CloneAnalyzer,SeleniumRC}
5. рдЬреЗрдирдХрд┐рдВрд╕ (рдЬреЗрдирдХрд┐рдВрд╕ -> рдореИрдиреЗрдЬ рдЬреЗрдирдХрд┐рдВрд╕ -> рдореИрдиреЗрдЬ рдкреНрд▓рдЧрд┐рди -> рдЙрдкрд▓рдмреНрдз) рдХреЗ рд▓рд┐рдП рдкреНрд▓рдЧ-рдЗрди рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ:
рдЬрд░реВрд░реА |
рд╡рд┐рдирд╛рд╢ | рдЖрдк svn рднрдВрдбрд╛рд░ (рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╕реНрдерд╛рдкрд┐рдд) рд╕реЗ рд╕реНрд░реЛрдд рдХреЛрдб рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ |
NUnit | рдЖрдкрдХреЛ NUnit рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдкрд░ рд░рд┐рдкреЛрд░реНрдЯ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред |
NAnt | рдЖрдкрдХреЛ рдЬреЗрдирдХрд┐рдиреНрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП NAnt рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рд╡рд┐рдзрд╛рдирд╕рднрд╛ рд▓рдХреНрд╖реНрдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред |
рд╕реНрдереИрддрд┐рдХ рдХреЛрдб рд╡рд┐рд╢реНрд▓реЗрд╖рдг | DRY рдкреНрд▓рдЧрдЗрди рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИред |
рдЯрд╛рд╕реНрдХ рд╕реНрдХреИрдирд░ | рдЖрдкрдХреЛ рдХреЛрдб (TODO рдФрд░ рдЕрдиреНрдп) рдореЗрдВ рдкрд╛рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдЯреИрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд░рд┐рдкреЛрд░реНрдЯ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред |
SLOCCount | рдЖрдкрдХреЛ рдЙрдкрдпреЛрдЧрд┐рддрд╛ SLOCCount (рдорд╛рдореВрд▓реА рдХреЛрдб рдореИрдЯреНрд░рд┐рдХреНрд╕ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ) рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдкрд░ рд░рд┐рдкреЛрд░реНрдЯ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред |
DocLinks | рдЖрдкрдХреЛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рдореБрдЦреНрдп рдкреГрд╖реНрда рдкрд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдкреНрд░рд▓реЗрдЦрди рдХреЗ рд▓рд┐рдП рд▓рд┐рдВрдХ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред |
рдЙрд▓реНрд▓рдВрдШрди | рдЖрдкрдХреЛ рд╡рд┐рднрд┐рдиреНрди рдЙрдкрдпреЛрдЧрд┐рддрд╛рдУрдВ рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдкрд░ рд░рд┐рдкреЛрд░реНрдЯ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ Gendarme рдФрд░ StyleCopCmd рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред |
рд╕реВрдЦреА | рдЖрдкрдХреЛ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдХреЛрдб рдкрд░ рд░рд┐рдкреЛрд░реНрдЯ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред |
Seleniumhq | рд╕реЗрд▓реЗрдирд┐рдпрдо рд░рд┐рдкреЛрд░реНрдЯ рдХреЗ рд▓рд┐рдВрдХ рдкреЛрд╕реНрдЯ рдХрд░реЗрдВред |
рдЪреЗрддрд╛рд╡рдиреА | рдЖрдкрдХреЛ рд╕рдВрдХрд▓рдХ рдЪреЗрддрд╛рд╡рдиреА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдХреЗ рд░рд┐рдкреЛрд░реНрдЯ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред |
рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрд╢рдВрд╕рд┐рдд: |
JobConfigHistory | рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХрд╛ рдЗрддрд┐рд╣рд╛рд╕ рд░рдЦрддрд╛ рд╣реИред |
рдмреИрдХрдЕрдк | рдЖрдкрдХреЛ рд╕рд░реНрд╡рд░ рдмреИрдХрдЕрдк рдмрдирд╛рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред |
рд╡реИрдХрд▓реНрдкрд┐рдХ: |
рд╣рд░реА рдЧреЗрдВрджреЗрдВ | рдиреАрд▓реЗ рд░рдВрдЧ рдХреА рдЧреЗрдВрдж рдХреЛ рд╣рд░реЗ рд░рдВрдЧ рд╕реЗ рдмрджрд▓ рджреЗрддрд╛ рд╣реИред |
рдЕрдЧрд▓рд╛ рдмрд┐рд▓реНрдб рдирдВрдмрд░ | рдЖрдкрдХреЛ рдПрдХ рдЕрд╕реЗрдВрдмрд▓реА рд╕рдВрдЦреНрдпрд╛ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред |
рд╕рд╛рдЗрдбрдмрд╛рд░ рд▓рд┐рдВрдХ | рдЖрдкрдХреЛ рд╕рд░реНрд╡рд░ рдХреЗ рдореБрдЦреНрдп рдкреГрд╖реНрда рдФрд░ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рдкрдиреНрдиреЛрдВ рдкрд░ рд▓рд┐рдВрдХ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред |
рдбреЗрдореЛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрд╛ рд╡рд┐рд╡рд░рдг

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

рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рд╕рдорд╛рдзрд╛рди рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ рдЬрд┐рд╕рдореЗрдВ рддреАрди рдкрд░рд┐рдпреЛрдЬрдирд╛рдПрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:
- ExampleCore - рдЬрд┐рд╕рдореЗрдВ рд╕рднреА рдЕрдиреБрдкреНрд░рдпреЛрдЧ рддрд░реНрдХ рдХреЗрдВрджреНрд░рд┐рдд рд╣реИ (рдФрд░ рдпрд╣ рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рд▓рд┐рдП, рджреЛ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдХрдИ)!
- ExampleGUI - рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЗрдВрдЯрд░рдлрд╝реЗрд╕ (рдПрдХ рдПрдХрд▓, рд▓реЗрдХрд┐рди рдЗрд╕рд╕реЗ рднреА рдЕрдзрд┐рдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг, aspx рдкреГрд╖реНрда)ред
- рдЙрджрд╛рд╣рд░рдг-рдкрд░реАрдХреНрд╖рдг рдХреЗ рд╕рд╛рде рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ (NUnit)ред
- ExampleFTest - рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкрд░реАрдХреНрд╖рдг (рд╕реЗрд▓реЗрдирд┐рдпрдо) рдХреЗ рд╕рд╛рде ExampleFTest рдлрд╝реЛрд▓реНрдбрд░, рдЬреЛ рд╕рдорд╛рдзрд╛рди рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИ, рд░реВрдЯ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рднреА рд╕реНрдерд┐рдд рд╣реИред
рдЕрд╕реЗрдВрдмрд▓реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдмрдирд╛рдПрдВ рдФрд░ рдЯреВрд▓ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЬреЗрдирдХрд┐рдВрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдмрдирд╛рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдпрд╣ рдЙрдкрд▓рдмреНрдз рд╡реЗрдм рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЖрд╡рд╢реНрдпрдХ рд╣реИ: http: // localhost: 8080 (рдпрджрд┐ рд╕реНрдерд╛рдиреАрдп рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ рдЬреЗрдирдХрд┐рдВрд╕ рд╕реНрдерд╛рдкрд┐рдд рд╣реИ), рддреЛ рдирдИ рдиреМрдХрд░реА рд▓рд┐рдВрдХ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ, рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдкреНрд░рдХрд╛рд░ рдЪреБрдиреЗрдВ рдПрдХ рдирд┐: рд╢реБрд▓реНрдХ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░реЗрдВ- рд╢реИрд▓реА рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдкрд░рд┐рдпреЛрдЬрдирд╛, рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рдирд╛рдо рджрд░реНрдЬ рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ рдмрдирд╛рдПрдВред рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛ рд╣реИред
рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рдореВрд▓ рдПрдХ NAnt рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╣реЛрдЧрд╛, рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдмрд┐рд▓реНрдб рд╕реЗрдХреНрд╢рди рдореЗрдВ рдПрдХ рд▓рдХреНрд╖реНрдп рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдЧрд╛:

рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕рдВрдЧрдарди рдХреЗ рдХрдИ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рдирдХреЗ рдлрд╛рдпрджреЗ рдФрд░ рдиреБрдХрд╕рд╛рди рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╕рднреА рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдПрдХ NAnt рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдЬреЗрдирдХрд┐рдиреНрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдПрдХ рдХрдорд╛рдВрдб рджреНрд╡рд╛рд░рд╛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ рдХрд┐ рдЕрд╕реЗрдВрдмрд▓реА рдЬреЗрдирдХрд┐рдВрд╕ рдХреЗ рдмрд┐рдирд╛ рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ, рдмрд╕ NAnt рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдЪрд▓рд╛рдПрдВред рд▓реЗрдХрд┐рди рдЕрд╕реЗрдВрдмрд▓реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рд╣рдореЗрд╢рд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ (рдкрд╣рд▓реЗ рдЖрдкрдХреЛ NAnt рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдлрд┐рд░ рдХрдорд┐рдЯ рдХрд░реЗрдВ, рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рд╣реА рдмрд┐рд▓реНрдб рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЕрдкрдбреЗрдЯ рдХреА рдЬрд╛рдПрдЧреА)ред рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЖрдк рдЬреЗрдирдХрд┐рдВрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдмреИрд╢ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рд▓рдХреНрд╖реНрдп рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЙрдирдореЗрдВ рд╕рднреА рд╡рд┐рдзрд╛рдирд╕рднрд╛ рддрд░реНрдХ рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдирд┐рд░реНрдорд╛рдг рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдирд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ, рд▓реЗрдХрд┐рди рдЬреЗрдирдХреАрдВрд╕ рдХреЗ рдмрд╛рд╣рд░ рдирд┐рд░реНрдорд╛рдг рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред
рдЖрдЗрдП, рдПрдХ Nant-script рдмрдирд╛рдирд╛ рд╢реБрд░реВ рдХрд░реЗрдВ, рдЬрд┐рд╕рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд░реВрдк рд╣реИрдВ:
<?xml version="1.0"?> <project name="Example" default="cis" basedir="."> <target name="cis" description="Execute all targets in CIS."> <call target="clean" /> <call target="build" /> <call target="documentation" /> <call target="utest" /> <call target="gendarme" /> <call target="stylecop" /> <call target="sloccount" /> <call target="cloneanalyze" /> <call target="ftest" /> </target> </project>
рдпрд╛рдиреА рдкрд╣рд▓реЗ рд╕рдВрдкрддреНрддрд┐ (рд╕рдВрдкрддреНрддрд┐) рдШреЛрд╖рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИ, рдлрд┐рд░ рд▓рдХреНрд╖реНрдп (рд▓рдХреНрд╖реНрдп) рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЕрдВрдд рдореЗрдВ рдореБрдЦреНрдп рд▓рдХреНрд╖реНрдп рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЗрд╕рдХрд╛ рдирд╛рдо рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреА рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕рдВрдкрддреНрддрд┐ рдореЗрдВ рджрд░реНрд╢рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ), рдЬреЛ рдмрджрд▓реЗ рдореЗрдВ рдкрд╣рд▓реЗ рдШреЛрд╖рд┐рдд рд▓реЛрдЧреЛрдВ рдХреЛ рдмреБрд▓рд╛рддрд╛ рд╣реИред рд╡рд░реНрдгрд┐рдд рд╡рд┐рдзрд┐ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рдирд╣реАрдВ рд╣реИ, рджреВрд╕рд░реЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд▓рдХреНрд╖реНрдп рдмрдирд╛рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдЖрдк рдмрд╕ рдХреБрдЫ рд▓рдХреНрд╖реНрдпреЛрдВ рдХреА рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рджреВрд╕рд░реЛрдВ рдкрд░ рджрд░реНрдЬ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рд▓рдХреНрд╖реНрдпреЛрдВ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛ред
рдЕрдЧрд▓рд╛, рд╕реАрдЖрдИрдПрд╕ рд▓рдХреНрд╖реНрдп рдХреЗ рд╕рднреА рд▓рдХреНрд╖реНрдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдХрд┐рд╕реА рднреА рд╕реНрддрд░ рдкрд░, рдПрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдореБрдЦреНрдп рд▓рдХреНрд╖реНрдп (рд╕реАрдЖрдИрдПрд╕) рдореЗрдВ рдЕрд╡рд╛рд╕реНрддрд╡рд┐рдХ рд▓рдХреНрд╖реНрдпреЛрдВ рдФрд░ рдЕрдкреНрд░рдпреБрдХреНрдд рдЧреБрдгреЛрдВ рдкрд░ рдЯрд┐рдкреНрдкрдгреА рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред
рд╕рд╛рджрдЧреА рдХреЗ рд▓рд┐рдП, рд╣рдо рдЙрди рдЧреБрдгреЛрдВ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░реЗрдВрдЧреЗ рдЬреЛ рд╣рдорд╛рд░реЗ рдХреЛрдб рдХреЛ рдФрд░ рдХрдо рдХрд░ рджреЗрдВрдЧреЗред
рдЬреЗрдирдХреАрдВрд╕ рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░:
<property name="work.d" value="${environment::get-variable('WORKSPACE')}" />
рд╡рд╣ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдЬрд╣рд╛рдБ рдЙрдкрдХрд░рдг рдПрдХрддреНрд░рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ:
<property name="tools.d" value="/var/lib/jenkins/tools" />
рд╡рд┐рднрд┐рдиреНрди рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рдЙрдкрдирд╛рдо, рдЬрд┐рд╕рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдирд╛рдо рд╕реЗ рд╕реНрдкрд╖реНрдЯ рд╣реИ:
<property name="bin.d" value="${build.conf}/bin"/> <property name="deploy.d" value="/home/vm/public_html" /> <property name="test.res.d" value="test-results" /> <property name="report.d" value="${work.d}/reports" /> <property name="doc.d" value="${work.d}/doc" /> <property name="core.d" value="${work.d}/ExampleCore" /> <property name="gui.d" value="${work.d}/ExampleGUI" /> <property name="utest.d" value="${work.d}/ExampleUTest" /> <property name="ftest.d" value="${work.d}/ExampleFTest" />
рдмрд╛рдЗрдирд░реА рдлрд╝рд╛рдЗрд▓ рдФрд░ рд╕реНрдЯрд╛рдЗрд▓рдХреЙрдореНрдкреНрдб рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЗ рдЙрдкрдирд╛рдо:
<property name="style.exe" value="${tools.d}/StyleCop/Net.SF.StyleCopCmd.Console.exe" /> <property name="style.conf" value="${tools.d}/StyleCop/Settings.StyleCop" />
рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓, рдХрдирд╡рд░реНрдЯрд░ рдФрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ CloneAnalyzer рдХрд╛ рдЙрдкрдирд╛рдо:
<property name="clone.jar" value="${tools.d}/CloneAnalyzer/CloneAnalyzer.jar" /> <property name="clone.conf" value="${tools.d}/CloneAnalyzer/comments.conf" /> <property name="clone.conv" value="${tools.d}/CloneAnalyzer/ca2cpd.exe" />
рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЙрдкрдирд╛рдо, рдЖрд╡рд░рдг рд╕реНрдХреНрд░рд┐рдкреНрдЯ, рд╕рд╛рде рд╣реА рдкрд░реАрдХреНрд╖рдг рд╕реВрдЯ рдФрд░ рд╣реЛрд╕реНрдЯ рдирд╛рдо рдХреЗ рд╕рд╛рде рдлрд╝рд╛рдЗрд▓ рдЬрд┐рд╕ рдкрд░ рд╕реЗрд▓реЗрдирд┐рдпрдордЖрд░рд╕реА рдХреЗ рд▓рд┐рдП рдЖрд╡реЗрджрди рддреИрдирд╛рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
<property name="selen.jar" value="${tools.d}/SeleniumRC/selenium-server-standalone-2.18.0.jar" /> <property name="selen.sh" value="${tools.d}/SeleniumRC/selenium.sh" /> <property name="selen.host" value="http://192.168.56.210" /> <property name="selen.suite" value="${ftest.d}/Main.html" />
рдЪрд▓рд┐рдП рд▓рдХреНрд╖реНрдп рдмрдирд╛рдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред
1. рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдкреБрд░рд╛рдиреА рдХрд▓рд╛рдХреГрддрд┐рдпреЛрдВ рд╕реЗ рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреЛ рд╕рд╛рдл рдХрд░рдиреЗ рдФрд░ рдЖрд╡рд╢реНрдпрдХ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдмрдирд╛рдиреЗ рдХрд╛ рд▓рдХреНрд╖реНрдп рдмрдирд╛рдПрдВ:
<target name="clean" description="Remove binary files, recreate report directory."> <echo message="Target starded at: ${datetime::now()}."/> <delete failonerror="false" dir= "${core.d}/${bin.d}"/> <delete failonerror="false" file="${core.d}/ExampleCore.pidb"/> <delete failonerror="false" dir= "${utest.d}/${bin.d}"/> <delete failonerror="false" dir= "${utest.d}/${test.res.d}"/> <delete failonerror="false" file="${utest.d}/ExampleUTest.pidb"/> <delete failonerror="false" dir= "${gui.d}/${bin.d}"/> <delete failonerror="false" dir= "${gui.d}/${test.res.d}"/> <delete failonerror="false" file="${gui.d}/ExampleGUI.pidb"/> <delete failonerror="false" dir= "${report.d}"/> <delete failonerror="false" dir= "${doc.d}"/> <delete failonerror="false" file="${work.d}/stylecop.report"/> <delete failonerror="false" file="${work.d}/stylecop.violations.xml"/> <mkdir dir="${report.d}"/> <mkdir dir="${report.d}/gendarme"/> <mkdir dir="${report.d}/sloccount"/> <mkdir dir="${report.d}/cloneanalyzer"/> <mkdir dir="${report.d}/selenium"/> <mkdir dir="${doc.d}/xml"/> <mkdir dir="${doc.d}/html"/> <echo message="Target completed at: ${datetime::now()}."/> </target>
2. рджреВрд╕рд░рд╛ рдЪрд░рдг рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рд╕реЗ рдЕрдкрдбреЗрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЪреВрдВрдХрд┐ рдпрд╣ рдСрдкрд░реЗрд╢рди рдЬреЗрдирдХрд┐рдВрд╕ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, NAnt рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдпрд╣ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрджрд┐ рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рдерд╛, рддреЛ рдЗрд╕рдХрд╛ рд╕реНрдерд╛рди рдпрд╣рд╛рдВ рд╣реИред
рд╕рдмрд╡рд░реНрд╕рди рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдмрдирд╛рдПрдБ рдФрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ:
su a2enmod dav a2enmod dav_svn a2enmod mod_authz_svn cd /srv/www/htdocs wget http://tortoisesvn.googlecode.com/svn/trunk/contrib/svnindex/menucheckout.ico wget http://tortoisesvn.googlecode.com/svn/trunk/contrib/svnindex/svnindex.css wget http://tortoisesvn.googlecode.com/svn/trunk/contrib/svnindex/svnindex.xsl mkdir -p /srv/svn/{repos,user_access,html} cat > /etc/apache2/conf.d/subversion.conf << EOF <IfModule mod_alias.c> Alias /repos "/srv/svn/html" </IfModule> <Directory /srv/svn/html> Options +Indexes +Multiviews -FollowSymLinks IndexOptions FancyIndexing \ ScanHTMLTitles \ NameWidth=* \ DescriptionWidth=* \ SuppressLastModified \ SuppressSize order allow,deny allow from all </Directory> <Location /repos/Example> DAV svn SVNListParentPath on SVNPath /srv/svn/repos/Example SVNIndexXSLT "/svnindex.xsl" AuthType Basic AuthName "Subversion" AuthUserFile /srv/svn/user_access/passwdfile AuthGroupFile /srv/svn/user_access/groupfile AuthzSVNAccessFile /srv/svn/user_access/accessfile Require valid-user </Location> EOF cd /srv/svn/repos svnadmin create --fs-type fsfs Example mkdir -p /srv/svn/repos/Example/dav chown -R wwwrun:www Example/{dav,db,locks} touch /srv/svn/user_access/passwdfile chown root:www /srv/svn/user_access/passwdfile chmod 640 /srv/svn/user_access/passwdfile touch /srv/svn/user_access/groupfile cat > /srv/svn/user_access/groupfile << EOF Example_commiters: Admin User Example_readers: Admin User CIS touch /srv/svn/user_access/accessfile cat > /srv/svn/user_access/accessfile << EOF [groups] admin = Admin user = User cis = CIS [/] * = @admin = rw [Example:/] @user = rw @cis = r /sbin/service apache2 restart exit
рдЙрд╕рдХреЗ рдмрд╛рдж, рддреЛрдбрд╝рдлреЛрдбрд╝ рдкреНрд▓рдЧрдЗрди рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ:

рдФрд░ рд╣рдо рдЕрд╕реЗрдВрдмрд▓реА рдХреА рдЖрд╡реГрддреНрддрд┐ рднреА рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ (рдпрджрд┐ рдЕрджреНрдпрддрди рд╣реИрдВ рддреЛ рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЬрд┐рд╕рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рд╕рдкреНрддрд╛рд╣ рдореЗрдВ рд╣рд░ рдШрдВрдЯреЗ рдЬрд╛рдБрдЪ рдХреА рдЬрд╛рддреА рд╣реИ):

3. рдПрдХ рдРрд╕рд╛ рд▓рдХреНрд╖реНрдп рдмрдирд╛рдПрдВ рдЬреЛ рд╕рдмрдкреНрд░реЛрдЬреЗрдХреНрдЯреНрд╕ рдЙрджрд╛рд╣рд░рдг Xore рдФрд░ рдЙрджрд╛рд╣рд░рдг GUI рдХреЗ xml рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдкреНрд░рд▓реЗрдЦрди рдХреА рдкреАрдврд╝реА рдХреЗ рд╕рд╛рде рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдЧрд╛:
<target name="build" description="Compiles the source code."> <echo message="Target starded at: ${datetime::now()}."/> <echo message="Building ExampleCore."/> <csc codepage="utf8" target="library" output="${core.d}/${bin.d}/${build.conf}/ExampleCore.dll" doc="${doc.d}/xml/ExampleCore.xml"> <sources> <include name="${core.d}/**.cs"/> </sources> </csc> <copy file="${core.d}/${bin.d}/${build.conf}/ExampleCore.dll" tofile="${gui.d}/${bin.d}/${build.conf}/ExampleCore.dll" /> <copy file="${core.d}/${bin.d}/${build.conf}/ExampleCore.dll" tofile="${utest.d}/${bin.d}/${build.conf}/ExampleCore.dll" /> <echo message="Building ExampleGUI."/> <csc codepage="utf8" target="library" output="${gui.d}/${bin.d}/${build.conf}/ExampleGUI.dll" doc="${doc.d}/xml/ExampleGUI.xml"> <sources> <include name="${gui.d}/**.cs" /> </sources> <references> <include name="System.Web.dll" /> <include name="${gui.d}/${bin.d}/${build.conf}/ExampleCore.dll" /> </references> </csc> <echo message="Target completed at: ${datetime::now()}." /> </target>
рд╣рдо рдЪреЗрддрд╛рд╡рдирд┐рдпреЛрдВ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рд╕рдВрдХрд▓рдХ рд╕рдВрджреЗрд╢ рдЬреЗрдирдХрд┐рдиреНрд╕ рджреНрд╡рд╛рд░рд╛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдП рдЬрд╛рдПрдБ:

рднрд╡рд┐рд╖реНрдп рдореЗрдВ, рдпрд╣ рдЖрдкрдХреЛ рдХрдВрдкрд╛рдЗрд▓рд░ рдЪреЗрддрд╛рд╡рдиреА рдкрд░ рдЗрди рд░рд┐рдкреЛрд░реНрдЯреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛:

4. рд╣рдо HTML рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдкреНрд░рд▓реЗрдЦрди рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВ:
<target name="documentation" description="Generation documentation."> <echo message="Target starded at: ${datetime::now()}."/> <exec program="monodocer" commandline=" -pretty -i:${doc.d}/xml/ExampleCore.xml -assembly:${core.d}/${bin.d}/${build.conf}/ExampleCore.dll -path:${doc.d}/xml"/> <exec program="monodocer" commandline=" -pretty -i:${doc.d}/xml/ExampleGUI.xml -assembly:${gui.d}/${bin.d}/${build.conf}/ExampleGUI.dll -path:${doc.d}/xml"/> <exec program="mdoc" commandline="export-html ${doc.d}/xml -o=${doc.d}/html"/> <echo message="Target completed at: ${datetime::now()}." /> </target>
DocLinks рдкреНрд▓рдЧрдЗрди рд╕реЗрдЯ рдХрд░реЗрдВ:

рдирддреАрдЬрддрди, рдкреНрд░рд▓реЗрдЦрди рдХрд╛ рдПрдХ рд▓рд┐рдВрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдореБрдЦреНрдп рдкреГрд╖реНрда рдкрд░ рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
5. рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдг рдПрдХрддреНрд░ рдХрд░реЗрдВ рдФрд░ рдЪрд▓рд╛рдПрдВ:
<target name="utest" description="Test the source code."> <echo message="Target starded at: ${datetime::now()}."/> <echo message="Building ExampleUTest."/> <csc codepage="utf8" target="library" output="${utest.d}/${bin.d}/${build.conf}/ExampleUTest.dll"> <sources> <include name="${utest.d}/**.cs" /> </sources> <references> <include name="System.Web.dll" /> <include name="${gui.d}/${bin.d}/${build.conf}/ExampleCore.dll" /> <include name="nunit.core.dll" /> <include name="nunit.framework.dll" /> </references> </csc> <echo message="Launch NUnit." /> <nunit2 haltonfailure="false"> <formatter type="Xml" usefile="true" extension=".xml" outputdir="${utest.d}/${test.res.d}" /> <formatter type="Plain" usefile="false" /> <test assemblyname="${utest.d}/${bin.d}/${build.conf}/ExampleUTest.dll" /> </nunit2> <echo message="Target completed at: ${datetime::now()}." /> </target>
NUnit рдкреНрд▓рдЧрдЗрди рд╕реЗрдЯ рдХрд░реЗрдВ:

NUnit рдкреНрд▓рдЧрдЗрди рд░рд┐рдкреЛрд░реНрдЯ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддреА рд╣реИрдВ:

6. Gendarme рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрдерд┐рд░ рдХреЛрдб рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВ:
<target name="gendarme"> <echo message="Target starded at: ${datetime::now()}."/> <echo message="Check code by Gendarme."/> <exec program="gendarme" failonerror="false" commandline=" --config GendarmeRules.xml ${core.d}/${bin.d}/${build.conf}/ExampleCore.dll --xml ${report.d}/gendarme/ExampleCore.gendarme.xml --severity medium+ --confidence total"/> <exec program="gendarme" failonerror="false" commandline=" --config GendarmeRules.xml ${gui.d}/${bin.d}/${build.conf}/ExampleGUI.dll --xml ${report.d}/gendarme/ExampleGUI.gendarme.xml --severity medium+ --confidence total"/> <echo message="Target completed at: ${datetime::now()}." /> </target>
... рдФрд░ StyleCopCmd:
<target name="stylecop"> <echo message="Target starded at: ${datetime::now()}."/> <exec program="mono" commandline=" ${style.exe} -r -sc ${style.conf} -d ${work.d} -of ${work.d}/stylecop/stylecop.report"/> <echo message="Target completed at: ${datetime::now()}." /> </target>
StyleCopCmd рдХреЗ рдХрд╛рд░рдг рд╣реБрдИ рддреНрд░реБрдЯрд┐ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП:
While saving registry data at /etc/mono/2.0/../registry/last-btime: System.UnauthorizedAccessException: Access to the path "/etc/mono/registry/last-btime" is denied. at System.IO.FileStream..ctor (System.String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, Boolean anonymous, FileOptions options) [0x00000] in <filename unknown>:0 at System.IO.FileStream..ctor (System.String path, FileMode mode, FileAccess access, FileShare share) [0x00000] in <filename unknown>:0 at (wrapper remoting-invoke-with-check) System.IO.FileStream:.ctor (string,System.IO.FileMode,System.IO.FileAccess,System.IO.FileShare) at System.IO.StreamWriter..ctor (System.String path, Boolean append, System.Text.Encoding encoding, Int32 bufferSize) [0x00000] in <filename unknown>:0 at System.IO.StreamWriter..ctor (System.String path, Boolean append, System.Text.Encoding encoding) [0x00000] in <filename unknown>:0 at (wrapper remoting-invoke-with-check) System.IO.StreamWriter:.ctor (string,bool,System.Text.Encoding) at Microsoft.Win32.KeyHandler.SaveRegisteredBootTime (System.String path, Int64 btime) [0x00000] in <filename unknown>:0
рд╕рднреА рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд╛рдВрдЫрд┐рдд рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдБ:
sudo touch /etc/mono/registry/last-btime sudo chmod 666 /etc/mono/registry/last-btime
рдЙрд▓реНрд▓рдВрдШрди рдкреНрд▓рдЧрдЗрди рд╕реЗрдЯ рдХрд░реЗрдВ:

рддреЛ рд░рд┐рдкреЛрд░реНрдЯ рджрд┐рдЦреЗрдЧрд╛:


рдХрдИ рдЕрдкреНрд░рд┐рдп рдХреНрд╖рдг рд╣реИрдВ: рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╕реНрдЯрд╛рдЗрд▓рдХреЙрдк рдкрд░ рд╡рд┐рд╕реНрддреГрдд рд░рд┐рдкреЛрд░реНрдЯ рдХреЛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд░рд┐рдкреЛрд░реНрдЯ рдХреЛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рдЬрдбрд╝ (рдЬреЛ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рд╡реГрддреНрддрд┐ рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдХрд░рддрд╛ рд╣реИ) рдкрд░ рдЭреВрда рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рджреВрд╕рд░реА рдмрд╛рдд: рдореИрдВ рдЕрднреА рднреА Gendarme рдХреА рд╡рд┐рд╕реНрддреГрдд рд░рд┐рдкреЛрд░реНрдЯ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдирд╣реАрдВ рдХрд░ рд╕рдХрд╛ ( рдХреМрди рдЖрдпрд╛ рдерд╛ - рдореИрдВ рдорджрдж рдорд╛рдБрдЧрддрд╛ рд╣реВрдБ)ред
7. рд╣рдо рдореИрдЯреНрд░рд┐рдХреНрд╕ рдЗрдХрдЯреНрдард╛ рдХрд░рддреЗ рд╣реИрдВ:
<target name="sloccount"> <echo message="Target starded at: ${datetime::now()}."/> <echo message="Analyze code by SLOCCount."/> <exec program="sloccount" output="${report.d}/sloccount/sloccount.report" commandline=" --duplicates --wide --details ${work.d}"/> <echo message="Target completed at: ${datetime::now()}." /> </target>
SLOCCount рдкреНрд▓рдЧрдЗрди рд╕реЗрдЯ рдХрд░реЗрдВ:

рд░рд┐рдкреЛрд░реНрдЯ рдХрд╛ рдЙрджрд╛рд╣рд░рдг:

8. рд╣рдо рджреЛ рдЪрд░рдгреЛрдВ рдореЗрдВ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдХреА рдЦреЛрдЬ рдХрд░рддреЗ рд╣реИрдВ: рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, CloneAnalyzer рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЪрд▓рд╛рдПрдБ, рдФрд░ рдлрд┐рд░ рдкреНрд░рд╛рдкреНрдд рд░рд┐рдкреЛрд░реНрдЯ рдХреЛ рдХрдирд╡рд░реНрдЯ рдХрд░реЗрдВ:
<target name="cloneanalyze"> <echo message="Target starded at: ${datetime::now()}."/> <echo message="Find code duplicates by CloneAnalyze."/> <exec program="java" failonerror="false" output="${report.d}/cloneanalyzer/cloneanalyzer.report.txt" commandline=" -jar ${clone.jar} -c ${clone.conf} -f .*\.\(cs\|aspx\) -d ${work.d}"/> <echo message="Convert CloneAnalyze report in CPD report."/> <exec program="mono" failonerror="false" commandline=" ${clone.conv} ${report.d}/cloneanalyzer/cloneanalyzer.report.txt ${report.d}/cloneanalyzer/cloneanalyzer.report.xml"/> <echo message="Target completed at: ${datetime::now()}." /> </target>
DRY рдкреНрд▓рдЧрдЗрди рд╕реЗрдЯ рдХрд░реЗрдВ:

рд░рд┐рдкреЛрд░реНрдЯ рдХрд╛ рдЙрджрд╛рд╣рд░рдг:

9. рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкрд░реАрдХреНрд╖рдг рдХрд░реЗрдВ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рд╣рдо рдкрд╣рд▓реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рддреИрдирд╛рдд рдХрд░рддреЗ рд╣реИрдВ, рд╡реЗрдм рд╕рд░реНрд╡рд░ рдХреЛ рдкреБрдирд░рд╛рд░рдВрдн рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рддреЗ рд╣реИрдВ:
<target name="ftest"> <echo message="Target starded at: ${datetime::now()}."/> <echo message="Prepare to launch tests."/> <copy todir="${deploy.d}/${bin.d}/"> <fileset basedir="${gui.d}/${bin.d}/${build.conf}"> <include name="*.dll"/> </fileset> </copy> <copy todir="${deploy.d}/"> <fileset basedir="${gui.d}/"> <include name="*.aspx"/> <include name="*.asax"/> <include name="*.config"/> </fileset> </copy> <echo message="Restart apache2 server."/> <exec program="/bin/bash" commandline="-c 'sudo /etc/init.d/apache2 restart'"/> <echo message="Testing project by Selenium."/> <exec program="${selen.sh}" failonerror="false" commandline=" -htmlSuite *firefox ${selen.host} ${selen.suite} ${report.d}/selenium/selenium.html"/> <echo message="Target completed at: ${datetime::now()}." /> </target>
рдЬреЗрдирдХрд┐рдВрд╕ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╡реЗрдм рд╕рд░реНрд╡рд░ рдХреЛ рдкреБрдирд░рд╛рд░рдВрдн рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдЙрд╕реЗ рдЙрдЪрд┐рдд рдЕрдзрд┐рдХрд╛рд░ рджрд┐рдП рдЬрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
su cat > /etc/sudoers << EOF jenkins ALL=(ALL) NOPASSWD: /etc/init.d/apache2 EOF exit
рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЖрд╡рд░рдг рдмрдирд╛рдПрдБ рдЬреЛ рдЖрд╡рд╢реНрдпрдХ рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдЧрд╛ рдФрд░ рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рд╕реНрд╡рдпрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реЗрд▓реЗрдирд┐рдпрдо рд╕рд░реНрд╡рд░ рдкрд░ рдкреНрд░реЗрд╖рд┐рдд рдХрд░реЗрдЧрд╛:
cd /var/lib/jenkins/tools/SeleniumRC touch selenium.sh chmod +x selenium.sh cat > selenium.sh << EOF
рдЕрдкрд╛рдЪреЗ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВред рдлрд╝рд╛рдЗрд▓ /etc/apache/conf.d/mod_mono рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ рдФрд░ рдЖрд╡реЗрджрди рдХрд╛ рд╕реНрдерд╛рди рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВ:
<IfModule !mod_mono.c> LoadModule mono_module /usr/lib/apache2/mod_mono.so </IfModule> MonoAutoApplication disabled AddHandler mono .aspx .ascx .asax .ashx .config .cs .asmx .axd MonoApplications "/:/home/vm/public_html" AddType application/x-asp-net .aspx AddType application/x-asp-net .asmx AddType application/x-asp-net .ashx AddType application/x-asp-net .asax AddType application/x-asp-net .ascx AddType application/x-asp-net .soap AddType application/x-asp-net .rem AddType application/x-asp-net .axd AddType application/x-asp-net .cs AddType application/x-asp-net .vb AddType application/x-asp-net .master AddType application/x-asp-net .sitemap AddType application/x-asp-net .resources AddType application/x-asp-net .skin AddType application/x-asp-net .browser AddType application/x-asp-net .webinfo AddType application/x-asp-net .resx AddType application/x-asp-net .licx AddType application/x-asp-net .csproj AddType application/x-asp-net .vbproj AddType application/x-asp-net .config AddType application/x-asp-net .Config AddType application/x-asp-net .dll DirectoryIndex index.aspx DirectoryIndex Default.aspx DirectoryIndex default.aspx
рдФрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдВ /etc/apache2/conf.d/Example:
Alias / "home/vm/public_html" MonoServerPath Example "/usr/bin/mod-mono-server2" MonoSetEnv Example MONO_IOMAP=all MonoApplications Example "/:/home/vm/public_html" <Location "/"> Allow from all Order allow,deny MonoSetServerAlias Example SetHandler mono SetOutputFilter DEFLATE SetEnvIfNoCase Request_URI "\.(?:gif|jpe?g|png)$" no-gzip dont-vary </Location>
su cat > /etc/sudoers << EOF jenkins ALL=(ALL) NOPASSWD: /etc/init.d/apache2 EOF exit
рд╕реЗрд▓реЗрдирд┐рдпрдо рдкреНрд▓рдЧрдЗрди рд╕реЗрдЯ рдХрд░реЗрдВ:

рдирдореВрдирд╛ рд░рд┐рдкреЛрд░реНрдЯ (рдЬреЗрдирдХрд┐рдВрд╕ рд╕рд┐рд░реНрдл рдПрдХ рд╕реЗрд▓реЗрдирд┐рдпрдо рд░рд┐рдкреЛрд░реНрдЯ рдПрдХ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ):

рдпрд╣ NAnt рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдЧрдарди рдХреЛ рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реИред
10. рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рд╕реЗ рд╕реЛрд░реНрд╕ рдХреЛрдб рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдХрд╛рд░реНрдп рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдЦреБрд▓реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХреЛ рд╕реНрдХреИрди рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░реНрдп рднреА рд╕реАрдзреЗ рдЬреЗрдирдХрд┐рдиреНрд╕ (рдиреИрдиреНрдЯ-рд▓рд┐рдкрд┐ рдХреЛ рджрд░рдХрд┐рдирд╛рд░) рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЯрд╛рд╕реНрдХ рд╕реНрдХреИрдирд░ рдкреНрд▓рдЧрдЗрди рд╕реЗрдЯ рдХрд░реЗрдВ:

рд░рд┐рдкреЛрд░реНрдЯ рдХрд╛ рдЙрджрд╛рд╣рд░рдг:

рдЕрд╕реЗрдВрдмрд▓реА рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИред
рдЯреНрдпреВрдирд┐рдВрдЧ
рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдореИрдВ рдХреБрдЫ рдЕрдиреНрдп рдкреНрд▓рдЧрдЗрдиреНрд╕ (рдЬрд┐рдирдореЗрдВ рд╕реЗ рдПрдХ
рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рд╣реИ ) рдкрд░ рдзреНрдпрд╛рди рджреЗрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред
рдмреИрдХрдЕрдк - рдкреНрд▓рдЧрдЗрди рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдЗрд╕рдХреЗ рдирд╛рдо рд╕реЗ рд╕реНрдкрд╖реНрдЯ рд╣реИ, рдФрд░ рдЗрд╕рдХрд╛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рддреБрдЪреНрдЫ рд╣реИред рдЗрд╕рдХрд╛ рд╡рд░реНрдгрди рдЕрдирд╛рд╡рд╢реНрдпрдХ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдмреИрдХрдЕрдк рдЪрд┐рдВрддрд╛ рдХреА рдкрд╣рд▓реА рдмрд╛рдд рд╣реИ!
JobConfigHistory - рдХрднреА-рдХрднреА рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рджреМрд░рд╛рди рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рдХрд┐рдП рдЧрдП рдкрд░рд┐рд╡рд░реНрддрди рдЕрд╕рдлрд▓ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдкрд┐рдЫрд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдЖрд╕рд╛рдиреА рд╕реЗ рд▓реМрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд┐рдЫрд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрд╛рдп рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрддрд╛ рд╣реИред рдбреЗрдЯрд╛ рдкреНрд▓рдЧрдЗрди рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХрд╛ рдЗрддрд┐рд╣рд╛рд╕ рд░рдЦрддрд╛ рд╣реИ рдФрд░ рдЖрдкрдХреЛ рдХрд┐рдП рдЧрдП рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рдЧреНрд░реАрди рдмреЙрд▓реНрд╕ - рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдЬреЗрдирдХрд┐рдиреНрд╕ рд╕реНрдерд┐рддрд┐ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреАрди рд░рдВрдЧреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ: рд▓рд╛рд▓, рдкреАрд▓рд╛ рдФрд░ рдиреАрд▓рд╛ред рдпрд╣ рдкреНрд▓рдЧрдЗрди рдЖрдкрдХреЛ рд╣рд░реЗ рд░рдВрдЧ рдХреЗ рд╕рд╛рде рдиреАрд▓реЗ рд░рдВрдЧ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЗрд╕ рдкреНрд▓рдЧрдЗрди рдХрд╛ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдореВрд▓реНрдп рдмрд╣реБрдд рд╣реА рд╕рдВрджреЗрд╣рд╛рд╕реНрдкрдж рд╣реИ, рд▓реЗрдХрд┐рди рд╕реМрдВрджрд░реНрдпрд╢рд╛рд╕реНрддреНрд░ рдХреЛ рдирдЬрд░рдЕрдВрджрд╛рдЬ рдХрд░рдирд╛ рдХрдард┐рди рд╣реИ!
рдЕрдЧрд▓рд╛ рдмрд┐рд▓реНрдб рдирдВрдмрд░ - рдЖрдкрдХреЛ
рдЕрдЧрд▓рд╛ рдмрд┐рд▓реНрдб рдирдВрдмрд░ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдпрд╣ рдЙрди рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ рдЬрдм рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рджреМрд░рд╛рди рдХрдИ рдЕрд╕реЗрдВрдмрд▓реА рдХреА рдЬрд╛рддреА рд╣реИрдВ, рдЬрд┐рдиреНрд╣реЗрдВ рддрдм рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдирдВрдмрд░рд┐рдВрдЧ рдореЗрдВ рдПрдХ рдЫреЗрдж рдмрдирддрд╛ рд╣реИред рдпрд╛ рдЙрди рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЬрдм рдЖрдкрдХреЛ рд╕рдВрд╕реНрдХрд░рдг рд╕рдВрдЦреНрдпрд╛ рдХреЛ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд░рд┐рд▓реАрдЬрд╝ рдХреЗ рд▓рд┐рдП)ред
рд╕рд╛рдЗрдбрдмрд╛рд░-рд▓рд┐рдВрдХ рдПрдХ рдмрд╣реБрдд рд╣реА рджрд┐рд▓рдЪрд╕реНрдк рдкреНрд▓рдЧрдЗрди рд╣реИред рдЖрдкрдХреЛ рдореБрдЦреНрдп рдкреГрд╖реНрда рдкрд░ рдпрд╛ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рдкреГрд╖реНрдареЛрдВ рдкрд░ рд▓рд┐рдВрдХ рд▓рдЧрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЬрдм рдпрд╣ рдорджрджрдЧрд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореБрдЦреНрдп рдкреГрд╖реНрда рдкрд░ рдЖрдк рдХреБрдЫ рдХреЙрд░реНрдкреЛрд░реЗрдЯ рд╕рдВрд╕рд╛рдзрди, рдЬреНрдЮрд╛рдирдХреЛрд╖ рдпрд╛ рдХреБрдЫ рдФрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХ рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВ (рдпрд╣ рдордд рднреВрд▓реЛ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдХрдВрдЯреЗрдВрдЯ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рд░рдЦреА рдЧрдИ рд╕рд╛рдордЧреНрд░реА рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЬреЗрдирдХреЗрдВрд╕реЛ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИ)ред рдореБрдЦреНрдп рдкреГрд╖реНрда рдкрд░ рдПрдХ рд▓рд┐рдВрдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╕рд░реНрд╡рд░ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рдФрд░ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдирд╣реАрдВ):

рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдореБрдЦреНрдп рдкреГрд╖реНрда рдкрд░ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд▓рд┐рдВрдХ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ:

рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдкреЗрдЬ рдкрд░, рдЖрдк рдЗрд╕ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдВрд╕рд╛рдзрди рдХрд╛ рд▓рд┐рдВрдХ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, svn рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЗ рд▓рд┐рдП), рдпрд╛, рдЬреЛ рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдХреБрдЫ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдХреЗ рд▓рд┐рдП рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЬреЗрдирдХрд┐рдиреНрд╕ рдкреНрд▓рдЧ-рдЗрди рдирд╣реАрдВ рд╣реИред рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдкреЗрдЬ рдкрд░ рдПрдХ рд▓рд┐рдВрдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЗрд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:

рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЖрдЗрдХрди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдХреЗрд╡рд▓ рд╕рд░реНрд╡рд░ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рд░реНрд╡рд░ рдкрд░ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИред
рдпрд╣ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдкреГрд╖реНрда рдкрд░ рд╕рдмрд╡рд░реНрд╕рди рд▓рд┐рдВрдХ рдЬреИрд╕рд╛ рджрд┐рдЦреЗрдЧрд╛редрдпрд╣ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдкреГрд╖реНрда рдирд┐рд╖реНрдХрд░реНрд╖ рдореЗрдВ рдХреИрд╕рд╛ рджрд┐рдЦреЗрдЧрд╛:
рдФрд░ рдпрд╣рд╛рдВ рдмрд┐рд▓реНрдб рд░рд┐рдкреЛрд░реНрдЯ рдкреГрд╖реНрда рд╣реИ:
рд╡реНрдпрд╛рдкрдХ рддрд░реНрдХ (рд╕рд╛рдорд╛рдиреНрдп рдирд┐рд╖реНрдХрд░реНрд╖ рдХреЗ рдмрдЬрд╛рдп)
рдмреЗрд╢рдХ, рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рдХреЛ рдЖрджрд░реНрд╢ рд░реВрдк рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИредрдкрд╣рд▓рд╛: рдкреНрд░рд╕реНрддреБрдд рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдбреЗрдЯрд╛рдмреЗрд╕ рдирд╣реАрдВ рд╣реИ, рдЬреЛ рдЬреАрд╡рди рдореЗрдВ рдмрд╣реБрдд рджреБрд░реНрд▓рдн рд╣реИ рдФрд░ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рд╕рд╣реА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рдордиреЛрд░рдВрдЬрдХ рдХрд╛рд░реНрдп рдХреА рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реЗ рд╡рдВрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ (рдпрд╛ рддреЛ рдЗрд╕реЗ рд╣рдореЗрд╢рд╛ рдирд┐рдпрдВрддреНрд░рдг рдореЗрдВ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реЗ рдЗрдХрдЯреНрдард╛ рдХрд░реЗрдВ, рдпрд╛ рдмрд╛рдЗрдирд░реА рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╕реАрдзреЗ рдирд┐рдпрдВрддреНрд░рдг рдореЗрдВ рд░рдЦреЗрдВ, рдлрд┐рд░ рдмрд╛рдЗрдирд░реА рдлрд╝рд╛рдЗрд▓ рдкрд░ рдирд┐рдпрдВрддреНрд░рд┐рдд рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП)редрджреВрд╕рд░реА рдмрд╛рдд: CI Servere рдкрд░ рдЕрд╕реЗрдВрдмрд▓ рдХрд░рдирд╛ рдЕрдХреНрд╕рд░ рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдпрд╣ рдПрдХ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд▓рд╛рд╣ рджреА рдЬрд╛рддреА рд╣реИ рддрд╛рдХрд┐ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рддреИрдирд╛рдд рдХрд░рдиреЗ рдХрд╛ рдСрдкрд░реЗрд╢рди рдХреБрдЫ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реЛредрддреАрд╕рд░рд╛: рдпреВрдирд┐рдЯ рдЯреЗрд╕реНрдЯ рд╕рдВрднрд╡рддрдпрд╛ рдЯреЗрд╕реНрдЯ рд╕рд░реНрд╡рд░ рдХреЗ рдмрдЬрд╛рдп рдмрд┐рд▓реНрдб рд╕рд░реНрд╡рд░ рдкрд░ рдЕрдзрд┐рдХ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВредрдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдХреЛрдИ рднреА рд╕реВрдЪрдирд╛ рдкреНрд▓рдЧрд┐рди рдирд╣реАрдВ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ, рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИредрдЕрдВрдд рдореЗрдВ, рд╕реАрдЖрдИ servere рдкрд░ рдХреБрдЫ рдкрд░рд┐рд╡рд░реНрддрди (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХреНрд╕-рд╕рд░реНрд╡рд░ рддрдВрддреНрд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рдкрд░ рдЬрдм рдЙрдкрд╛рдпреЛрдВ )редрдореБрдЭреЗ рдФрд░ рдХреНрдпрд╛ рдЪрд╛рд╣рд┐рдПредрдореИрдВ рд╕рдмрд╕реЗ рдЬреНрдпрд╛рджрд╛ рдкреНрд░реА-рдЯреЗрд╕реНрдЯреЗрдб рдХрдорд┐рдЯ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ редрдореБрдЭреЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдХреЛрдб рдХрд╡рд░реЗрдЬ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдЪрд╛рд╣рд┐рдПредрдореБрдЭреЗ рд╡реНрдпрд╛рдкрдХ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХрд▓реЗрдХреНрдЯрд░ рдЪрд╛рд╣рд┐рдПред рд╕реА # рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП рдХреЛрдб рдХреА рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╢рд╛рдВрдд рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рд╕рд╛рдЗрдХреНрд▓реЛрдореИрдЯрд┐рдХ рдЬрдЯрд┐рд▓рддрд╛ рдФрд░ рдХрдиреЗрдХреНрдЯрд┐рд╡рд┐рдЯреА рдХреА рдбрд┐рдЧреНрд░реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдФрд░ рд╕рдВрднрд╡рддрдГ рдХреБрдЫ рдФрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВред рд╡реИрд╕реЗ, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЖрдИрдбреАрдИ рдЖрд╡реЗрджрди рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЛ рдмреЗрд╣рддрд░ рддрд░реАрдХреЗ рд╕реЗ рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ рдХреЗ рдХрд╛рд░реНрдп рдХреЗ рд╕рд╛рде рдореБрдХрд╛рдмрд▓рд╛ рдХрд░рддрд╛ рд╣реИред рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдореЛрдиреЛрдбреЗрд╡рд▓рдк рдЯреИрдм рдкрд░, рдЖрдк рдирд┐рдореНрди рдЬрд╛рдирдХрд╛рд░реА рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ:
рдкреБрдирд╢реНрдЪ
рдЦреИрд░, рд╕рдмрд╕реЗ рдЕрдВрдд рдореЗрдВ, рдореИрдВ рдЙрди рд╕рднреА рдХреЛ рдЖрдордВрддреНрд░рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛, рдЬреЛ рдЧреНрд░рд╛рд╣рдХ рдХреА рдУрд░ рд╕реЗ рдПрдХ рдорд╣реАрдиреЗ рдХреЗ рдмрд╛рдж рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реАрдЦрдирд╛ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдмрд┐рд▓реНрдб рд╕рд░реНрд╡рд░ рд╕реЗ рдЕрдЧрд▓реЗ рджрд┐рди, рдЕрдкрдирд╛ рдЕрдиреБрднрд╡ рдФрд░ рдкреНрд░рд╕реНрддреБрдд рдЙрджрд╛рд╣рд░рдг рдкрд░ рдЯрд┐рдкреНрдкрдгреА рдХрд░реЗрдВред