(рд▓рдЧрднрдЧ) рдкреВрд░реНрдг рд╢реБрд░реБрд╡рд╛рддрдХрд░реНрддрд╛рдХреЛ рд▓рд╛рдЧрд┐ GitLab рдорд╛ CI/CD рдХреЛ рд▓рд╛рдЧрд┐ рдЧрд╛рдЗрдб

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

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

(рд▓рдЧрднрдЧ) рдкреВрд░реНрдг рд╢реБрд░реБрд╡рд╛рддрдХрд░реНрддрд╛рдХреЛ рд▓рд╛рдЧрд┐ GitLab рдорд╛ CI/CD рдХреЛ рд▓рд╛рдЧрд┐ рдЧрд╛рдЗрдб

рдпрд╕ рд▓реЗрдЦрд▓реЗ GitLab рдорд╛ .Net Core рдХрдХреНрд╖рд╛рдХреЛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдкрд░рд┐рдпреЛрдЬрдирд╛рдХреЛ рд▓рд╛рдЧрд┐ рдирд┐рд░рдиреНрддрд░ рдПрдХреАрдХрд░рдг рд░ рдбреЗрд▓рд┐рднрд░реАрдХреЛ рдЖрдзрд╛рд░рднреВрдд рд╕реЗрдЯрдЕрдк, GitLab рдкреГрд╖реНрдард╣рд░реВрдорд╛ рдХрд╛рдЧрдЬрд╛рддрд╣рд░реВ рдкреНрд░рдХрд╛рд╢рди рдЧрд░реНрдиреЗ рд░ Azure DevOps рдорд╛ рдирд┐рдЬреА рдлрд┐рдбрдорд╛ рд╕рдЩреНрдХрд▓рди рдЧрд░рд┐рдПрдХрд╛ рдкреНрдпрд╛рдХреЗрдЬрд╣рд░реВ рдкрдард╛рдЙрдиреЗ рдЖрдзрд╛рд░рднреВрдд рд╕реЗрдЯрдЕрдкрд▓рд╛рдИ рд╕рдореЗрдЯреНрдиреЗрдЫред

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

рдЫреЛрдЯреЛ рдкрд░рд┐рдЪрдп

рд╕реАрдбреА рд╣реЛ рдЬрдм рддрдкрд╛рдЗрдБ рднрд░реНрдЦрд░реИ рдзрдХреЗрд▓реНрдиреБ рднрдпреЛ, рддрд░ рдЧреНрд░рд╛рд╣рдХ рдкрд╣рд┐рд▓реЗ рдиреИ рд╕рдмреИ рдЧреБрдорд╛рдЗрд╕рдХреЗрдХреЛ рдЫ?

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

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

рдпрд╕рд░реА рд╣рд╛рдореАрд╕рдБрдЧ рдЫ:

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

рддрджрдиреБрд╕рд╛рд░, CI/CD рд╕реЗрдЯрдЕрдк рдЧрд░реНрджрд╛ рдХрд╛рд░реНрдпрд╣рд░реВ рд╕рдВрдпреЛрдЬрди, рдкрд░реАрдХреНрд╖рдг рд░ рдкреНрд░рдХрд╛рд╢рди рдХреЛрдб рд░ рдХрд▓рд╛рдХреГрддрд┐рд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рд╕рдмреИ рдЖрд╡рд╢реНрдпрдХ рдХрд╛рд░реНрдпрд╣рд░реВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЧрд░реНрдиреЗ рдХрд╛рд░реНрдпрд╣рд░реВрдХреЛ рд╕реЗрдЯ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрди рддрд▓ рдЖрдЙрдБрдЫред

рд╣рд╛рдореАрд▓реЗ рд╕реБрд░реБ рдЧрд░реНрдиреБ рдЕрдШрд┐: рдХрд┐рди?

  • рдХрд┐рди GitLab?

рдХрд┐рдирднрдиреЗ рдЬрдм рдШрд░рдкрд╛рд▓реБрд╡рд╛ рдЬрдирд╛рд╡рд░ рдкрд░рд┐рдпреЛрдЬрдирд╛рд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рдирд┐рдЬреА рднрдгреНрдбрд╛рд░рд╣рд░реВ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рднрдпреЛ, рддрд┐рдиреАрд╣рд░реВ GitHub рдорд╛ рднреБрдХреНрддрд╛рдиреА рдЧрд░рд┐рдпреЛ, рд░ рдо рд▓реЛрднреА рдерд┐рдПрдБред рднрдгреНрдбрд╛рд░рд╣рд░реВ рдирд┐: рд╢реБрд▓реНрдХ рднрдПрдХрд╛ рдЫрдиреН, рддрд░ рдЕрд╣рд┐рд▓реЗрдХреЛ рд▓рд╛рдЧрд┐ рдпреЛ рдореЗрд░реЛ рд▓рд╛рдЧрд┐ GitHub рдорд╛ рдЬрд╛рдирдХреЛ рд▓рд╛рдЧрд┐ рдкрд░реНрдпрд╛рдкреНрдд рдХрд╛рд░рдг рд╣реЛрдЗрдиред

  • рдХрд┐рди Azure DevOps рдкрд╛рдЗрдкрд▓рд╛рдЗрдирд╣рд░реВ рдЫреИрдирдиреН?

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

рд╕реБрд░реВрд╡рд╛рдд рд╕реНрдерд┐рддрд┐: рддрдкрд╛рдИрд╕рдБрдЧ рдХреЗ рдЫ рд░ рддрдкрд╛рдИ рдХреЗ рдЪрд╛рд╣рдиреБрд╣реБрдиреНрдЫ

рд╣рд╛рдореА рд╕рдВрдЧ рдЫ:

  • GitLab рдорд╛ рднрдгреНрдбрд╛рд░ред

рд╣рд╛рдореА рдЪрд╛рд╣рдиреНрдЫреМрдВ:

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

рд╡рд░реНрдгрд┐рдд рдЖрд╡рд╢реНрдпрдХрддрд╛рд╣рд░реВ рдирд┐рдореНрди рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдореЛрдбреЗрд▓рдорд╛ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдкрдорд╛ рдлрд┐рдЯ рд╣реБрдиреНрдЫрдиреН:

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

рд╕реБрд░реБ рдЧрд░реМрдВ!

рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рди рдПрд╕реЗрдореНрдмрд▓ рдЧрд░реНрджреИ

рдЦрд╛рддрд╛рд╣рд░реВ рддрдпрд╛рд░ рдЧрд░реНрджреИ

  1. рдорд╛ рдЦрд╛рддрд╛ рдмрдирд╛рдЙрдиреБрд╣реЛрд╕реН рдорд╛рдЗрдХреНрд░реЛрд╕рдлреНрдЯ рдЯреНрдпрд╛рдмрдиреЗрддреГрддреНрд╡

  2. рдЬрд╛рдК рддреНрдпрд╣рд╛рдБ Azure DevOps

  3. рдирдпрд╛рдБ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреБрд╣реЛрд╕реН

    1. рдирд╛рдо - рдХреБрдиреИ рдкрдирд┐
    2. рджреГрд╢реНрдпрддрд╛ - рдХреБрдиреИ рдкрдирд┐
      (рд▓рдЧрднрдЧ) рдкреВрд░реНрдг рд╢реБрд░реБрд╡рд╛рддрдХрд░реНрддрд╛рдХреЛ рд▓рд╛рдЧрд┐ GitLab рдорд╛ CI/CD рдХреЛ рд▓рд╛рдЧрд┐ рдЧрд╛рдЗрдб

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

  5. Atrifacts рдорд╛ рдЬрд╛рдиреБрд╣реЛрд╕реН, рдлрд┐рдб рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреБрд╣реЛрд╕реН рдХреНрд▓рд┐рдХ рдЧрд░реНрдиреБрд╣реЛрд╕реН

    1. рд╕реНрд░реЛрдд рдирд╛рдо рдкреНрд░рд╡рд┐рд╖реНрдЯ рдЧрд░реНрдиреБрд╣реЛрд╕реН
    2. рджреГрд╢реНрдпрддрд╛ рдЪрдпрди рдЧрд░реНрдиреБрд╣реЛрд╕реН
    3. рдмрд╛рдХрд╕ рдЕрдирдЪреЗрдХ рдЧрд░реНрдиреБрд╣реЛрд╕реН рд╕рд╛рдЭрд╛ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕реНрд░реЛрддрд╣рд░реВрдмрд╛рдЯ рдкреНрдпрд╛рдХреЗрдЬрд╣рд░реВ рд╕рдорд╛рд╡реЗрд╢ рдЧрд░реНрдиреБрд╣реЛрд╕реНрддрд╛рдХрд┐ рд╕реНрд░реЛрдд рдиреНрдпреБрдЧреЗрдЯ рдХреНрд▓реЛрдирдХреЛ рдлреЛрд╣реЛрд░ рдбрдореНрдкрдорд╛ рдкрд░рд┐рдгрдд рдирд╣реЛрд╕реН
      (рд▓рдЧрднрдЧ) рдкреВрд░реНрдг рд╢реБрд░реБрд╡рд╛рддрдХрд░реНрддрд╛рдХреЛ рд▓рд╛рдЧрд┐ GitLab рдорд╛ CI/CD рдХреЛ рд▓рд╛рдЧрд┐ рдЧрд╛рдЗрдб

  6. рдлрд┐рдбрдорд╛ рдЬрдбрд╛рди рдЧрд░реНрдиреБрд╣реЛрд╕реН рдХреНрд▓рд┐рдХ рдЧрд░реНрдиреБрд╣реЛрд╕реН, рднрд┐рдЬреБрдЕрд▓ рд╕реНрдЯреБрдбрд┐рдпреЛ рдЪрдпрди рдЧрд░реНрдиреБрд╣реЛрд╕реН, рдореЗрд╕рд┐рди рд╕реЗрдЯрдЕрдк рдмреНрд▓рдХрдмрд╛рдЯ рд╕реНрд░реЛрдд рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдЧрд░реНрдиреБрд╣реЛрд╕реН
    (рд▓рдЧрднрдЧ) рдкреВрд░реНрдг рд╢реБрд░реБрд╡рд╛рддрдХрд░реНрддрд╛рдХреЛ рд▓рд╛рдЧрд┐ GitLab рдорд╛ CI/CD рдХреЛ рд▓рд╛рдЧрд┐ рдЧрд╛рдЗрдб

  7. рдЦрд╛рддрд╛ рд╕реЗрдЯрд┐рдЩрд╣рд░реВрдорд╛ рдЬрд╛рдиреБрд╣реЛрд╕реН, рд╡реНрдпрдХреНрддрд┐рдЧрдд рдкрд╣реБрдБрдЪ рдЯреЛрдХрди рдЪрдпрди рдЧрд░реНрдиреБрд╣реЛрд╕реН
    (рд▓рдЧрднрдЧ) рдкреВрд░реНрдг рд╢реБрд░реБрд╡рд╛рддрдХрд░реНрддрд╛рдХреЛ рд▓рд╛рдЧрд┐ GitLab рдорд╛ CI/CD рдХреЛ рд▓рд╛рдЧрд┐ рдЧрд╛рдЗрдб

  8. рдирдпрд╛рдБ рдкрд╣реБрдБрдЪ рдЯреЛрдХрди рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреБрд╣реЛрд╕реН

    1. рдирд╛рдо - рдордирдорд╛рдиреА
    2. рд╕рдВрдЧрдарди - рд╡рд░реНрддрдорд╛рди
    3. рд╡реИрдзрддрд╛ рдЕрд╡рдзрд┐: рдЕрдзрд┐рдХрддрдо 1 рд╡рд░реНрд╖
    4. рд╕реНрдХреЛрдк - рдкреНрдпрд╛рдХреЗрдЬрд┐рдЩ/рдкрдвреНрдиреБрд╣реЛрд╕реН рд░ рд▓реЗрдЦреНрдиреБрд╣реЛрд╕реН
      (рд▓рдЧрднрдЧ) рдкреВрд░реНрдг рд╢реБрд░реБрд╡рд╛рддрдХрд░реНрддрд╛рдХреЛ рд▓рд╛рдЧрд┐ GitLab рдорд╛ CI/CD рдХреЛ рд▓рд╛рдЧрд┐ рдЧрд╛рдЗрдб

  9. рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░рд┐рдПрдХреЛ рдЯреЛрдХрди рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдЧрд░реНрдиреБрд╣реЛрд╕реН - рдореЛрдбрд▓ рд╕рдЮреНрдЭреНрдпрд╛рд▓ рдмрдиреНрдж рдЧрд░реЗрдкрдЫрд┐ рдорд╛рди рдЙрдкрд▓рдмреНрдз рд╣реБрдиреЗрдЫреИрди

  10. GitLab рдорд╛ рднрдгреНрдбрд╛рд░ рд╕реЗрдЯрд┐рдЩрд╣рд░реВрдорд╛ рдЬрд╛рдиреБрд╣реЛрд╕реН, CI/CD рд╕реЗрдЯрд┐рдЩрд╣рд░реВ рдЪрдпрди рдЧрд░реНрдиреБрд╣реЛрд╕реН
    (рд▓рдЧрднрдЧ) рдкреВрд░реНрдг рд╢реБрд░реБрд╡рд╛рддрдХрд░реНрддрд╛рдХреЛ рд▓рд╛рдЧрд┐ GitLab рдорд╛ CI/CD рдХреЛ рд▓рд╛рдЧрд┐ рдЧрд╛рдЗрдб

  11. рдЪрд░ рдмреНрд▓рдХ рд╡рд┐рд╕реНрддрд╛рд░ рдЧрд░реНрдиреБрд╣реЛрд╕реН рд░ рдирдпрд╛рдБ рдердкреНрдиреБрд╣реЛрд╕реН

    1. рдирд╛рдо - рдХреБрдиреИ рдкрдирд┐ рдЦрд╛рд▓реА рдард╛рдЙрдБ рдмрд┐рдирд╛ (рдХрдорд╛рдгреНрдб рд╢реЗрд▓рдорд╛ рдЙрдкрд▓рдмреНрдз рд╣реБрдиреЗрдЫ)
    2. рдорд╛рди рдЪрд░рдг 9 рдмрд╛рдЯ рдкрд╣реБрдБрдЪ рдЯреЛрдХрди рд╣реЛ
    3. рдорд╛рд╕реНрдХ рдЪрд░ рдЪрдпрди рдЧрд░реНрдиреБрд╣реЛрд╕реН
      (рд▓рдЧрднрдЧ) рдкреВрд░реНрдг рд╢реБрд░реБрд╡рд╛рддрдХрд░реНрддрд╛рдХреЛ рд▓рд╛рдЧрд┐ GitLab рдорд╛ CI/CD рдХреЛ рд▓рд╛рдЧрд┐ рдЧрд╛рдЗрдб

рдпрд╕рд▓реЗ рдкреНрд░рд╛рд░рдореНрднрд┐рдХ рд╕реЗрдЯрдЕрдк рдкреВрд░рд╛ рдЧрд░реНрджрдЫред

рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рди рдлреНрд░реЗрдорд╡рд░реНрдХ рддрдпрд╛рд░ рдЧрд░реНрджреИ

рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд░реВрдкрдорд╛, 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ред WTF?

рд╕рдмреИ рдХреБрд░рд╛ рддрд╛рд░реНрдХрд┐рдХ рдЫ - рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд░реВрдкрдорд╛, рдзрд╛рд╡рдХрд╣рд░реВ (рдХрд╛рд░реНрдп рд╕реНрдХреНрд░рд┐рдкреНрдЯрд╣рд░реВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЧрд░реНрди рдЬрд┐рдореНрдореЗрд╡рд╛рд░ рд░ 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 GitLab CI/CD рдорд╛).

рдЖрд╡рд╢реНрдпрдХрддрд╛рд╣рд░реВрдХреЛ рд╕реЗрдЯ рдпрд╛рдж рдЧрд░реМрдВ - рдорд░реНрдЬ рдЕрдиреБрд░реЛрдзрд╣рд░реВ, рдкреНрдпрд╛рдХреЗрдЬрд┐рдЩ рд░ 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/*

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

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

рдЕрдм рдЬрдм рд╣рд╛рдореАрд╕рдБрдЧ рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рди рдлреНрд░реЗрдорд╡рд░реНрдХ рддрдпрд╛рд░ рдЫ (рд░ рдкреНрд░рдорд╛рдгрд┐рдд), рд╣рд╛рдореА рд╡рд╛рд╕реНрддрд╡рдорд╛ рдХрд╛рд░реНрдпрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рд╕реНрдХреНрд░рд┐рдкреНрдЯрд╣рд░реВ рд▓реЗрдЦреНрди рдЬрд╛рди рд╕рдХреНрдЫреМрдВред

рд╣рд╛рдореА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓реЗрдЦреНрдЫреМрдВ

рд╕рд╛рдпрдж, рдПрдХ рдкрдЯрдХ, рдПрдХ рдЧреНрдпрд╛рд▓реЗрдХреНрд╕реАрдорд╛ рдЯрд╛рдврд╛, рдЯрд╛рдврд╛, рдХрдорд╛рдгреНрдб рд▓рд╛рдЗрдирдмрд╛рдЯ рдкрд░рд┐рдпреЛрдЬрдирд╛рд╣рд░реВ (.net рд╕рд╣рд┐рдд) рдирд┐рд░реНрдорд╛рдг рдЧрд░реНрдиреБ рдкреАрдбрд╛ рдерд┐рдпреЛред рдЕрдм рддрдкрд╛рдЗрдБ 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 рдорд╛ рдердкрд┐рдПрдХреЛ рдкрд╣реБрдБрдЪ рдЯреЛрдХрдирдХреЛ рд╕рд╛рде рдЪрд▓рдХреЛ рдирд╛рдо (тАЬрдЦрд╛рддрд╛рд╣рд░реВ рддрдпрд╛рд░ рдЧрд░реНрджреИтАЭ, p. 11)ред рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдкрдорд╛, рдврд╛рдБрдЪрд╛рдорд╛ $variableName
    5. -StorePasswordInClearText - рдкрд╣реБрдБрдЪ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдЧрд░рд┐рдПрдХреЛ рддреНрд░реБрдЯрд┐рд▓рд╛рдИ рдмрд╛рдЗрдкрд╛рд╕ рдЧрд░реНрди рд╣реНрдпрд╛рдХ (рдо рдпреЛ рд░реЗрдХрдорд╛ рдкрд╛рдЗрд▓рд╛ рдЯреЗрдХреНрдиреЗ рдкрд╣рд┐рд▓реЛ рд╣реЛрдЗрди)
    6. рддреНрд░реБрдЯрд┐рд╣рд░реВрдХреЛ рдЕрд╡рд╕реНрдерд╛рдорд╛ рдпреЛ рдердкреНрди рдЙрдкрдпреЛрдЧреА рд╣реБрди рд╕рдХреНрдЫ -verbosity detailed
  3. рд╣рд╛рдореА рд╕реНрд░реЛрддрдорд╛ рдкреНрдпрд╛рдХреЗрдЬ рдкрдард╛рдЙрдБрдЫреМрдВ: nuget push -source <name> -skipduplicate -apikey <key> *.nupkg
    1. рд╣рд╛рдореА рд╣рд╛рд▓рдХреЛ рдбрд╛рдЗрд░реЗрдХреНрдЯрд░реАрдмрд╛рдЯ рд╕рдмреИ рдкреНрдпрд╛рдХреЗрдЬрд╣рд░реВ рдкрдард╛рдЙрдБрдЫреМрдВ, рддреНрдпрд╕реИрд▓реЗ *.nupkg.
    2. name - рдорд╛рдерд┐рдХреЛ рдЪрд░рдгрдмрд╛рдЯред
    3. key - рдХреБрдиреИ рдкрдирд┐ рд░реЗрдЦрд╛ред Azure DevOps рдорд╛, Connect to feed рд╡рд┐рдиреНрдбреЛрдорд╛, рдЙрджрд╛рд╣рд░рдг рд░реЗрдЦрд╛ рд╕рдзреИрдВ рд╣реБрдиреНрдЫ 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 - docfx рд╕реНрдерд╛рдкрдирд╛ рдЧрд░реНрдиреБрд╣реЛрд╕реН; рдкреНрдпрд╛рдХреЗрдЬ рд╕реНрдерд╛рдкрдирд╛ рдорд╛рд░реНрдЧрд╣рд░реВ рд╕рд╣реА рдЫрдиреН рднрдиреА рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдЧрд░реНрди рд╕рдВрд╕реНрдХрд░рдг рдкреНрд░рджрд╛рди рдЧрд░рд┐рдПрдХреЛ рдЫред
      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 рд╢реАрд░реНрд╖рдХ рдорд╛

рдЙрдк рдХреВрд▓

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

рдЕрдиреНрддрд┐рдо .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

рдмреНрдпрд╛рдЬрдХреЛ рдХреБрд░рд╛ рдЧрд░реНрджреИ

рдЙрдиреАрд╣рд░реБрдХреИ рд▓рд╛рдЧрд┐ рд╕рдмреИ рд╕реБрд░реБ рднрдПрдХреЛ рд╣реЛ !

рдкрд╛рдЗрдкрд▓рд╛рдЗрди рд╕реНрдерд┐рддрд┐ рд░ рдХреЛрдб рдХрднрд░реЗрдЬ рднрдПрдХрд╛ рдмреНрдпрд╛рдЬрд╣рд░реВ GitLab рдорд╛ Gtntral рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдмреНрд▓рдХрдорд╛ CI/CD рд╕реЗрдЯрд┐рдЩрд╣рд░реВрдорд╛ рдЙрдкрд▓рдмреНрдз рдЫрдиреН:

(рд▓рдЧрднрдЧ) рдкреВрд░реНрдг рд╢реБрд░реБрд╡рд╛рддрдХрд░реНрддрд╛рдХреЛ рд▓рд╛рдЧрд┐ GitLab рдорд╛ CI/CD рдХреЛ рд▓рд╛рдЧрд┐ рдЧрд╛рдЗрдб

рдореИрд▓реЗ рдкреНрд▓реЗрдЯрдлрд░реНрдордорд╛ рдХрд╛рдЧрдЬрд╛рддрд╣рд░реВрдХреЛ рд▓рд┐рдЩреНрдХрдХреЛ рд╕рд╛рде рдмреНрдпрд╛рдЬ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реЗрдВ shields.io - рддреНрдпрд╣рд╛рдБ рд╕рдмреИ рдХреБрд░рд╛ рдПрдХрджрдо рд╕реАрдзрд╛ рдЫ, рддрдкрд╛рдИрдВ рдЖрдлреНрдиреИ рдмреНрдпрд╛рдЬ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрди рд░ рдЕрдиреБрд░реЛрдз рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред

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

(рд▓рдЧрднрдЧ) рдкреВрд░реНрдг рд╢реБрд░реБрд╡рд╛рддрдХрд░реНрддрд╛рдХреЛ рд▓рд╛рдЧрд┐ GitLab рдорд╛ CI/CD рдХреЛ рд▓рд╛рдЧрд┐ рдЧрд╛рдЗрдб

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

(рд▓рдЧрднрдЧ) рдкреВрд░реНрдг рд╢реБрд░реБрд╡рд╛рддрдХрд░реНрддрд╛рдХреЛ рд▓рд╛рдЧрд┐ GitLab рдорд╛ CI/CD рдХреЛ рд▓рд╛рдЧрд┐ рдЧрд╛рдЗрдб

(рд▓рдЧрднрдЧ) рдкреВрд░реНрдг рд╢реБрд░реБрд╡рд╛рддрдХрд░реНрддрд╛рдХреЛ рд▓рд╛рдЧрд┐ GitLab рдорд╛ CI/CD рдХреЛ рд▓рд╛рдЧрд┐ рдЧрд╛рдЗрдб

рд╕реМрдиреНрджрд░реНрдп рдердкреНрджреИ

рд╣рд╛рдореА рд╕рд╛рдорд╛рдиреНрдп рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рди рдЯреБрдХреНрд░рд╛рд╣рд░реВ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдЧрд░реНрдЫреМрдВ

рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рди рд▓реЗрдЦреНрджрд╛ рд░ рдХрд╛рдЧрдЬрд╛рддрд╣рд░реВ рдорд╛рд░реНрдлрдд рдЦреЛрдЬреА рдЧрд░реНрджрд╛, рдореИрд▓реЗ рдПрдЙрдЯрд╛ рдЪрд╛рдЦрд▓рд╛рдЧреНрджреЛ 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 рдзреЗрд░реИ рдлрд░рд╛рдХрд┐рд▓реЛ рд░ рдмрд╣реБрдореБрдЦреА рдЫ рдЬреБрди рдпреЛ рдЧрд╛рдЗрдб рдкрдвреЗ рдкрдЫрд┐ рд▓рд╛рдЧреНрди рд╕рдХреНрдЫ - рддреНрдпреЛ рдмрд┐рд▓реНрдХреБрд▓ рд╕рддреНрдп рд╣реЛрдЗрдиред рддреНрдпрд╣рд╛рдБ рдкрдирд┐ рдЫ Auto DevOps рд╣реЛ, рдЕрдиреБрдорддрд┐ рджрд┐рдБрджреИ

рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдкрдорд╛ рдкрддреНрддрд╛ рд▓рдЧрд╛рдЙрдиреБрд╣реЛрд╕реН, рдирд┐рд░реНрдорд╛рдг рдЧрд░реНрдиреБрд╣реЛрд╕реН, рдкрд░реАрдХреНрд╖рдг рдЧрд░реНрдиреБрд╣реЛрд╕реН, рдбрд┐рдкреНрд▓реЛрдЗ рдЧрд░реНрдиреБрд╣реЛрд╕реН, рд░ рддрдкрд╛рдЗрдБрдХреЛ рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╣рд░реВ рдирд┐рдЧрд░рд╛рдиреА рдЧрд░реНрдиреБрд╣реЛрд╕реН

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

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

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