(рдЬрд╡рд│рдЬрд╡рд│) рдкрд░рд┐рдкреВрд░реНрдг рдирд╡рд╢рд┐рдХреНрдпрд╛рд╕рд╛рдареА GitLab рдордзреАрд▓ CI/CD рд╕рд╛рдареА рдорд╛рд░реНрдЧрджрд░реНрд╢рдХ

рдХрд┐рдВрд╡рд╛ рд╕реЛрдкреНрдпрд╛ рдХреЛрдбрд┐рдВрдЧрдЪреНрдпрд╛ рдПрдХрд╛ рд╕рдВрдзреНрдпрд╛рдХрд╛рд│реА рддреБрдордЪреНрдпрд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯрд╕рд╛рдареА рд╕реБрдВрджрд░ рдмреЕрдЬ рдХрд╕реЗ рдорд┐рд│рд╡рд╛рдпрдЪреЗ

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

(рдЬрд╡рд│рдЬрд╡рд│) рдкрд░рд┐рдкреВрд░реНрдг рдирд╡рд╢рд┐рдХреНрдпрд╛рд╕рд╛рдареА GitLab рдордзреАрд▓ CI/CD рд╕рд╛рдареА рдорд╛рд░реНрдЧрджрд░реНрд╢рдХ

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

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

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

рд╕реАрдбреА - рдЬреЗрд╡реНрд╣рд╛ рддреБрдореНрд╣реА рдиреБрдХрддреЗрдЪ рдврдХрд▓рд▓реЗ рд╣реЛрддреЗ рдЖрдгрд┐ рд╕рд░реНрд╡рдХрд╛рд╣реА рдХреНрд▓рд╛рдпрдВрдЯрд╡рд░ рдЖрдзреАрдЪ рдкрдбрд▓реЗ рдЖрд╣реЗ?

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

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

рдЕрд╢рд╛ рдкреНрд░рдХрд╛рд░реЗ, рдЖрдордЪреНрдпрд╛рдХрдбреЗ рдЖрд╣реЗ:

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

рддреНрдпрд╛рдиреБрд╕рд╛рд░, рд╕реАрдЖрдп/рд╕реАрдбреА рд╕реЗрдЯ рдХрд░рддрд╛рдирд╛, рдХреЛрдб рдЖрдгрд┐ рдХрд▓рд╛рдХреГрддреА рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рдЪрд╛рдЪрдгреА рдЖрдгрд┐ рдкреНрд░рдХрд╛рд╢рдирд╛рд╕рд╛рдареА рдЖрд╡рд╢реНрдпрдХ рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рд╕рд░реНрд╡ рдХреНрд░рд┐рдпрд╛рдВрдЪреА рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА рдХрд░рдгрд╛рд▒реНрдпрд╛ рдХрд╛рд░реНрдпрд╛рдВрдЪрд╛ рд╕рдВрдЪ рддрдпрд╛рд░ рдХрд░рдгреЗ рд╣реЗ рдХрд╛рдо рдЦрд╛рд▓реА рдпреЗрддреЗ.

рд╕реБрд░реВ рдХрд░рдгреНрдпрд╛рдкреВрд░реНрд╡реА: рдХрд╛?

  • рдЧрд┐рдЯрд▓реЕрдм рдХрд╛?

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

  • Azure DevOps рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХрд╛ рдирд╛рд╣реА?

рдХрд╛рд░рдг рддреЗрдереЗ рд╕реЗрдЯрд┐рдВрдЧ рдкреНрд░рд╛рдердорд┐рдХ рдЖрд╣реЗ - рдХрдорд╛рдВрдб рд▓рд╛рдЗрдирдЪреЗ рдЬреНрдЮрд╛рди рджреЗрдЦреАрд▓ рдЖрд╡рд╢реНрдпрдХ рдирд╛рд╣реА. рдмрд╛рд╣реНрдп рдЧрд┐рдЯ рдкреНрд░рджрд╛рддреНрдпрд╛рдВрд╕рд╣ рдПрдХрддреНрд░реАрдХрд░рдг - рдХрд╛рд╣реА рдХреНрд▓рд┐рдХреНрд╕рдордзреНрдпреЗ, рд░реЗрдкреЙрдЬрд┐рдЯрд░реАрдордзреНрдпреЗ рдХрдорд┐рдЯ рдкрд╛рдард╡рдгреНрдпрд╛рд╕рд╛рдареА SSH рдХреА рдЖрдпрд╛рдд рдХрд░рд╛ - рд╢рд┐рд╡рд╛рдп, рдкрд╛рдИрдкрд▓рд╛рдИрди рдЯреЗрдореНрдкрд▓реЗрдЯрдордзреВрди рджреЗрдЦреАрд▓ рд╕рд╣рдЬрдкрдгреЗ рдХреЙрдиреНрдлрд┐рдЧрд░ рдХреЗрд▓реА рдЬрд╛рддреЗ.

рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕реНрдерд┐рддреА: рдЖрдкрд▓реНрдпрд╛рдХрдбреЗ рдХрд╛рдп рдЖрд╣реЗ рдЖрдгрд┐ рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рдХрд╛рдп рд╣рд╡реЗ рдЖрд╣реЗ

рдЖрдордЪреНрдпрд╛рдХрдбреЗ рдЖрд╣реЗ:

  • GitLab рдордзреНрдпреЗ рднрд╛рдВрдбрд╛рд░.

рдЖрдореНрд╣рд╛рд▓рд╛ рдкрд╛рд╣рд┐рдЬреЗ:

  • рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рд▓реАрдиреАрдХрд░рдг рд╡рд┐рдирдВрддреАрд╕рд╛рдареА рд╕реНрд╡рдпрдВрдЪрд▓рд┐рдд рдЕрд╕реЗрдВрдмреНрд▓реА рдЖрдгрд┐ рдЪрд╛рдЪрдгреА,
  • рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рд▓реАрдиреАрдХрд░рдг рд╡рд┐рдирдВрддреАрд╕рд╛рдареА рдкреЕрдХреЗрдЬ рддрдпрд╛рд░ рдХрд░рдгреЗ рдЖрдгрд┐ рдорд╛рд╕реНрдЯрд░рдХрдбреЗ рдврдХрд▓рдгреЗ, рдХрдорд┐рдЯ рд╕рдВрджреЗрд╢рд╛рдордзреНрдпреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдУрд│ рдЕрд╕рд▓реНрдпрд╛рд╕,
  • Azure DevOps рдордзреАрд▓ рдЦрд╛рдЬрдЧреА рдлреАрдбрд╡рд░ рдмрд┐рд▓реНрдЯ рдкреЕрдХреЗрдЬреЗрд╕ рдкрд╛рдард╡рдгреЗ,
  • GitLab рдкреГрд╖реНрдард╛рдВрдордзреНрдпреЗ рджрд╕реНрддрдРрд╡рдЬреАрдХрд░рдг рдЖрдгрд┐ рдкреНрд░рдХрд╛рд╢рдирд╛рдЪреЗ рдЕрд╕реЗрдВрдмреНрд▓реА,
  • рдмреЕрдЬ!11

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

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

рдЪрд▓рд╛ рд╕реБрд░реВ рдХрд░реБрдпрд╛!

рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдЧреЛрд│рд╛ рдХрд░рдд рдЖрд╣реЗ

рдЦрд╛рддреА рддрдпрд╛рд░ рдХрд░рдд рдЖрд╣реЗ

  1. рдордзреНрдпреЗ рдЦрд╛рддреЗ рддрдпрд╛рд░ рдХрд░рд╛ рдорд╛рдпрдХреНрд░реЛрд╕реЙрдлреНрдЯ рдЕрдЭрд░

  2. рдЬрд╛ рдЕрдЭрд░ рдбреЗрд╡реНрд╣реЛрдкреНрд╕

  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

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

рдкреБрдвреАрд▓ рдЪрд░рдг рдЬреЛрдбрдгреЗ рдЖрд╣реЗ рдЯрдкреНрдкрд╛рдЪреНрдпрд╛ рдбреАрдлреЙрд▓реНрдЯрдиреБрд╕рд╛рд░, 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 - "рдЦрд╛рддреЗ рддрдпрд╛рд░ рдХрд░рдгреЗ", рдкреГ. 6 рдпрд╛ рдЯрдкреНрдкреНрдпрд╛рддреАрд▓ рд╕реНрддреНрд░реЛрддрд╛рдЪреА URL
    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 рдордзреНрдпреЗ, рдХрдиреЗрдХреНрдЯ рдЯреВ рдлреАрдб рд╡рд┐рдВрдбреЛрдордзреНрдпреЗ, рдЙрджрд╛рд╣рд░рдг рдиреЗрд╣рдореА рдУрд│ рдЕрд╕рддреЗ 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

рдмреЕрдЬрдмрджреНрджрд▓ рдмреЛрд▓рдгреЗ

рддреНрдпрд╛рдВрдЪреНрдпрд╛рдореБрд│реЗ, рдирдВрддрд░ рд╕рд░реНрд╡ рдХрд╛рд╣реА рд╕реБрд░реВ рдЭрд╛рд▓реЗ!

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

(рдЬрд╡рд│рдЬрд╡рд│) рдкрд░рд┐рдкреВрд░реНрдг рдирд╡рд╢рд┐рдХреНрдпрд╛рд╕рд╛рдареА GitLab рдордзреАрд▓ CI/CD рд╕рд╛рдареА рдорд╛рд░реНрдЧрджрд░реНрд╢рдХ

рдореА рдкреНрд▓реЕрдЯрдлреЙрд░реНрдорд╡рд░реАрд▓ рджрд╕реНрддрдРрд╡рдЬреАрдХрд░рдгрд╛рдЪреНрдпрд╛ рд▓рд┐рдВрдХрд╕рд╣ рдПрдХ рдмреЕрдЬ рддрдпрд╛рд░ рдХреЗрд▓рд╛ рдЖрд╣реЗ Shields.io - рддреЗрдереЗ рд╕рд░реНрд╡ рдХрд╛рд╣реА рдЕрдЧрджреА рд╕рд░рд│ рдЖрд╣реЗ, рдЖрдкрдг рдЖрдкрд▓рд╛ рд╕реНрд╡рддрдГрдЪрд╛ рдмреЕрдЬ рддрдпрд╛рд░ рдХрд░реВ рд╢рдХрддрд╛ рдЖрдгрд┐ рд╡рд┐рдирдВрддреА рд╡рд╛рдкрд░реВрди рддреЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реВ рд╢рдХрддрд╛.

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

(рдЬрд╡рд│рдЬрд╡рд│) рдкрд░рд┐рдкреВрд░реНрдг рдирд╡рд╢рд┐рдХреНрдпрд╛рд╕рд╛рдареА GitLab рдордзреАрд▓ CI/CD рд╕рд╛рдареА рдорд╛рд░реНрдЧрджрд░реНрд╢рдХ

Azure DevOps рдЖрд░реНрдЯрд┐рдлреЕрдХреНрдЯреНрд╕ рддреБрдореНрд╣рд╛рд▓рд╛ рдирд╡реАрдирддрдо рдЖрд╡реГрддреНрддреАрд╕рд╣ рдкреЕрдХреЗрдЬреЗрд╕рд╕рд╛рдареА рдмреЕрдЬ рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рд╕ рджреЗрдЦреАрд▓ рдЕрдиреБрдорддреА рджреЗрддреЗ. рд╣реЗ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, 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 рд╣реЗ рдорд╛рд░реНрдЧрджрд░реНрд╢рдХ рд╡рд╛рдЪрд▓реНрдпрд╛рдирдВрддрд░ рд╡рд╛рдЯреЗрд▓ рддреНрдпрд╛рдкреЗрдХреНрд╖рд╛ рдЕрдзрд┐рдХ рд╡реНрдпрд╛рдкрдХ рдЖрдгрд┐ рдмрд╣реБрдЖрдпрд╛рдореА рдЖрд╣реЗ - рддреЗ рдЕрдЬрд┐рдмрд╛рдд рдЦрд░реЗ рдирд╛рд╣реА. рддрд┐рдереЗрд╣реА рдСрдЯреЛ DevOps рдЖрд╣реЗрдкрд░рд╡рд╛рдирдЧреА рджреЗрдд тАЛтАЛрдЖрд╣реЗ

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

рдЖрддрд╛ рдкреБрд▓реБрдореАрдЪрд╛ рд╡рд╛рдкрд░ рдХрд░реВрди, Azure рд╡рд░ рдНрдкреНрд▓рд┐рдХреЗрд╢рдиреНрд╕ рдбрд┐рдкреНрд▓реЙрдп рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХреЙрдиреНрдлрд┐рдЧрд░ рдХрд░рдгреНрдпрд╛рдЪреА рдЖрдгрд┐ рд▓рдХреНрд╖реНрдп рд╡рд╛рддрд╛рд╡рд░рдг рдЖрдкреЛрдЖрдк рдард░рд╡рдгреНрдпрд╛рдЪреА рдпреЛрдЬрдирд╛ рдЖрд╣реЗ, рдЬреНрдпрд╛рдЪрд╛ рдкреБрдвреАрд▓ рд▓реЗрдЦрд╛рдд рд╕рдорд╛рд╡реЗрд╢ рдХреЗрд▓рд╛ рдЬрд╛рдИрд▓.

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

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