рдЧрд┐рдЯрд▓реИрдм рдореЗрдВ рд╕реАрдЖрдИ/рд╕реАрдбреА рдХреЗ рд▓рд┐рдП рдПрдХ рдЧрд╛рдЗрдб (рд▓рдЧрднрдЧ) рдирд┐рд░рдкреЗрдХреНрд╖ рд╢реБрд░реБрдЖрддреА рдХреЗ рд▓рд┐рдП

рдпрд╛ рдЖрд╕рд╛рди рдХреЛрдбрд┐рдВрдЧ рдХреА рдПрдХ рд╢рд╛рдо рдореЗрдВ рдЕрдкрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рд╕реБрдВрджрд░ рдмреИрдЬ рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ

рд╢рд╛рдпрдж, рдкреНрд░рддреНрдпреЗрдХ рдбреЗрд╡рд▓рдкрд░ рдЬрд┐рд╕рдХреЗ рдкрд╛рд╕ рдХрдо рд╕реЗ рдХрдо рдПрдХ рдкрд╛рд▓рддреВ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╣реИ, рдЙрд╕рдХреЗ рдкрд╛рд╕ рд╕реНрдерд┐рддрд┐, рдХреЛрдб рдХрд╡рд░реЗрдЬ, рдирдЧреЗрдЯ рдореЗрдВ рдкреИрдХреЗрдЬ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рд╕реБрдВрджрд░ рдмреИрдЬ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдЦреБрдЬрд▓реА рд╣реИ ... рдФрд░ рдЗрд╕ рдЦреБрдЬрд▓реА рдиреЗ рдореБрдЭреЗ рдпрд╣ рд▓реЗрдЦ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рд┐рдд рдХрд┐рдпрд╛ред рдЗрд╕реЗ рд▓рд┐рдЦрдиреЗ рдХреА рддреИрдпрд╛рд░реА рдореЗрдВ, рдореБрдЭреЗ рдпрд╣ рд╕реБрдВрджрд░рддрд╛ рдореЗрд░реА рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдорд┐рд▓реА:

рдЧрд┐рдЯрд▓реИрдм рдореЗрдВ рд╕реАрдЖрдИ/рд╕реАрдбреА рдХреЗ рд▓рд┐рдП рдПрдХ рдЧрд╛рдЗрдб (рд▓рдЧрднрдЧ) рдирд┐рд░рдкреЗрдХреНрд╖ рд╢реБрд░реБрдЖрддреА рдХреЗ рд▓рд┐рдП

рдпрд╣ рд▓реЗрдЦ рдЖрдкрдХреЛ GitLab рдореЗрдВ .Net Core рдХреНрд▓рд╛рд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдирд┐рд░рдВрддрд░ рдПрдХреАрдХрд░рдг рдФрд░ рд╡рд┐рддрд░рдг рдХреЗ рдмреБрдирд┐рдпрд╛рджреА рд╕реЗрдЯрдЕрдк рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рдПрдЧрд╛, GitLab рдкреЗрдЬреЛрдВ рдХреЗ рд▓рд┐рдП рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рдирд╛, рдФрд░ Azure DevOps рдореЗрдВ рдирд┐рд░реНрдорд┐рдд рдкреИрдХреЗрдЬреЛрдВ рдХреЛ рдПрдХ рдирд┐рдЬреА рдлрд╝реАрдб рдореЗрдВ рдзрдХреЗрд▓рдирд╛ред

рд╡реАрдПрд╕ рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡рд┐рд╕реНрддрд╛рд░ рдХреЗ рд╕рд╛рде рд╡рд┐рдХрд╛рд╕ рдХреЗ рд╡рд╛рддрд╛рд╡рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдЧрд┐рдЯрд▓реИрдм рд╡рд░реНрдХрдлрд╝реНрд▓реЛ (рд╡рд┐рдХрд╛рд╕ рд╡рд╛рддрд╛рд╡рд░рдг рд╕реЗ рд╕реАрдзреЗ рд╕реЗрдЯрд┐рдВрдЧ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдорд╛рдиреНрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП)ред

рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдкрд░рд┐рдЪрдп

рд╕реАрдбреА - рдХреНрдпрд╛ рдпрд╣ рддрдм рд╣реИ рдЬрдм рдЖрдкрдиреЗ рд╕рд┐рд░реНрдл рдзрдХреНрдХрд╛ рджрд┐рдпрд╛, рдФрд░ рдЧреНрд░рд╛рд╣рдХ рдкрд░ рд╕рдм рдХреБрдЫ рдкрд╣рд▓реЗ рд╣реА рдЧрд┐рд░ рдЪреБрдХрд╛ рд╣реИ?

CI / CD рдХреНрдпрд╛ рд╣реИ рдФрд░ рдЖрдкрдХреЛ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ - рдЖрдк рдЗрд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ google рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред GitLab рдореЗрдВ рдкрд╛рдЗрдкрд▓рд╛рдЗрдиреЛрдВ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдкреВрд░реНрдг рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ рдЖрд╕рд╛рди рднреА. рдпрд╣рд╛рдБ рдореИрдВ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдФрд░, рдпрджрд┐ рд╕рдВрднрд╡ рд╣реЛ рддреЛ, рджреЛрд╖реЛрдВ рдХреЗ рдмрд┐рдирд╛ рдПрдХ рдкрдХреНрд╖реА рдХреА рджреГрд╖реНрдЯрд┐ рд╕реЗ рдкреНрд░рдгрд╛рд▓реА рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реВрдБрдЧрд╛:

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

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╣реИ:

  • рдкрд╛рдЗрдкрд▓рд╛рдЗрди - рдЪрд░рдгреЛрдВ рдореЗрдВ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рдЬрд┐рд╕рдореЗрдВ рдЖрдк рдирд┐рд░реНрдорд╛рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдкрд░реАрдХреНрд╖рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдкреИрдХреЗрдЬ рдХреЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдПрдХ рдХреНрд▓рд╛рдЙрдб рд╕реЗрд╡рд╛ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдмрд┐рд▓реНрдб рдХреЛ рддреИрдирд╛рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЖрджрд┐ред
  • рдЕрд╡рд╕реНрдерд╛ (рдордВрдЪ) тАФ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рд╕рдВрдЧрдарди рдЗрдХрд╛рдИ, рдЬрд┐рд╕рдореЗрдВ 1+ рдХрд╛рд░реНрдп рд╢рд╛рдорд┐рд▓ рд╣реИ,
  • рдХрд╛рдо (рдХрд╛рдо) рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдореЗрдВ рдХрд╛рдо рдХреА рдПрдХ рдЗрдХрд╛рдИ рд╣реИред рдЗрд╕рдореЗрдВ рдПрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ (рдЕрдирд┐рд╡рд╛рд░реНрдп), рд▓реЙрдиреНрдЪ рдХреА рд╢рд░реНрддреЗрдВ, рдкреНрд░рдХрд╛рд╢рди/рдХреИрд╢рд┐рдВрдЧ рдХрд▓рд╛рдХреГрддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реЗрдЯрд┐рдВрдЧреНрд╕, рдФрд░ рдмрд╣реБрдд рдХреБрдЫ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред

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

рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ: рдХреНрдпреЛрдВ?

  • рдЧрд┐рдЯрд▓реИрдм рдХреНрдпреЛрдВ?

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

  • Azure DevOps рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХреНрдпреЛрдВ рдирд╣реАрдВ?

рдХреНрдпреЛрдВрдХрд┐ рд╡рд╣рд╛рдВ рд╕реЗрдЯрд┐рдВрдЧ рдкреНрд░рд╛рдердорд┐рдХ рд╣реИ - рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдХреЗ рдЬреНрдЮрд╛рди рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдмрд╛рд╣рд░реА рдЧрд┐рдЯ рдкреНрд░рджрд╛рддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдПрдХреАрдХрд░рдг - рдХреБрдЫ рдХреНрд▓рд┐рдХреЛрдВ рдореЗрдВ, рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЛ рдХрдорд┐рдЯ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП SSH рдХреБрдВрдЬрд┐рдпреЛрдВ рдХрд╛ рдЖрдпрд╛рдд - рднреА, рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдЖрд╕рд╛рдиреА рд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХреА рдЬрд╛рддреА рд╣реИ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╕реЗ рднреА рдирд╣реАрдВред

рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕реНрдерд┐рддрд┐: рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреНрдпрд╛ рд╣реИ рдФрд░ рдЖрдк рдХреНрдпрд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ

рд╣рдорд╛рд░реЗ рдкрд╛рд╕:

  • GitLab рдореЗрдВ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реАред

рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ:

  • рдкреНрд░рддреНрдпреЗрдХ рдорд░реНрдЬ рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдЕрд╕реЗрдВрдмрд▓реА рдФрд░ рдкрд░реАрдХреНрд╖рдг,
  • рдкреНрд░рддреНрдпреЗрдХ рдорд░реНрдЬ рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП рдкреИрдХреЗрдЬ рдмрдирд╛рдирд╛ рдФрд░ рдорд╛рд╕реНрдЯрд░ рдХреЛ рдзрдХреНрдХрд╛ рджреЗрдирд╛, рдмрд╢рд░реНрддреЗ рдкреНрд░рддрд┐рдмрджреНрдз рд╕рдВрджреЗрд╢ рдореЗрдВ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд░реЗрдЦрд╛ рд╣реЛ,
  • Azure DevOps рдореЗрдВ рдирд┐рдЬреА рдлрд╝реАрдб рдореЗрдВ рдирд┐рд░реНрдорд┐рдд рдкреИрдХреЗрдЬ рднреЗрдЬрдирд╛,
  • GitLab рдкреЗрдЬреЛрдВ рдореЗрдВ рдкреНрд░рд▓реЗрдЦрди рдФрд░ рдкреНрд░рдХрд╛рд╢рди рдХреА рдЕрд╕реЗрдВрдмрд▓реА,
  • рдмреИрдЬ!11

рд╡рд░реНрдгрд┐рдд рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдореЙрдбрд▓ рдкрд░ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рд░реВрдк рд╕реЗ рдЖрддреА рд╣реИрдВ:

  • рд╕реНрдЯреЗрдЬ 1 - рдЕрд╕реЗрдВрдмрд▓реА
    • рд╣рдо рдХреЛрдб рдПрдХрддреНрд░ рдХрд░рддреЗ рд╣реИрдВ, рдЖрдЙрдЯрдкреБрдЯ рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рдХрд▓рд╛рдХреГрддрд┐рдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВ
  • рд╕реНрдЯреЗрдЬ 2 - рдкрд░реАрдХреНрд╖рдг
    • рд╣рдо рдмрд┐рд▓реНрдб рд╕реНрдЯреЗрдЬ рд╕реЗ рдХрд▓рд╛рдХреГрддрд┐рдпрд╛рдБ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ, рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рдХреЛрдб рдХрд╡рд░реЗрдЬ рдбреЗрдЯрд╛ рдПрдХрддреНрд░ рдХрд░рддреЗ рд╣реИрдВ
  • рд╕реНрдЯреЗрдЬ 3 - рд╕рдмрдорд┐рдЯ рдХрд░реЗрдВ
    • рдЯрд╛рд╕реНрдХ 1 - рдирдЧреЗрдЯ рдкреИрдХреЗрдЬ рдмрдирд╛рдПрдВ рдФрд░ рдЗрд╕реЗ Azure DevOps рдХреЛ рднреЗрдЬреЗрдВ
    • рдЯрд╛рд╕реНрдХ 2 - рд╣рдо рд╕реНрд░реЛрдд рдХреЛрдб рдореЗрдВ xmldoc рд╕реЗ рд╕рд╛рдЗрдЯ рдПрдХрддреНрд░ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ GitLab рдкреЗрдЬреЛрдВ рдореЗрдВ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВ

рдЖрдПрдБ рд╢реБрд░реВ рдХрд░реЗрдВ!

рд╡рд┐рдиреНрдпрд╛рд╕ рдПрдХрддреНрд░рд┐рдд рдХрд░рдирд╛

рдЦрд╛рддреЗ рддреИрдпрд╛рд░ рдХрд░рдирд╛

  1. рдореЗрдВ рдЕрдХрд╛рдЙрдВрдЯ рдмрдирд╛рдПрдВ рдорд╛рдЗрдХреНрд░реЛрд╕реЙрдлреНрдЯ рдиреАрд▓рд╛

  2. рдХреЗ рд▓рд┐рдП рдЬрд╛рдУ Azure DevOps

  3. рд╣рдо рдПрдХ рдирдпрд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рддреЗ рд╣реИрдВ

    1. рдирд╛рдо - рдХреЛрдИ рднреА
    2. рджреГрд╢реНрдпрддрд╛ - рдХреЛрдИ рднреА
      рдЧрд┐рдЯрд▓реИрдм рдореЗрдВ рд╕реАрдЖрдИ/рд╕реАрдбреА рдХреЗ рд▓рд┐рдП рдПрдХ рдЧрд╛рдЗрдб (рд▓рдЧрднрдЧ) рдирд┐рд░рдкреЗрдХреНрд╖ рд╢реБрд░реБрдЖрддреА рдХреЗ рд▓рд┐рдП

  4. рдЬрдм рдЖрдк рдХреНрд░рд┐рдПрдЯ рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрди рдЬрд╛рдПрдЧрд╛ рдФрд░ рдЖрдк рдЗрд╕рдХреЗ рдкреЗрдЬ рдкрд░ рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ рд╣реЛ рдЬрд╛рдПрдВрдЧреЗред рдЗрд╕ рдкреГрд╖реНрда рдкрд░, рдЖрдк рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ (рдмрд╛рдИрдВ рдУрд░ рд╕реВрдЪреА рдореЗрдВ рдирд┐рдЪрд▓рд╛ рд▓рд┐рдВрдХ -> рдЕрд╡рд▓реЛрдХрди -> Azure DevOps Services рдмреНрд▓реЙрдХ) рдкрд░ рдЬрд╛рдХрд░ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рдЕрдХреНрд╖рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
    рдЧрд┐рдЯрд▓реИрдм рдореЗрдВ рд╕реАрдЖрдИ/рд╕реАрдбреА рдХреЗ рд▓рд┐рдП рдПрдХ рдЧрд╛рдЗрдб (рд▓рдЧрднрдЧ) рдирд┐рд░рдкреЗрдХреНрд╖ рд╢реБрд░реБрдЖрддреА рдХреЗ рд▓рд┐рдП

  5. Atrifacts рдкрд░ рдЬрд╛рдПрдВ, рдлрд╝реАрдб рдмрдирд╛рдПрдВ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ

    1. рд╕реНрд░реЛрдд рдХрд╛ рдирд╛рдо рджрд░реНрдЬ рдХрд░реЗрдВ
    2. рджреГрд╢реНрдпрддрд╛ рдЪреБрдиреЗрдВ
    3. рд╕рд╣реА рдХрд╛ рдирд┐рд╢рд╛рди рд╣рдЯрд╛рдПрдБ рдЖрдо рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕реНрд░реЛрддреЛрдВ рд╕реЗ рдкреИрдХреЗрдЬ рд╢рд╛рдорд┐рд▓ рдХрд░реЗрдВ, рддрд╛рдХрд┐ рд╕реНрд░реЛрдд рдбрдВрдк рдирдЧреЗрдЯ рдХреНрд▓реЛрди рдореЗрдВ рди рдмрджрд▓ рдЬрд╛рдП
      рдЧрд┐рдЯрд▓реИрдм рдореЗрдВ рд╕реАрдЖрдИ/рд╕реАрдбреА рдХреЗ рд▓рд┐рдП рдПрдХ рдЧрд╛рдЗрдб (рд▓рдЧрднрдЧ) рдирд┐рд░рдкреЗрдХреНрд╖ рд╢реБрд░реБрдЖрддреА рдХреЗ рд▓рд┐рдП

  6. рдХрдиреЗрдХреНрдЯ рдЯреВ рдлреАрдб рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ, рд╡рд┐рдЬреБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ, рдорд╢реАрди рд╕реЗрдЯрдЕрдк рдмреНрд▓реЙрдХ рд╕реЗ рд╕реНрд░реЛрдд рдХреЙрдкреА рдХрд░реЗрдВ
    рдЧрд┐рдЯрд▓реИрдм рдореЗрдВ рд╕реАрдЖрдИ/рд╕реАрдбреА рдХреЗ рд▓рд┐рдП рдПрдХ рдЧрд╛рдЗрдб (рд▓рдЧрднрдЧ) рдирд┐рд░рдкреЗрдХреНрд╖ рд╢реБрд░реБрдЖрддреА рдХреЗ рд▓рд┐рдП

  7. рдЕрдХрд╛рдЙрдВрдЯ рд╕реЗрдЯрд┐рдВрдЧ рдореЗрдВ рдЬрд╛рдПрдВ, рдкрд░реНрд╕рдирд▓ рдПрдХреНрд╕реЗрд╕ рдЯреЛрдХрди рдЪреБрдиреЗрдВ
    рдЧрд┐рдЯрд▓реИрдм рдореЗрдВ рд╕реАрдЖрдИ/рд╕реАрдбреА рдХреЗ рд▓рд┐рдП рдПрдХ рдЧрд╛рдЗрдб (рд▓рдЧрднрдЧ) рдирд┐рд░рдкреЗрдХреНрд╖ рд╢реБрд░реБрдЖрддреА рдХреЗ рд▓рд┐рдП

  8. рдПрдХ рдирдпрд╛ рдПрдХреНрд╕реЗрд╕ рдЯреЛрдХрди рдмрдирд╛рдПрдВ

    1. рдирд╛рдо - рдордирдорд╛рдирд╛
    2. рд╕рдВрдЧрдарди - рд╡рд░реНрддрдорд╛рди
    3. рдЕрдзрд┐рдХрддрдо 1 рд╡рд░реНрд╖ рдХреЗ рд▓рд┐рдП рд╡реИрдз
    4. рдХрд╛рд░реНрдпрдХреНрд╖реЗрддреНрд░ - рдкреИрдХреЗрдЬрд┐рдВрдЧ/рдкрдврд╝реЗрдВ рдФрд░ рд▓рд┐рдЦреЗрдВ
      рдЧрд┐рдЯрд▓реИрдм рдореЗрдВ рд╕реАрдЖрдИ/рд╕реАрдбреА рдХреЗ рд▓рд┐рдП рдПрдХ рдЧрд╛рдЗрдб (рд▓рдЧрднрдЧ) рдирд┐рд░рдкреЗрдХреНрд╖ рд╢реБрд░реБрдЖрддреА рдХреЗ рд▓рд┐рдП

  9. рдмрдирд╛рдП рдЧрдП рдЯреЛрдХрди рдХреЛ рдХреЙрдкреА рдХрд░реЗрдВ - рдореЛрдбрд▓ рд╡рд┐рдВрдбреЛ рдмрдВрдж рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдорд╛рди рдЕрдиреБрдкрд▓рдмреНрдз рд╣реЛрдЧрд╛

  10. GitLab рдореЗрдВ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдкрд░ рдЬрд╛рдПрдВ, CI / CD рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдЪреБрдиреЗрдВ
    рдЧрд┐рдЯрд▓реИрдм рдореЗрдВ рд╕реАрдЖрдИ/рд╕реАрдбреА рдХреЗ рд▓рд┐рдП рдПрдХ рдЧрд╛рдЗрдб (рд▓рдЧрднрдЧ) рдирд┐рд░рдкреЗрдХреНрд╖ рд╢реБрд░реБрдЖрддреА рдХреЗ рд▓рд┐рдП

  11. рд╡реЗрд░рд┐рдПрдмрд▓реНрд╕ рдмреНрд▓реЙрдХ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░реЗрдВ, рдПрдХ рдирдпрд╛ рдЬреЛрдбрд╝реЗрдВ

    1. рдирд╛рдо - рд░рд┐рдХреНрдд рд╕реНрдерд╛рди рдХреЗ рдмрд┐рдирд╛ рдХреЛрдИ рднреА (рдХрдорд╛рдВрдб рд╢реЗрд▓ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реЛрдЧрд╛)
    2. рдорд╛рди - рдкреИрд░рд╛рдЧреНрд░рд╛рдл 9 рд╕реЗ рдПрдХреНрд╕реЗрд╕ рдЯреЛрдХрди
    3. рдорд╛рд╕реНрдХ рдЪрд░ рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ
      рдЧрд┐рдЯрд▓реИрдм рдореЗрдВ рд╕реАрдЖрдИ/рд╕реАрдбреА рдХреЗ рд▓рд┐рдП рдПрдХ рдЧрд╛рдЗрдб (рд▓рдЧрднрдЧ) рдирд┐рд░рдкреЗрдХреНрд╖ рд╢реБрд░реБрдЖрддреА рдХреЗ рд▓рд┐рдП

рдпрд╣ рдкреВрд░реНрд╡-рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реИред

рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлреНрд░реЗрдорд╡рд░реНрдХ рддреИрдпрд╛рд░ рдХрд░рдирд╛

рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, GitLab рдореЗрдВ CI / CD рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ .gitlab-ci.yml рднрдВрдбрд╛рд░ рдХреА рдЬрдбрд╝ рд╕реЗред рдЖрдк рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдореЗрдВ рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рдордирдорд╛рдирд╛ рдкрде рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИред

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдПрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╣реИ YAML. рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рд╡рд┐рд╡рд░рдг рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рд╢реАрд░реНрд╖ рд╕реНрддрд░ рдкрд░ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдиреЗрд╕реНрдЯреЗрдб рд╕реНрддрд░ рдкрд░ рдХреМрди рд╕реА рдХреБрдВрдЬрд┐рдпрд╛рдБ рд╕рдорд╛рд╣рд┐рдд рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИрдВред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдбреЙрдХрд░ рдЫрд╡рд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХ рдЬреЛрдбрд╝реЗрдВ, рдЬрд┐рд╕рдореЗрдВ рдХрд╛рд░реНрдп рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗред рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдо рдкрд╛рддреЗ рд╣реИрдВ рдбреЙрдХрд░ рд╣рдм рдкрд░ рдиреЗрдЯ рдХреЛрд░ рдЗрдореЗрдЬ рдкреЗрдЬ. рдореЗрдВ GitHub рд╡рд┐рднрд┐рдиреНрди рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕ рдЫрд╡рд┐ рдХреЛ рдЪреБрдирдирд╛ рд╣реИ, рдЗрд╕ рдкрд░ рдПрдХ рд╡рд┐рд╕реНрддреГрдд рдорд╛рд░реНрдЧрджрд░реНрд╢рд┐рдХрд╛ рд╣реИред .Net Core 3.1 рд╡рд╛рд▓реА рдПрдХ рдЫрд╡рд┐ рд╣рдорд╛рд░реЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рдорд╣рд╕реВрд╕ рдХрд░реЗрдВ

image: mcr.microsoft.com/dotnet/core/sdk:3.1

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

рдЕрдЧрд▓рд╛ рдХрджрдо рдЬреЛрдбрд╝рдирд╛ рд╣реИ рдордВрдЪ'рдПрд╕ред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, GitLab 5 рдЪрд░рдгреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ:

  • .pre - рд╕рднреА рдЪрд░рдгреЛрдВ рддрдХ рдкреНрд░рджрд░реНрд╢рди рдХрд┐рдпрд╛,
  • .post - рд╕рднреА рдЪрд░рдгреЛрдВ рдХреЗ рдмрд╛рдж рдкреНрд░рджрд░реНрд╢рди рдХрд┐рдпрд╛,
  • build - рдкрд╣рд▓реЗ рдХреЗ рдмрд╛рдж .pre рдЕрд╡рд╕реНрдерд╛,
  • test - рджреВрд╕рд░рд╛ рдЪрд░рдг,
  • deploy - рддреАрд╕рд░рд╛ рдЪрд░рдгред

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

stages:
  - build
  - test
  - deploy

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

before_script:
  - $PSVersionTable.PSVersion
  - dotnet --version
  - nuget help | select-string Version

рдпрд╣ рдХрдо рд╕реЗ рдХрдо рдПрдХ рдХрд╛рд░реНрдп рдЬреЛрдбрд╝рдирд╛ рдмрд╛рдХреА рд╣реИ рддрд╛рдХрд┐ рдЬрдм рдХрдорд┐рдЯ рднреЗрдЬрд╛ рдЬрд╛рдП рддреЛ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рд╢реБрд░реВ рд╣реЛ рдЬрд╛рдПред рдЕрднреА рдХреЗ рд▓рд┐рдП, рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЦрд╛рд▓реА рдХрд╛рд░реНрдп рдЬреЛрдбрд╝реЗрдВ:

dummy job:
  script:
    - echo ok

рд╣рдо рд╕рддреНрдпрд╛рдкрди рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рд╣рдореЗрдВ рдПрдХ рд╕рдВрджреЗрд╢ рдорд┐рд▓рддрд╛ рд╣реИ рдХрд┐ рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реИ, рд╣рдо рдкреНрд░рддрд┐рдмрджреНрдз рд╣реИрдВ, рд╣рдо рдзрдХреНрдХрд╛ рджреЗрддреЗ рд╣реИрдВ, рд╣рдо рд╕рд╛рдЗрдЯ рдкрд░ рдкрд░рд┐рдгрд╛рдо рджреЗрдЦрддреЗ рд╣реИрдВ ... рдФрд░ рд╣рдореЗрдВ рдПрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИ - bash: .PSVersion: command not found. рдбрдмреНрд▓реНрдпреВрдЯреАрдПрдл?

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

dummy job on windows:
  script:
    - echo ok
  tags:
    - windows

рдорд╣рд╛рди! рдЕрднреА рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдЪрд▓ рд░рд╣реА рд╣реИред

рдПрдХ рдЪреМрдХрд╕ рдкрд╛рдардХ, рд╕рдВрдХреЗрддрд┐рдд рдЪрд░рдгреЛрдВ рдХреЛ рджреЛрд╣рд░рд╛рддреЗ рд╣реБрдП, рдзреНрдпрд╛рди рджреЗрдЧрд╛ рдХрд┐ рдХрд╛рд░реНрдп рдЪрд░рдг рдореЗрдВ рдкреВрд░рд╛ рд╣реЛ рдЧрдпрд╛ рдерд╛ test, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╣рдордиреЗ рдЪрд░рдг рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ред рдЬреИрд╕рд╛ рдЖрдк рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ test рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХрджрдо рд╣реИред

рдЖрдЗрдП рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдХрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХрдВрдХрд╛рд▓ рдмрдирд╛рдирд╛ рдЬрд╛рд░реА рд░рдЦреЗрдВ:

build job:
  script:
    - echo "building..."
  tags:
    - windows
  stage: build

test and cover job:
  script:
    - echo "running tests and coverage analysis..."
  tags:
    - windows
  stage: test

pack and deploy job:
  script:
    - echo "packing and pushing to nuget..."
  tags:
    - windows
  stage: deploy

pages:
  script:
    - echo "creating docs..."
  tags:
    - windows
  stage: deploy

рд╣рдореЗрдВ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдирд╣реАрдВ рдорд┐рд▓рд╛, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рд╕рд╣реА рдкрд╛рдЗрдкрд▓рд╛рдЗрдиред

рдЯреНрд░рд┐рдЧрд░реНрд╕ рдХреА рд╕реНрдерд╛рдкрдирд╛

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

рдлрд╝рд┐рд▓реНрдЯрд░ рдХреЛ рджреЛ рд╕реНрд╡рд░реВрдкреЛрдВ рдореЗрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: рдХреЗрд╡рд▓/рдЫреЛрдбрд╝рдХрд░ ╨╕ рдирд┐рдпрдо. рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, only/except рдЖрдкрдХреЛ рдЯреНрд░рд┐рдЧрд░ рджреНрд╡рд╛рд░рд╛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ (merge_request, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП - рд╣рд░ рдмрд╛рд░ рдПрдХ рдкреБрд▓ рдЕрдиреБрд░реЛрдз рдмрдирд╛рдП рдЬрд╛рдиреЗ рдкрд░ рдХрд╛рд░реНрдп рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╣рд░ рдмрд╛рд░ рдХрдорд┐рдЯ рдЙрд╕ рд╢рд╛рдЦрд╛ рдХреЛ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдорд░реНрдЬ рдЕрдиреБрд░реЛрдз рдореЗрдВ рд╕реНрд░реЛрдд рд╣реИ) рдФрд░ рд╢рд╛рдЦрд╛ рдХреЗ рдирд╛рдо (рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕рд╣рд┐рдд); rules рдЖрдкрдХреЛ рд╢рд░реНрддреЛрдВ рдХреЗ рдПрдХ рд╕реЗрдЯ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдФрд░, рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ, рдкрд┐рдЫрд▓реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреА рд╕рдлрд▓рддрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХрд╛рд░реНрдп рдирд┐рд╖реНрдкрд╛рджрди рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдмрджрд▓ рджреЗрддрд╛ рд╣реИ (when рдЧрд┐рдЯрд▓реИрдм рд╕реАрдЖрдИ/рд╕реАрдбреА рдореЗрдВ).

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

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдПрдХ рдирд┐рдпрдо рдЬреЛрдбрд╝рдХрд░ рдХреЛрдб рдмрд┐рд▓реНрдб рдЯрд╛рд╕реНрдХ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдХреЗрд╡рд▓ рдорд░реНрдЬ рдЕрдиреБрд░реЛрдз рдкрд░ рд╕рдХреНрд░рд┐рдп рд╣реЛрддрд╛ рд╣реИ:

build job:
  # snip
  only:
    - merge_request

рдЕрдм рдкреИрдХреЗрдЬрд┐рдВрдЧ рдХрд╛рд░реНрдп рдХреЛ рдорд░реНрдЬ рдЕрдиреБрд░реЛрдз рдкрд░ рдЖрдЧ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реЗрдЯ рдХрд░реЗрдВ рдФрд░ рдорд╛рд╕реНрдЯрд░ рдХреЛ рдХрдорд┐рдЯ рдЬреЛрдбрд╝реЗрдВ:

pack and deploy job:
  # snip
  only:
    - merge_request
    - master

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рдФрд░ рд╕реАрдзрд╛ рд╣реИред

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

  rules:
    - if: $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "master"

рд╢рд░реНрддреЛрдВ рдХреЗ рддрд╣рдд, рдЖрдк рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╣рд╛рдБ рд╕реВрдЪреАрдмрджреНрдз рдЪрд░; рдирд┐рдпрдо rules рдирд┐рдпрдореЛрдВ рдХреЗ рд╕рд╛рде рдЕрд╕рдВрдЧрдд only/except.

рдЖрд░реНрдЯрд┐рдлреИрдХреНрдЯ рд╕реЗрд╡рд┐рдВрдЧ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛

рдПрдХ рдЯрд╛рд╕реНрдХ рдХреЗ рджреМрд░рд╛рди build job рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдРрд╕реА рдХрд▓рд╛рдХреГрддрд┐рдпрд╛рдБ рд╣реЛрдВрдЧреА рдЬрд┐рдирдХрд╛ рдмрд╛рдж рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдХрд╛рд░реНрдп рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рдкрде рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд╡реЗ рдлрд╝рд╛рдЗрд▓реЗрдВ рдЬрд┐рдирдХреЗ рд╕рд╛рде рдЖрдкрдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рд╕рд╣реЗрдЬрдиреЗ рдФрд░ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдХреБрдВрдЬреА рдореЗрдВ artifacts:

build job:
  # snip
  artifacts:
    paths:
      - path/to/build/artifacts
      - another/path
      - MyCoolLib.*/bin/Release/*

рдкрде рд╡рд╛рдЗрд▓реНрдбрдХрд╛рд░реНрдб рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЙрдиреНрд╣реЗрдВ рд╕реЗрдЯ рдХрд░рдирд╛ рдЖрд╕рд╛рди рдмрдирд╛рддрд╛ рд╣реИред

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

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

рд╣рдо рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓рд┐рдЦрддреЗ рд╣реИрдВ

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

dotnet build
dotnet test
dotnet pack

рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ, рдХреБрдЫ рдмрд╛рд░реАрдХрд┐рдпрд╛рдБ рд╣реИрдВ рдЬрд┐рд╕рдХреЗ рдХрд╛рд░рдг рд╣рдо рдХреБрдЫ рд╣рдж рддрдХ рдЖрдЬреНрдЮрд╛рдУрдВ рдХреЛ рдЬрдЯрд┐рд▓ рдмрдирд╛ рджреЗрдВрдЧреЗред

  1. рд╣рдо рд░рд┐рд▓реАрдЬ рдмрд┐рд▓реНрдб рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдбрд┐рдмрдЧ рдмрд┐рд▓реНрдб рдирд╣реАрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рдХрдорд╛рдВрдб рдореЗрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ -c Release
  2. рдкрд░реАрдХреНрд╖рдг рдХрд░рддреЗ рд╕рдордп, рд╣рдо рдХреЛрдб рдХрд╡рд░реЗрдЬ рдбреЗрдЯрд╛ рдПрдХрддреНрд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдореЗрдВ рдПрдХ рдХрд╡рд░реЗрдЬ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
    1. рдкреИрдХреЗрдЬ рдХреЛ рд╕рднреА рдкрд░реАрдХреНрд╖рдг рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ coverlet.msbuild: dotnet add package coverlet.msbuild рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдлрд╝реЛрд▓реНрдбрд░ рд╕реЗ
    2. рдЯреЗрд╕реНрдЯ рд░рди рдХрдорд╛рдВрдб рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ /p:CollectCoverage=true
    3. рдХрд╡рд░реЗрдЬ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рдХрд╛рд░реНрдп рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рдХреБрдВрдЬреА рдЬреЛрдбрд╝реЗрдВ (рдиреАрдЪреЗ рджреЗрдЦреЗрдВ)
  3. рдХреЛрдб рдХреЛ рдирдЧреЗрдЯ рдкреИрдХреЗрдЬ рдореЗрдВ рдкреИрдХ рдХрд░рддреЗ рд╕рдордп, рдкреИрдХреЗрдЬ рдХреЗ рд▓рд┐рдП рдЖрдЙрдЯрдкреБрдЯ рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рд╕реЗрдЯ рдХрд░реЗрдВ: -o .

рдХреЛрдб рдХрд╡рд░реЗрдЬ рдбреЗрдЯрд╛ рдПрдХрддреНрд░рд┐рдд рдХрд░рдирд╛

рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдХрд╡рд░рд▓реЗрдЯ рдкреНрд░рд┐рдВрдЯ рдХрдВрд╕реЛрд▓ рдкрд░ рдЖрдВрдХрдбрд╝реЗ рдЪрд▓рд╛рддреЗ рд╣реИрдВ:

Calculating coverage result...
  Generating report 'C:Usersxxxsourcereposmy-projectmyProject.testscoverage.json'

+-------------+--------+--------+--------+
| Module      | Line   | Branch | Method |
+-------------+--------+--------+--------+
| project 1   | 83,24% | 66,66% | 92,1%  |
+-------------+--------+--------+--------+
| project 2   | 87,5%  | 50%    | 100%   |
+-------------+--------+--------+--------+
| project 3   | 100%   | 83,33% | 100%   |
+-------------+--------+--------+--------+

+---------+--------+--------+--------+
|         | Line   | Branch | Method |
+---------+--------+--------+--------+
| Total   | 84,27% | 65,76% | 92,94% |
+---------+--------+--------+--------+
| Average | 90,24% | 66,66% | 97,36% |
+---------+--------+--------+--------+

GitLab рдЖрдкрдХреЛ рдЖрдБрдХрдбрд╝реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рддрдм рдмреИрдЬ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдХреБрдВрдЬреА рдХреЗ рд╕рд╛рде рдХрд╛рд░реНрдп рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдореЗрдВ рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╣реИ coverage; рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдореЗрдВ рдПрдХ рдХреИрдкреНрдЪрд░ рд╕рдореВрд╣ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрд┐рд╕рдХрд╛ рдорд╛рди рдмреИрдЬ рдХреЛ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:

test and cover job:
  # snip
  coverage: /|s*Totals*|s*(d+[,.]d+%)/

рдпрд╣рд╛рдВ рд╣рдо рдХреБрд▓ рд▓рд╛рдЗрди рдХрд╡рд░реЗрдЬ рд╡рд╛рд▓реА рдПрдХ рд▓рд╛рдЗрди рд╕реЗ рдЖрдВрдХрдбрд╝реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред

рдкреИрдХреЗрдЬ рдФрд░ рджрд╕реНрддрд╛рд╡реЗрдЬ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░реЗрдВ

рджреЛрдиреЛрдВ рдХреНрд░рд┐рдпрд╛рдПрдВ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХреЗ рдЕрдВрддрд┐рдо рдЪрд░рдг рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╣реИрдВ - рдЪреВрдВрдХрд┐ рдЕрд╕реЗрдВрдмрд▓реА рдФрд░ рдкрд░реАрдХреНрд╖рдг рдкрд╛рд╕ рд╣реЛ рдЪреБрдХреЗ рд╣реИрдВ, рд╣рдо рдЕрдкрдиреЗ рд╡рд┐рдХрд╛рд╕ рдХреЛ рджреБрдирд┐рдпрд╛ рдХреЗ рд╕рд╛рде рд╕рд╛рдЭрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдкрд╣рд▓реЗ, рдкреИрдХреЗрдЬ рд╕реНрд░реЛрдд рдкрд░ рдкреНрд░рдХрд╛рд╢рди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:

  1. рдпрджрд┐ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдирдЧреЗрдЯ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдирд╣реАрдВ рд╣реИ (nuget.config), рдПрдХ рдирдпрд╛ рдмрдирд╛рдПрдБ: dotnet new nugetconfig

    рдХрд┐рд╕рд▓рд┐рдП: рдЫрд╡рд┐ рдореЗрдВ рд╡реИрд╢реНрд╡рд┐рдХ (рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдФрд░ рдорд╢реАрди) рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рддрдХ рд▓рд┐рдЦрдиреЗ рдХреА рдкрд╣реБрдВрдЪ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреА рд╣реИред рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рди рдкрдХрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдХреЗрд╡рд▓ рдПрдХ рдирдпрд╛ рд╕реНрдерд╛рдиреАрдп рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред

  2. рдЖрдЗрдП рд╕реНрдерд╛рдиреАрдп рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рдПрдХ рдирдпрд╛ рдкреИрдХреЗрдЬ рд╕реНрд░реЛрдд рдЬреЛрдбрд╝реЗрдВ: nuget sources add -name <name> -source <url> -username <organization> -password <gitlab variable> -configfile nuget.config -StorePasswordInClearText
    1. name - рд╕реНрдерд╛рдиреАрдп рд╕реНрд░реЛрдд рдХрд╛ рдирд╛рдо, рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ
    2. url - "рдЦрд╛рддрд╛ рддреИрдпрд╛рд░ рдХрд░рдирд╛" рдЪрд░рдг рд╕реЗ рд╕реНрд░реЛрдд рдХрд╛ URL, рдкреГрд╖реНрда 6
    3. organization - Azure DevOps рдореЗрдВ рд╕рдВрдЧрдарди рдХрд╛ рдирд╛рдо
    4. gitlab variable - рдПрдХреНрд╕реЗрд╕ рдЯреЛрдХрди рдХреЗ рд╕рд╛рде рд╡реЗрд░рд┐рдПрдмрд▓ рдХрд╛ рдирд╛рдо GitLab ("рдЦрд╛рддрд╛ рддреИрдпрд╛рд░ рдХрд░рдирд╛", рдкреГрд╖реНрда 11) рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ред рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ, рдкреНрд░рд╛рд░реВрдк рдореЗрдВ $variableName
    5. -StorePasswordInClearText - рдкрд╣реБрдБрдЪ рдЕрд╕реНрд╡реАрдХреГрдд рддреНрд░реБрдЯрд┐ рдХреЛ рдмрд╛рдпрдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реИрдХ (рдореИрдВ рдЗрд╕ рд░реЗрдХ рдкрд░ рдХрджрдо рд░рдЦрдиреЗ рд╡рд╛рд▓рд╛ рдкрд╣рд▓рд╛ рд╡реНрдпрдХреНрддрд┐ рдирд╣реАрдВ рд╣реВрдВ)
    6. рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЬреЛрдбрд╝рдирд╛ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ -verbosity detailed
  3. рдкреИрдХреЗрдЬ рдХреЛ рд╕реНрд░реЛрдд рдкрд░ рднреЗрдЬрдирд╛: nuget push -source <name> -skipduplicate -apikey <key> *.nupkg
    1. рд╣рдо рд╡рд░реНрддрдорд╛рди рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╕реЗ рд╕рднреА рдкреИрдХреЗрдЬ рднреЗрдЬрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП *.nupkg.
    2. name - рдКрдкрд░ рдХреЗ рдЪрд░рдг рд╕реЗред
    3. key - рдХреЛрдИ рд░реЗрдЦрд╛ред Azure DevOps рдореЗрдВ, рдлрд╝реАрдб рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ рд╡рд┐рдВрдбреЛ рдореЗрдВ, рдЙрджрд╛рд╣рд░рдг рд╣рдореЗрд╢рд╛ рд░реЗрдЦрд╛ рд╣реЛрддрд╛ рд╣реИ az.
    4. -skipduplicate - рдЗрд╕ рдХреБрдВрдЬреА рдХреЗ рдмрд┐рдирд╛ рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рдкреИрдХреЗрдЬ рднреЗрдЬрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╕рдордп, рд╕реНрд░реЛрдд рдПрдХ рддреНрд░реБрдЯрд┐ рд▓реМрдЯрд╛рдПрдЧрд╛ 409 Conflict; рдХреБрдВрдЬреА рдХреЗ рд╕рд╛рде, рднреЗрдЬрдирд╛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдЕрдм рдЪрд▓рд┐рдП рдкреНрд░рд▓реЗрдЦрди рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреА рд╕реНрдерд╛рдкрдирд╛ рдХрд░рддреЗ рд╣реИрдВ:

  1. рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ, рдорд╛рд╕реНрдЯрд░ рдмреНрд░рд╛рдВрдЪ рдореЗрдВ, рд╣рдо docfx рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд░реВрдЯ рд╕реЗ рдХрдорд╛рдВрдб рдЪрд▓рд╛рдПрдБ docfx init рдФрд░ рдкреНрд░рд▓реЗрдЦрди рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рдкреНрд░рдореБрдЦ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдЕрдВрддрдГрдХреНрд░рд┐рдпрд╛рддреНрдордХ рд░реВрдк рд╕реЗ рд╕реЗрдЯ рдХрд░реЗрдВред рдиреНрдпреВрдирддрдо рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реЗрдЯрдЕрдк рдХрд╛ рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╡рд░рдг рдпрд╣рд╛рдВ.
    1. рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рддреЗ рд╕рдордп, рдЖрдЙрдЯрдкреБрдЯ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ ..public - GitLab рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдлрд╝реЛрд▓реНрдбрд░ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЗ рд░реВрдЯ рдореЗрдВ рдкреЗрдЬ рдХреЗ рд╕реНрд░реЛрдд рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрддрд╛ рд╣реИред рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдиреЗрд╕реНрдЯреЗрдб рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реЛрдЧрд╛ - рдкрде рдореЗрдВ рдКрдкрд░ рдХреЗ рд╕реНрддрд░ рдкрд░ рдПрдХ рдЖрдЙрдЯрдкреБрдЯ рдЬреЛрдбрд╝реЗрдВред
  2. рдЖрдЗрдП рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ GitLab рдореЗрдВ рдЖрдЧреЗ рдмрдврд╝рд╛рддреЗ рд╣реИрдВред
  3. рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рдХреЛрдИ рдХрд╛рд░реНрдп рдЬреЛрдбрд╝реЗрдВ pages (GitLab рдкреЗрдЬреЛрдВ рдореЗрдВ рд╕рд╛рдЗрдЯ рдкреНрд░рдХрд╛рд╢рди рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЖрд░рдХреНрд╖рд┐рдд рд╢рдмреНрдж):
    1. рд▓рд┐рдЦреА рд╣реБрдИ рдХрд╣рд╛рдиреА:
      1. nuget install docfx.console -version 2.51.0 - рдбреЙрдХрдПрдлрдПрдХреНрд╕ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ; рд╕рдВрд╕реНрдХрд░рдг рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдкреИрдХреЗрдЬ рд╕реНрдерд╛рдкрдирд╛ рдкрде рд╕рд╣реА рд╣реИрдВред
      2. .docfx.console.2.51.0toolsdocfx.exe .docfx_projectdocfx.json - рджрд╕реНрддрд╛рд╡реЗрдЬ рдПрдХрддреНрд░рд┐рдд рдХрд░рдирд╛
    2. рдиреЛрдб рдХрд▓рд╛рдХреГрддрд┐рдпрд╛рдБ:

pages:
  # snip
  artifacts:
    paths:
      - public

Docfx рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЧреАрддрд╛рддреНрдордХ рд╡рд┐рд╖рдпрд╛рдВрддрд░

рдкрд╣рд▓реЗ, рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рд╕реНрдерд╛рдкрдирд╛ рдХрд░рддреЗ рд╕рдордп, рдореИрдВрдиреЗ рд╕рдорд╛рдзрд╛рди рдлрд╝рд╛рдЗрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд▓реЗрдЦрди рдХреЗ рд▓рд┐рдП рдХреЛрдб рд╕реНрд░реЛрдд рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдерд╛ред рдореБрдЦреНрдп рдиреБрдХрд╕рд╛рди рдпрд╣ рд╣реИ рдХрд┐ рдкрд░реАрдХреНрд╖рдг рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рд▓реЗрдЦрди рднреА рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ, рддреЛ рдЖрдк рдЗрд╕ рдорд╛рди рдХреЛ рдиреЛрдб рдкрд░ рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ metadata.src:

{
  "metadata": [
    {
      "src": [
        {
          "src": "../",
          "files": [
            "**/*.csproj"
          ],
          "exclude":[
            "*.tests*/**"
          ]
        }
      ],
      // --- snip ---
    },
    // --- snip ---
  ],
  // --- snip ---
}

  1. metadata.src.src: "../" - рд╣рдо рд╕реНрдерд╛рди рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдПрдХ рд╕реНрддрд░ рдКрдкрд░ рдЬрд╛рддреЗ рд╣реИрдВ docfx.json, рдХреНрдпреЛрдВрдХрд┐ рдкреИрдЯрд░реНрди рдореЗрдВ, рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдЯреНрд░реА рдХреЛ рдЦреЛрдЬрдирд╛ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред
  2. metadata.src.files: ["**/*.csproj"] - рдПрдХ рд╡реИрд╢реНрд╡рд┐рдХ рдкреИрдЯрд░реНрди, рд╣рдо рд╕рднреА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдУрдВ рд╕реЗ рд╕рднреА C # рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдПрдХрддреНрд░ рдХрд░рддреЗ рд╣реИрдВред
  3. metadata.src.exclude: ["*.tests*/**"] - рд╡реИрд╢реНрд╡рд┐рдХ рдкреИрдЯрд░реНрди, рдлрд╝реЛрд▓реНрдбрд░ рд╕реЗ рд╕рдм рдХреБрдЫ рдмрд╛рд╣рд░ рдХрд░реЗрдВ .tests рдирд╛рдо рдореЗрдВ

рдЙрдк-рдпреЛрдЧ

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

рдЕрдВрддрд┐рдо .gitlab-ci.yml

image: mcr.microsoft.com/dotnet/core/sdk:3.1

before_script:
  - $PSVersionTable.PSVersion
  - dotnet --version
  - nuget help | select-string Version

stages:
  - build
  - test
  - deploy

build job:
  stage: build
  script:
    - dotnet build -c Release
  tags:
    - windows
  only:
    - merge_requests
    - master
  artifacts:
    paths:
      - your/path/to/binaries

test and cover job:
  stage: test
  tags:
    - windows
  script:
    - dotnet test -c Release /p:CollectCoverage=true
  coverage: /|s*Totals*|s*(d+[,.]d+%)/
  only:
    - merge_requests
    - master

pack and deploy job:
  stage: deploy
  tags:
    - windows
  script:
    - dotnet pack -c Release -o .
    - dotnet new nugetconfig
    - nuget sources add -name feedName -source https://pkgs.dev.azure.com/your-organization/_packaging/your-feed/nuget/v3/index.json -username your-organization -password $nugetFeedToken -configfile nuget.config -StorePasswordInClearText
    - nuget push -source feedName -skipduplicate -apikey az *.nupkg
  only:
    - master

pages:
  tags:
    - windows
  stage: deploy
  script:
    - nuget install docfx.console -version 2.51.0
    - $env:path = "$env:path;$($(get-location).Path)"
    - .docfx.console.2.51.0toolsdocfx.exe .docfxdocfx.json
  artifacts:
    paths:
      - public
  only:
    - master

рдмреИрдЬ рдХреА рдмрд╛рдд рд╣реЛ рд░рд╣реА рд╣реИ

рдЙрдиреНрд╣реАрдВ рдХреА рд╡рдЬрд╣ рд╕реЗ рдЖрдЦрд┐рд░ рд╕рдм рдХреБрдЫ рд╢реБрд░реВ рд╣реБрдЖ!

Gtntral рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдмреНрд▓реЙрдХ рдореЗрдВ CI/CD рд╕реЗрдЯрд┐рдВрдЧ рдореЗрдВ GitLab рдореЗрдВ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рд╕реНрдерд┐рддрд┐ рдФрд░ рдХреЛрдб рдХрд╡рд░реЗрдЬ рд╡рд╛рд▓реЗ рдмреИрдЬ рдЙрдкрд▓рдмреНрдз рд╣реИрдВ:

рдЧрд┐рдЯрд▓реИрдм рдореЗрдВ рд╕реАрдЖрдИ/рд╕реАрдбреА рдХреЗ рд▓рд┐рдП рдПрдХ рдЧрд╛рдЗрдб (рд▓рдЧрднрдЧ) рдирд┐рд░рдкреЗрдХреНрд╖ рд╢реБрд░реБрдЖрддреА рдХреЗ рд▓рд┐рдП

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

![╨Я╤А╨╕╨╝╨╡╤А ╤Б Shields.io](https://img.shields.io/badge/custom-badge-blue)

рдЧрд┐рдЯрд▓реИрдм рдореЗрдВ рд╕реАрдЖрдИ/рд╕реАрдбреА рдХреЗ рд▓рд┐рдП рдПрдХ рдЧрд╛рдЗрдб (рд▓рдЧрднрдЧ) рдирд┐рд░рдкреЗрдХреНрд╖ рд╢реБрд░реБрдЖрддреА рдХреЗ рд▓рд┐рдП

Azure DevOps рдХрд▓рд╛рдХреГрддрд┐рдпрд╛рдБ рдЖрдкрдХреЛ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рд╡рд╛рд▓реЗ рдкреИрдХреЗрдЬреЛрдВ рдХреЗ рд▓рд┐рдП рдмреИрдЬ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рднреА рджреЗрддреА рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, Azure DevOps рд╕рд╛рдЗрдЯ рдкрд░ рд╕реНрд░реЛрдд рдореЗрдВ, рдЖрдкрдХреЛ рдЪрдпрдирд┐рдд рдкреИрдХреЗрдЬ рдХреЗ рд▓рд┐рдП рдХреНрд░рд┐рдПрдЯ рдмреИрдЬ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдорд╛рд░реНрдХрдбрд╛рдЙрди рдорд╛рд░реНрдХрдЕрдк рдХреЛ рдХреЙрдкреА рдХрд░рдирд╛ рд╣реЛрдЧрд╛:

рдЧрд┐рдЯрд▓реИрдм рдореЗрдВ рд╕реАрдЖрдИ/рд╕реАрдбреА рдХреЗ рд▓рд┐рдП рдПрдХ рдЧрд╛рдЗрдб (рд▓рдЧрднрдЧ) рдирд┐рд░рдкреЗрдХреНрд╖ рд╢реБрд░реБрдЖрддреА рдХреЗ рд▓рд┐рдП

рдЧрд┐рдЯрд▓реИрдм рдореЗрдВ рд╕реАрдЖрдИ/рд╕реАрдбреА рдХреЗ рд▓рд┐рдП рдПрдХ рдЧрд╛рдЗрдб (рд▓рдЧрднрдЧ) рдирд┐рд░рдкреЗрдХреНрд╖ рд╢реБрд░реБрдЖрддреА рдХреЗ рд▓рд┐рдП

рд╕реБрдВрджрд░рддрд╛ рдЬреЛрдбрд╝рдирд╛

рд╕рд╛рдорд╛рдиреНрдп рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝реНрд░реИрдЧрдореЗрдВрдЯ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд░рдирд╛

рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд▓рд┐рдЦрддреЗ рд╕рдордп рдФрд░ рдкреНрд░рд▓реЗрдЦрди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЦреЛрдЬ рдХрд░рддреЗ рд╕рдордп, рдореБрдЭреЗ YAML рдХреА рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рд╡рд┐рд╢реЗрд╖рддрд╛ рдорд┐рд▓реА - рдЯреБрдХрдбрд╝реЛрдВ рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдХрд╛рд░реНрдп рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрди рд╕рднреА рдХреЛ рдЯреИрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ windows рдзрд╛рд╡рдХ рдкрд░, рдФрд░ рдЯреНрд░рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдорд░реНрдЬ рдЕрдиреБрд░реЛрдз рдорд╛рд╕реНрдЯрд░/рдирд┐рд░реНрдорд┐рдд (рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЛ рдЫреЛрдбрд╝рдХрд░) рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЖрдЗрдП рдЗрд╕реЗ рдЙрд╕ рдЯреБрдХрдбрд╝реЗ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ рдЬрд┐рд╕рдХрд╛ рд╣рдо рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ:

.common_tags: &common_tags
  tags:
    - windows
.common_only: &common_only
  only:
    - merge_requests
    - master

рдФрд░ рдЕрдм рд╣рдо рдХрд╛рд░реНрдп рд╡рд┐рд╡рд░рдг рдореЗрдВ рдкрд╣рд▓реЗ рдШреЛрд╖рд┐рдд рдХрд┐рдП рдЧрдП рдЯреБрдХрдбрд╝реЗ рдХреЛ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

build job:
  <<: *common_tags
  <<: *common_only

рдлрд╝реНрд░реИрдЧрдореЗрдВрдЯ рдХреЗ рдирд╛рдо рдбреЙрдЯ рд╕реЗ рд╢реБрд░реВ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП, рддрд╛рдХрд┐ рдЗрд╕реЗ рдХрд┐рд╕реА рдХрд╛рд░реНрдп рдХреЗ рд░реВрдк рдореЗрдВ рди рд╕рдордЭрд╛ рдЬрд╛рдПред

рдкреИрдХреЗрдЬ рд╡рд░реНрдЬрдирд┐рдВрдЧ

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

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

рдЖрдЗрдП рд╕рд╣рдордд рд╣реИрдВ рдХрд┐ рдЕрдЧрд░ рдкреНрд░рддрд┐рдмрджреНрдз рд╕рдВрджреЗрд╢ рдореЗрдВ рдПрдХ рдкрдВрдХреНрддрд┐ рд╣реИ release (v./ver./version) <version number> (rev./revision <revision>)?, рдлрд┐рд░ рд╣рдо рдЗрд╕ рд▓рд╛рдЗрди рд╕реЗ рдкреИрдХреЗрдЬ рдХрд╛ рд╕рдВрд╕реНрдХрд░рдг рд▓реЗрдВрдЧреЗ, рдЗрд╕реЗ рд╡рд░реНрддрдорд╛рди рддрд┐рдерд┐ рдХреЗ рд╕рд╛рде рдкреВрд░рдХ рдХрд░реЗрдВрдЧреЗ рдФрд░ рдЗрд╕реЗ рдХрдорд╛рдВрдб рдХреЗ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд╕ рдХрд░реЗрдВрдЧреЗ dotnet pack. рд▓рд╛рдЗрди рдХреЗ рдЕрднрд╛рд╡ рдореЗрдВ, рд╣рдо рдмрд╕ рдкреИрдХреЗрдЬ рдПрдХрддреНрд░ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред

рдирд┐рдореНрди рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рддреА рд╣реИ:

# ╤А╨╡╨│╤Г╨╗╤П╤А╨╜╨╛╨╡ ╨▓╤Л╤А╨░╨╢╨╡╨╜╨╕╨╡ ╨┤╨╗╤П ╨┐╨╛╨╕╤Б╨║╨░ ╤Б╤В╤А╨╛╨║╨╕ ╤Б ╨▓╨╡╤А╤Б╨╕╨╡╨╣
$rx = "releases+(v.?|ver.?|version)s*(?<maj>d+)(?<min>.d+)?(?<rel>.d+)?s*((rev.?|revision)?s+(?<rev>[a-zA-Z0-9-_]+))?"
# ╨╕╤Й╨╡╨╝ ╤Б╤В╤А╨╛╨║╤Г ╨▓ ╤Б╨╛╨╛╨▒╤Й╨╡╨╜╨╕╨╕ ╨║╨╛╨╝╨╝╨╕╤В╨░, ╨┐╨╡╤А╨╡╨┤╨░╨▓╨░╨╡╨╝╨╛╨╝ ╨▓ ╨╛╨┤╨╜╨╛╨╣ ╨╕╨╖ ╨┐╤А╨╡╨┤╨╛╨┐╤А╨╡╨┤╨╡╨╗╤П╨╡╨╝╤Л╤Е GitLab'╨╛╨╝ ╨┐╨╡╤А╨╡╨╝╨╡╨╜╨╜╤Л╤Е
$found = $env:CI_COMMIT_MESSAGE -match $rx
# ╤Б╨╛╨▓╨┐╨░╨┤╨╡╨╜╨╕╨╣ ╨╜╨╡╤В - ╨▓╤Л╤Е╨╛╨┤╨╕╨╝
if (!$found) { Write-Output "no release info found, aborting"; exit }
# ╨╕╨╖╨▓╨╗╨╡╨║╨░╨╡╨╝ ╨╝╨░╨╢╨╛╤А╨╜╤Г╤О ╨╕ ╨╝╨╕╨╜╨╛╤А╨╜╤Г╤О ╨▓╨╡╤А╤Б╨╕╨╕
$maj = $matches['maj']
$min = $matches['min']
# ╨╡╤Б╨╗╨╕ ╤Б╤В╤А╨╛╨║╨░ ╤Б╨╛╨┤╨╡╤А╨╢╨╕╤В ╨╜╨╛╨╝╨╡╤А ╤А╨╡╨╗╨╕╨╖╨░ - ╨╕╤Б╨┐╨╛╨╗╤М╨╖╤Г╨╡╨╝ ╨╡╨│╨╛, ╨╕╨╜╨░╤З╨╡ - ╤В╨╡╨║╤Г╤Й╨╕╨╣ ╨│╨╛╨┤
if ($matches.ContainsKey('rel')) { $rel = $matches['rel'] } else { $rel = ".$(get-date -format "yyyy")" }
# ╨▓ ╨║╨░╤З╨╡╤Б╤В╨▓╨╡ ╨╜╨╛╨╝╨╡╤А╨░ ╤Б╨▒╨╛╤А╨║╨╕ - ╤В╨╡╨║╤Г╤Й╨╕╨╡ ╨╝╨╡╤Б╤П╤Ж ╨╕ ╨┤╨╡╨╜╤М
$bld = $(get-date -format "MMdd")
# ╨╡╤Б╨╗╨╕ ╨╡╤Б╤В╤М ╨┤╨░╨╜╨╜╤Л╨╡ ╨┐╨╛ ╨┐╤А╨╡╤А╨╡╨╗╨╕╨╖╨╜╨╛╨╣ ╨▓╨╡╤А╤Б╨╕╨╕ - ╨▓╨║╨╗╤О╤З╨░╨╡╨╝ ╨╕╤Е ╨▓ ╨▓╨╡╤А╤Б╨╕╤О
if ($matches.ContainsKey('rev')) { $rev = "-$($matches['rev'])" } else { $rev = '' }
# ╤Б╨╛╨▒╨╕╤А╨░╨╡╨╝ ╨╡╨┤╨╕╨╜╤Г╤О ╤Б╤В╤А╨╛╨║╤Г ╨▓╨╡╤А╤Б╨╕╨╕
$version = "$maj$min$rel.$bld$rev"
# ╤Б╨╛╨▒╨╕╤А╨░╨╡╨╝ ╨┐╨░╨║╨╡╤В╤Л
dotnet pack -c Release -o . /p:Version=$version

рдХрд┐рд╕реА рдХрд╛рд░реНрдп рдореЗрдВ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЬреЛрдбрд╝рдирд╛ pack and deploy job рдФрд░ рдкреНрд░рддрд┐рдмрджреНрдз рд╕рдВрджреЗрд╢ рдореЗрдВ рджрд┐рдП рдЧрдП рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдореЗрдВ рдкреИрдХреЗрдЬреЛрдВ рдХреА рдЕрд╕реЗрдВрдмрд▓реА рдХрд╛ рд╕рдЦреНрддреА рд╕реЗ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░реЗрдВред

рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░

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

рдмреЗрд╢рдХ, GitLab CI / CD рдЗрд╕ рдЧрд╛рдЗрдб рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рдмрд╛рдж рдЬрд┐рддрдирд╛ рд▓рдЧрддрд╛ рд╣реИ рдЙрд╕рд╕реЗ рдХрд╣реАрдВ рдЕрдзрд┐рдХ рд╡реНрдпрд╛рдкрдХ рдФрд░ рдмрд╣реБрдореБрдЦреА рд╣реИ - рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЧрд▓рдд рд╣реИ. рд╡рд╣рд╛рдБ рднреА рдСрдЯреЛ DevOps рд╣реИрдХреА рдЗрдЬрд╛рдЬрдд рджреА

рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЖрдкрдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рддрд╛ рд╣реИ, рдмрдирд╛рддрд╛ рд╣реИ, рдкрд░реАрдХреНрд╖рдг рдХрд░рддрд╛ рд╣реИ, рддреИрдирд╛рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдирд┐рдЧрд░рд╛рдиреА рдХрд░рддрд╛ рд╣реИ

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

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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╝реЗрдВ