{"id":78953,"date":"2020-04-23T07:42:46","date_gmt":"2020-04-23T05:42:46","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/rukovodstvo-po-ci-cd-v-gitlab-dlya-pochti-absolyutnogo-novichka"},"modified":"2020-04-23T07:42:46","modified_gmt":"2020-04-23T05:42:46","slug":"rukovodstvo-po-ci-cd-v-gitlab-dlya-pochti-absolyutnogo-novichka","status":"publish","type":"post","link":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/rukovodstvo-po-ci-cd-v-gitlab-dlya-pochti-absolyutnogo-novichka","title":{"rendered":"Guida CI\/CD in GitLab per (quasi) assoluti principianti","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><em>\u0418\u043b\u0438 \u043a\u0430\u043a \u043e\u0431\u0437\u0430\u0432\u0435\u0441\u0442\u0438\u0441\u044c \u043a\u0440\u0430\u0441\u0438\u0432\u044b\u043c\u0438 \u0431\u0435\u0439\u0434\u0436\u0438\u043a\u0430\u043c\u0438 \u0434\u043b\u044f \u0441\u0432\u043e\u0435\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0437\u0430 \u043e\u0434\u0438\u043d \u0432\u0435\u0447\u0435\u0440 \u043d\u0435\u043d\u0430\u043f\u0440\u044f\u0436\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0438\u043d\u0433\u0430<\/em><\/p>\n<p><\/p>\n<p>\u041d\u0430\u0432\u0435\u0440\u043d\u043e\u0435, \u0443 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430, \u0438\u043c\u0435\u044e\u0449\u0435\u0433\u043e \u0445\u043e\u0442\u044f \u0431\u044b \u043e\u0434\u0438\u043d \u043f\u0435\u0442-\u043f\u0440\u043e\u0435\u043a\u0442, \u0432 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u0437\u0443\u0434 \u043d\u0430 \u0442\u0435\u043c\u0443 \u043a\u0440\u0430\u0441\u0438\u0432\u044b\u0445 \u0431\u0435\u0439\u0434\u0436\u0438\u043a\u043e\u0432 \u0441\u043e \u0441\u0442\u0430\u0442\u0443\u0441\u0430\u043c\u0438, \u043f\u043e\u043a\u0440\u044b\u0442\u0438\u0435\u043c \u043a\u043e\u0434\u0430, \u0432\u0435\u0440\u0441\u0438\u044f\u043c\u0438 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u0432 nuget\u2026 \u0418 \u043c\u0435\u043d\u044f \u044d\u0442\u043e\u0442 \u0437\u0443\u0434 \u043f\u0440\u0438\u0432\u0451\u043b \u043a \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044e \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438. \u0412 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0438 \u043a \u0435\u0451 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044e \u044f \u043e\u0431\u0437\u0430\u0432\u0451\u043b\u0441\u044f \u0432\u043e\u0442 \u0442\u0430\u043a\u043e\u0439 \u043a\u0440\u0430\u0441\u043e\u0442\u043e\u0439 \u0432 \u043e\u0434\u043d\u043e\u043c \u0438\u0437 \u0441\u0432\u043e\u0438\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\u0420\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e \u043f\u043e CI\/CD \u0432 GitLab \u0434\u043b\u044f (\u043f\u043e\u0447\u0442\u0438) \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e\u0433\u043e \u043d\u043e\u0432\u0438\u0447\u043a\u0430\" src=\"\/wp-content\/uploads\/2020\/04\/634068d672c96baa965b6b63415cb3ce.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0430 \u0431\u0430\u0437\u043e\u0432\u0430\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e\u0439 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 \u0438 \u043f\u043e\u0441\u0442\u0430\u0432\u043a\u0438 \u0434\u043b\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u043d\u0430 .Net Core \u0432 GitLab, \u0441 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0435\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u0432 GitLab Pages \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u043e\u0439 \u0441\u043e\u0431\u0440\u0430\u043d\u043d\u044b\u0445 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u0432 \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u0439 \u0444\u0438\u0434 \u0432 Azure DevOps. <\/p>\n<p><\/p>\n<p>\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0441\u0440\u0435\u0434\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0430\u0441\u044c VS Code c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435\u043c <noindex><a rel=\"nofollow\" href=\"https:\/\/marketplace.visualstudio.com\/items?itemName=fatihacet.gitlab-workflow\">GitLab Workflow<\/a><\/noindex> (\u0434\u043b\u044f \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u0438 \u0444\u0430\u0439\u043b\u0430 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a \u043f\u0440\u044f\u043c\u043e \u0438\u0437 \u0441\u0440\u0435\u0434\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438).<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2 id=\"kratkoe-vvedenie\">\u041a\u0440\u0430\u0442\u043a\u043e\u0435 \u0432\u0432\u0435\u0434\u0435\u043d\u0438\u0435<\/h2>\n<p><\/p>\n<blockquote><p>CD \u2014 \u044d\u0442\u043e \u043a\u043e\u0433\u0434\u0430 \u0442\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0443\u0448\u043d\u0443\u043b, \u0430 \u0443 \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u0443\u0436\u0435 \u0432\u0441\u0451 \u0443\u043f\u0430\u043b\u043e?<\/p><\/blockquote>\n<p>\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 CI\/CD \u0438 \u0437\u0430\u0447\u0435\u043c \u043d\u0443\u0436\u043d\u043e \u2014 \u043c\u043e\u0436\u043d\u043e \u043b\u0435\u0433\u043a\u043e \u043d\u0430\u0433\u0443\u0433\u043b\u0438\u0442\u044c. \u041f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u0443\u044e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e \u043f\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0435 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u043e\u0432 \u0432 GitLab \u043d\u0430\u0439\u0442\u0438 <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.gitlab.com\/ee\/ci\/yaml\">\u0442\u0430\u043a\u0436\u0435 \u043d\u0435\u0441\u043b\u043e\u0436\u043d\u043e<\/a><\/noindex>. \u0417\u0434\u0435\u0441\u044c \u044f \u043a\u0440\u0430\u0442\u043a\u043e \u0438 \u043f\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0431\u0435\u0437 \u043e\u0433\u0440\u0435\u0445\u043e\u0432 \u043e\u043f\u0438\u0448\u0443 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0441 \u0432\u044b\u0441\u043e\u0442\u044b \u043f\u0442\u0438\u0447\u044c\u0435\u0433\u043e \u043f\u043e\u043b\u0451\u0442\u0430:<\/p>\n<p><\/p>\n<ul>\n<li>\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043e\u0442\u043f\u0440\u0430\u043b\u044f\u0435\u0442 \u043a\u043e\u043c\u043c\u0438\u0442 \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439, \u0441\u043e\u0437\u0434\u0430\u0451\u0442 merge request \u0447\u0435\u0440\u0435\u0437 \u0441\u0430\u0439\u0442, <em>\u0438\u043b\u0438 \u0435\u0449\u0451 \u043a\u0430\u043a\u0438\u043c-\u043b\u0438\u0431\u043e \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u044f\u0432\u043d\u043e \u0438\u043b\u0438 \u043d\u0435\u044f\u0432\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d<\/em>,<\/li>\n<li>\u0438\u0437 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0432\u044b\u0431\u0438\u0440\u0430\u044e\u0442\u0441\u044f \u0432\u0441\u0435 \u0437\u0430\u0434\u0430\u0447\u0438, \u0443\u0441\u043b\u043e\u0432\u0438\u044f \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0438\u0445 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435,<\/li>\n<li>\u0437\u0430\u0434\u0430\u0447\u0438 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0443\u044e\u0442\u0441\u044f \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441\u043e \u0441\u0432\u043e\u0438\u043c\u0438 \u044d\u0442\u0430\u043f\u0430\u043c\u0438,<\/li>\n<li>\u044d\u0442\u0430\u043f\u044b \u043f\u043e \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u2014 \u0442.\u0435. <em>\u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e<\/em> \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u0432\u0441\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u044d\u0442\u043e\u0433\u043e \u044d\u0442\u0430\u043f\u0430,<\/li>\n<li>\u0435\u0441\u043b\u0438 \u044d\u0442\u0430\u043f \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442\u0441\u044f \u043d\u0435\u0443\u0434\u0430\u0447\u0435\u0439 (\u0442.\u0435. \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442\u0441\u044f \u043d\u0435\u0443\u0434\u0430\u0447\u0435\u0439 \u0445\u043e\u0442\u044f \u0431\u044b \u043e\u0434\u043d\u0430 \u0438\u0437 \u0437\u0430\u0434\u0430\u0447 \u044d\u0442\u0430\u043f\u0430) \u2014 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f (<em>\u043f\u043e\u0447\u0442\u0438 \u0432\u0441\u0435\u0433\u0434\u0430<\/em>),<\/li>\n<li>\u0435\u0441\u043b\u0438 \u0432\u0441\u0435 \u044d\u0442\u0430\u043f\u044b \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u044b \u0443\u0441\u043f\u0435\u0448\u043d\u043e, \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u043f\u0440\u043e\u0448\u0435\u0434\u0448\u0438\u043c.<\/li>\n<\/ul>\n<p><\/p>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0438\u043c\u0435\u0435\u043c:<\/p>\n<p><\/p>\n<ul>\n<li>\u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d \u2014 \u043d\u0430\u0431\u043e\u0440 \u0437\u0430\u0434\u0430\u0447, \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0432 \u044d\u0442\u0430\u043f\u044b, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0431\u0440\u0430\u0442\u044c, \u043f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0443\u043f\u0430\u043a\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434, \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0433\u043e\u0442\u043e\u0432\u0443\u044e \u0441\u0431\u043e\u0440\u043a\u0443 \u0432 \u043e\u0431\u043b\u0430\u0447\u043d\u044b\u0439 \u0441\u0435\u0440\u0432\u0438\u0441, \u0438 \u043f\u0440.,<\/li>\n<li>\u044d\u0442\u0430\u043f (<strong>stage<\/strong>) \u2014 \u0435\u0434\u0438\u043d\u0438\u0446\u0430 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u0430, \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 1+ \u0437\u0430\u0434\u0430\u0447\u0443,<\/li>\n<li>\u0437\u0430\u0434\u0430\u0447\u0430 (<strong>job<\/strong>) \u2014 \u0435\u0434\u0438\u043d\u0438\u0446\u0430 \u0440\u0430\u0431\u043e\u0442\u044b \u0432 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u0435. \u0421\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u0441\u043a\u0440\u0438\u043f\u0442\u0430 (\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e), \u0443\u0441\u043b\u043e\u0432\u0438\u0439 \u0437\u0430\u043f\u0443\u0441\u043a\u0430, \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438\/\u043a\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u043e\u0432 \u0438 \u043c\u043d\u043e\u0433\u043e \u0434\u0440\u0443\u0433\u043e\u0433\u043e.<\/li>\n<\/ul>\n<p><\/p>\n<p>\u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0437\u0430\u0434\u0430\u0447\u0430 \u043f\u0440\u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0435 CI\/CD \u0441\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043a \u0442\u043e\u043c\u0443, \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u0430\u0431\u043e\u0440 \u0437\u0430\u0434\u0430\u0447, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0449\u0438\u0445 \u0432\u0441\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438, \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \u043a\u043e\u0434\u0430 \u0438 \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u043e\u0432.<\/p>\n<p><\/p>\n<p>                        <b class=\"spoiler_title\">\u041f\u0435\u0440\u0435\u0434 \u043d\u0430\u0447\u0430\u043b\u043e\u043c: \u043f\u043e\u0447\u0435\u043c\u0443?<\/b><\/p>\n<ul>\n<li>\u041f\u043e\u0447\u0435\u043c\u0443 GitLab?<\/li>\n<\/ul>\n<p><\/p>\n<p>\u041f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u043a\u043e\u0433\u0434\u0430 \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u0435 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 \u043f\u043e\u0434 \u043f\u0435\u0442-\u043f\u0440\u043e\u0435\u043a\u0442\u044b, \u043d\u0430 GitHub&#8217;e \u043e\u043d\u0438 \u0431\u044b\u043b\u0438 \u043f\u043b\u0430\u0442\u043d\u044b\u043c\u0438, \u0430 \u044f \u2014 \u0436\u0430\u0434\u043d\u044b\u043c. \u0420\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 \u0441\u0442\u0430\u043b\u0438 \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u044b\u043c\u0438, \u043d\u043e \u043f\u043e\u043a\u0430 \u044d\u0442\u043e \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u043c\u0435\u043d\u044f \u043f\u043e\u0432\u043e\u0434\u043e\u043c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u044b\u043c \u043f\u0435\u0440\u0435\u0435\u0437\u0436\u0430\u0442\u044c \u043d\u0430 GitHub.<\/p>\n<p><\/p>\n<ul>\n<li>\u041f\u043e\u0447\u0435\u043c\u0443 \u043d\u0435 Azure DevOps Pipelines?<\/li>\n<\/ul>\n<p><\/p>\n<p>\u041f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0442\u0430\u043c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0440\u043d\u0430\u044f \u2014 \u0434\u0430\u0436\u0435 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u044e\u0442\u0441\u044f \u0437\u043d\u0430\u043d\u0438\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438. \u0418\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f \u0441 \u0432\u043d\u0435\u0448\u043d\u0438\u043c\u0438 \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u0430\u043c\u0438 git \u2014 \u0432 \u043f\u0430\u0440\u0443 \u043a\u043b\u0438\u043a\u043e\u0432, \u0438\u043c\u043f\u043e\u0440\u0442 SSH-\u043a\u043b\u044e\u0447\u0435\u0439 \u0434\u043b\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u043a\u043e\u043c\u043c\u0438\u0442\u043e\u0432 \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u2014 \u0442\u043e\u0436\u0435, \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d \u043b\u0435\u0433\u043a\u043e \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0434\u0430\u0436\u0435 \u043d\u0435 \u0438\u0437 \u0448\u0430\u0431\u043b\u043e\u043d\u0430.<\/p>\n<p><\/p>\n<h2 id=\"ishodnaya-poziciya-chto-imeetsya-i-chego-hochetsya\">\u0418\u0441\u0445\u043e\u0434\u043d\u0430\u044f \u043f\u043e\u0437\u0438\u0446\u0438\u044f: \u0447\u0442\u043e \u0438\u043c\u0435\u0435\u0442\u0441\u044f \u0438 \u0447\u0435\u0433\u043e \u0445\u043e\u0447\u0435\u0442\u0441\u044f<\/h2>\n<p><\/p>\n<p>\u0418\u043c\u0435\u0435\u043c:<\/p>\n<p><\/p>\n<ul>\n<li>\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0432 GitLab.<\/li>\n<\/ul>\n<p><\/p>\n<p>\u0425\u043e\u0442\u0438\u043c:<\/p>\n<p><\/p>\n<ul>\n<li>\u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0441\u0431\u043e\u0440\u043a\u0443 \u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e merge request,<\/li>\n<li>\u0441\u0431\u043e\u0440\u043a\u0443 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e merge request \u0438 \u043f\u0443\u0448\u0430 \u0432 \u043c\u0430\u0441\u0442\u0435\u0440 \u043f\u0440\u0438 \u0443\u0441\u043b\u043e\u0432\u0438\u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0432 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0438 \u043a\u043e\u043c\u043c\u0438\u0442\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438,<\/li>\n<li>\u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0443 \u0441\u043e\u0431\u0440\u0430\u043d\u043d\u044b\u0445 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u0432 \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u0439 \u0444\u0438\u0434 \u0432 Azure DevOps,<\/li>\n<li>\u0441\u0431\u043e\u0440\u043a\u0443 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u0438 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u044e \u0432 GitLab Pages,<\/li>\n<li><em>\u0431\u0435\u0439\u0434\u0436\u0438\u043a\u0438!11<\/em><\/li>\n<\/ul>\n<p><\/p>\n<p>\u041e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u0440\u0433\u0430\u043d\u0438\u0447\u043d\u043e \u043b\u043e\u0436\u0430\u0442\u0441\u044f \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u043c\u043e\u0434\u0435\u043b\u044c \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u0430:<\/p>\n<p><\/p>\n<ul>\n<li>\u042d\u0442\u0430\u043f 1 \u2014 \u0441\u0431\u043e\u0440\u043a\u0430\n<ul>\n<li>\u0421\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u043a\u043e\u0434, \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u043f\u0443\u0431\u043b\u0438\u043a\u0443\u0435\u043c \u043a\u0430\u043a \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u044b<\/li>\n<\/ul>\n<\/li>\n<li>\u042d\u0442\u0430\u043f 2 \u2014 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\n<ul>\n<li>\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u044b \u0441 \u044d\u0442\u0430\u043f\u0430 \u0441\u0431\u043e\u0440\u043a\u0438, \u0433\u043e\u043d\u044f\u0435\u043c \u0442\u0435\u0441\u0442\u044b, \u0441\u043e\u0431\u0440\u0430\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u043a\u0440\u044b\u0442\u0438\u044f \u043a\u043e\u0434\u0430<\/li>\n<\/ul>\n<\/li>\n<li>\u042d\u0442\u0430\u043f 3 \u2014 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0430\n<ul>\n<li>\u0417\u0430\u0434\u0430\u0447\u0430 1 \u2014 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c nuget-\u043f\u0430\u043a\u0435\u0442 \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0432 Azure DevOps<\/li>\n<li>\u0417\u0430\u0434\u0430\u0447\u0430 2 \u2014 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u0441\u0430\u0439\u0442 \u0438\u0437 xmldoc \u0432 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u043c \u043a\u043e\u0434\u0435 \u0438 \u043f\u0443\u0431\u043b\u0438\u043a\u0443\u0435\u043c \u0432 GitLab Pages<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><\/p>\n<p>\u041f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u043c!<\/p>\n<p><\/p>\n<h2 id=\"sobiraem-konfiguraciyu\">\u0421\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e<\/h2>\n<p><\/p>\n<h3 id=\"gotovim-akkaunty\">\u0413\u043e\u0442\u043e\u0432\u0438\u043c \u0430\u043a\u043a\u0430\u0443\u043d\u0442\u044b<\/h3>\n<p><\/p>\n<ol>\n<li>\n<p>\u0421\u043e\u0437\u0434\u0430\u0451\u043c \u0430\u043a\u043a\u0430\u0443\u043d\u0442 \u0432 <noindex><a rel=\"nofollow\" href=\"https:\/\/azure.microsoft.com\/ru-ru\/free\/\">Microsoft Azure<\/a><\/noindex><\/p>\n<p>\n<\/li>\n<li>\n<p>\u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u0432 <noindex><a rel=\"nofollow\" href=\"https:\/\/dev.azure.com\">Azure DevOps<\/a><\/noindex><\/p>\n<p>\n<\/li>\n<li>\n<p>\u0421\u043e\u0437\u0434\u0430\u0451\u043c \u043d\u043e\u0432\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442<\/p>\n<p><\/p>\n<ol>\n<li>\u0418\u043c\u044f \u2014 \u043b\u044e\u0431\u043e\u0435<\/li>\n<li>\u0412\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u2014 \u043b\u044e\u0431\u0430\u044f<br \/>\n<img decoding=\"async\" alt=\"\u0420\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e \u043f\u043e CI\/CD \u0432 GitLab \u0434\u043b\u044f (\u043f\u043e\u0447\u0442\u0438) \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e\u0433\u043e \u043d\u043e\u0432\u0438\u0447\u043a\u0430\" src=\"\/wp-content\/uploads\/2020\/04\/45f1f34e5282687915e2d4dfdff15658.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/li>\n<\/ol>\n<p>\n<\/li>\n<li>\n<p>\u041f\u0440\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u0438 \u043d\u0430 \u043a\u043d\u043e\u043f\u043a\u0443 Create \u043f\u0440\u043e\u0435\u043a\u0442 \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u043d, \u0438 \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0432\u0435\u0440\u0448\u0451\u043d \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0430 \u0435\u0433\u043e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443. \u041d\u0430 \u044d\u0442\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435 \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043d\u0435\u043d\u0443\u0436\u043d\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438, \u043f\u0435\u0440\u0435\u0439\u0434\u044f \u0432 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u044b (\u043d\u0438\u0436\u043d\u044f\u044f \u0441\u0441\u044b\u043b\u043a\u0430 \u0432 \u0441\u043f\u0438\u0441\u043a\u0435 \u0441\u043b\u0435\u0432\u0430 -&gt; Overview -&gt; \u0431\u043b\u043e\u043a Azure DevOps Services)<br \/>\n<img decoding=\"async\" alt=\"\u0420\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e \u043f\u043e CI\/CD \u0432 GitLab \u0434\u043b\u044f (\u043f\u043e\u0447\u0442\u0438) \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e\u0433\u043e \u043d\u043e\u0432\u0438\u0447\u043a\u0430\" src=\"\/wp-content\/uploads\/2020\/04\/d29db642189c5b512cd2d9c7aed70e26.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>\n<\/li>\n<li>\n<p>\u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u0432 Atrifacts, \u0436\u043c\u0451\u043c Create feed<\/p>\n<p><\/p>\n<ol>\n<li>\u0412\u0432\u043e\u0434\u0438\u043c \u0438\u043c\u044f \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430<\/li>\n<li>\u0412\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c<\/li>\n<li>\u0421\u043d\u0438\u043c\u0430\u0435\u043c \u0433\u0430\u043b\u043e\u0447\u043a\u0443 <strong>Include packages from common public sources<\/strong>, \u0447\u0442\u043e\u0431\u044b \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u043d\u0435 \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u043b\u0441\u044f \u0432 \u043f\u043e\u043c\u043e\u0439\u043a\u0443 \u043a\u043b\u043e\u043d nuget<br \/>\n<img decoding=\"async\" alt=\"\u0420\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e \u043f\u043e CI\/CD \u0432 GitLab \u0434\u043b\u044f (\u043f\u043e\u0447\u0442\u0438) \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e\u0433\u043e \u043d\u043e\u0432\u0438\u0447\u043a\u0430\" src=\"\/wp-content\/uploads\/2020\/04\/c9e1459e6cb35d6fa9aab44193d83d38.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/li>\n<\/ol>\n<p>\n<\/li>\n<li>\n<p>\u0416\u043c\u0451\u043c Connect to feed, \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c Visual Studio, \u0438\u0437 \u0431\u043b\u043e\u043a\u0430 Machine Setup \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u043c Source<br \/>\n<img decoding=\"async\" alt=\"\u0420\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e \u043f\u043e CI\/CD \u0432 GitLab \u0434\u043b\u044f (\u043f\u043e\u0447\u0442\u0438) \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e\u0433\u043e \u043d\u043e\u0432\u0438\u0447\u043a\u0430\" src=\"\/wp-content\/uploads\/2020\/04\/4b8e8b35740f6b5933506de4e2b2262a.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>\n<\/li>\n<li>\n<p>\u0418\u0434\u0451\u043c \u0432 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0430\u043a\u043a\u0430\u0443\u043d\u0442\u0430, \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c Personal Access Token<br \/>\n<img decoding=\"async\" alt=\"\u0420\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e \u043f\u043e CI\/CD \u0432 GitLab \u0434\u043b\u044f (\u043f\u043e\u0447\u0442\u0438) \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e\u0433\u043e \u043d\u043e\u0432\u0438\u0447\u043a\u0430\" src=\"\/wp-content\/uploads\/2020\/04\/eedf7913a7ee0c8433070efa22f73df5.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>\n<\/li>\n<li>\n<p>\u0421\u043e\u0437\u0434\u0430\u0451\u043c \u043d\u043e\u0432\u044b\u0439 \u0442\u043e\u043a\u0435\u043d \u0434\u043e\u0441\u0442\u0443\u043f\u0430<\/p>\n<p><\/p>\n<ol>\n<li>\u0418\u043c\u044f \u2014 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u0435<\/li>\n<li>\u041e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u2014 \u0442\u0435\u043a\u0443\u0449\u0430\u044f<\/li>\n<li>\u0421\u0440\u043e\u043a \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u2014 \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c 1 \u0433\u043e\u0434<\/li>\n<li>\u041e\u0431\u043b\u0430\u0441\u0442\u044c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f (scope) \u2014 Packaging\/Read &amp; Write<br \/>\n<img decoding=\"async\" alt=\"\u0420\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e \u043f\u043e CI\/CD \u0432 GitLab \u0434\u043b\u044f (\u043f\u043e\u0447\u0442\u0438) \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e\u0433\u043e \u043d\u043e\u0432\u0438\u0447\u043a\u0430\" src=\"\/wp-content\/uploads\/2020\/04\/ac8a9f71986e1a80d2d29b14cb4a204d.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/li>\n<\/ol>\n<p>\n<\/li>\n<li>\n<p>\u041a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0439 \u0442\u043e\u043a\u0435\u043d \u2014 <strong>\u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e<\/strong><\/p>\n<p>\n<\/li>\n<li>\n<p>\u0417\u0430\u0445\u043e\u0434\u0438\u043c \u0432 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f \u0432 GitLab, \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 CI\/CD<br \/>\n<img decoding=\"async\" alt=\"\u0420\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e \u043f\u043e CI\/CD \u0432 GitLab \u0434\u043b\u044f (\u043f\u043e\u0447\u0442\u0438) \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e\u0433\u043e \u043d\u043e\u0432\u0438\u0447\u043a\u0430\" src=\"\/wp-content\/uploads\/2020\/04\/aa4924b54764fdb807b40f520e361986.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>\n<\/li>\n<li>\n<p>\u0420\u0430\u0441\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0431\u043b\u043e\u043a Variables, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043d\u043e\u0432\u0443\u044e<\/p>\n<p><\/p>\n<ol>\n<li>\u0418\u043c\u044f \u2014 \u043b\u044e\u0431\u043e\u0435 \u0431\u0435\u0437 \u043f\u0440\u043e\u0431\u0435\u043b\u043e\u0432 (\u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u043e\u0431\u043e\u043b\u043e\u0447\u043a\u0435)<\/li>\n<li>\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u2014 \u0442\u043e\u043a\u0435\u043d \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u0438\u0437 \u043f. 9<\/li>\n<li>\u0412\u044b\u0431\u0438\u0440\u0430\u0435\u043c Mask variable<br \/>\n<img decoding=\"async\" alt=\"\u0420\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e \u043f\u043e CI\/CD \u0432 GitLab \u0434\u043b\u044f (\u043f\u043e\u0447\u0442\u0438) \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e\u0433\u043e \u043d\u043e\u0432\u0438\u0447\u043a\u0430\" src=\"\/wp-content\/uploads\/2020\/04\/f1c70bf7c9c89976f48d13b9b1fc3f04.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/li>\n<\/ol>\n<p>\n<\/li>\n<\/ol>\n<p><\/p>\n<p>\u041d\u0430 \u044d\u0442\u043e\u043c \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0430.<\/p>\n<p><\/p>\n<h3 id=\"gotovim-karkas-konfiguracii\">\u0413\u043e\u0442\u043e\u0432\u0438\u043c \u043a\u0430\u0440\u043a\u0430\u0441 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438<\/h3>\n<p><\/p>\n<p>\u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e, \u0434\u043b\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 CI\/CD \u0432 GitLab \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0444\u0430\u0439\u043b <code>.gitlab-ci.yml<\/code> \u0438\u0437 \u043a\u043e\u0440\u043d\u044f \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f. \u041c\u043e\u0436\u043d\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0439 \u043f\u0443\u0442\u044c \u0434\u043e \u044d\u0442\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430 \u0432 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f, \u043d\u043e \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e \u043d\u0435 \u043d\u0443\u0436\u043d\u043e.<\/p>\n<p><\/p>\n<p>\u041a\u0430\u043a \u0432\u0438\u0434\u043d\u043e \u0438\u0437 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f, \u0444\u0430\u0439\u043b \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 <code>YAML<\/code>. \u0412 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u043e, \u043a\u0430\u043a\u0438\u0435 \u043a\u043b\u044e\u0447\u0438 \u043c\u043e\u0433\u0443\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u0432\u0435\u0440\u0445\u043d\u0435\u043c \u0443\u0440\u043e\u0432\u043d\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438, \u0438 \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u0438\u0437 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u0443\u0440\u043e\u0432\u043d\u0435\u0439.<\/p>\n<p><\/p>\n<p>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0432 \u0444\u0430\u0439\u043b \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 docker-\u043e\u0431\u0440\u0430\u0437, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0437\u0430\u0434\u0430\u0447. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u0445\u043e\u0434\u0438\u043c <noindex><a rel=\"nofollow\" href=\"https:\/\/hub.docker.com\/_\/microsoft-dotnet-core\">\u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u043e\u0431\u0440\u0430\u0437\u043e\u0432 .Net Core \u0432 Docker Hub<\/a><\/noindex>. \u0412 <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/dotnet\/dotnet-docker\/blob\/master\/samples\/build-in-sdk-container.md\">GitHub<\/a><\/noindex> \u0435\u0441\u0442\u044c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0435 \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e, \u043a\u0430\u043a\u043e\u0439 \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u043e\u0431\u0440\u0430\u0437 \u0434\u043b\u044f \u0440\u0430\u0437\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447. \u041d\u0430\u043c \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 \u043f\u043e\u0434\u043e\u0439\u0434\u0451\u0442 \u043e\u0431\u0440\u0430\u0437 \u0441 .Net Core 3.1, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u043c\u0435\u043b\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u043e\u0439 \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">image: mcr.microsoft.com\/dotnet\/core\/sdk:3.1<\/code><\/pre>\n<p><\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u0430 \u0441 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430 \u043e\u0431\u0440\u0430\u0437\u043e\u0432 Microsoft \u0431\u0443\u0434\u0435\u0442 \u0441\u043a\u0430\u0447\u0430\u043d \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0439 \u043e\u0431\u0440\u0430\u0437, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0438 \u0431\u0443\u0434\u0443\u0442 \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u0432\u0441\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u0438\u0437 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438.<\/p>\n<p><\/p>\n<p>\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u044d\u0442\u0430\u043f \u2014 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c <strong>stage<\/strong>&#8216;\u044b. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e GitLab \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 5 \u044d\u0442\u0430\u043f\u043e\u0432:<\/p>\n<p><\/p>\n<ul>\n<li><code>.pre<\/code> \u2014 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0434\u043e \u0432\u0441\u0435\u0445 \u044d\u0442\u0430\u043f\u043e\u0432,<\/li>\n<li><code>.post<\/code> \u2014 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u0441\u043b\u0435 \u0432\u0441\u0435\u0445 \u044d\u0442\u0430\u043f\u043e\u0432,<\/li>\n<li><code>build<\/code> \u2014 \u043f\u0435\u0440\u0432\u044b\u0439 \u043f\u043e\u0441\u043b\u0435 <code>.pre<\/code> \u044d\u0442\u0430\u043f,<\/li>\n<li><code>test<\/code> \u2014 \u0432\u0442\u043e\u0440\u043e\u0439 \u044d\u0442\u0430\u043f,<\/li>\n<li><code>deploy<\/code> \u2014 \u0442\u0440\u0435\u0442\u0438\u0439 \u044d\u0442\u0430\u043f.<\/li>\n<\/ul>\n<p><\/p>\n<p>\u041d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043c\u0435\u0448\u0430\u0435\u0442 \u043e\u0431\u044a\u044f\u0432\u0438\u0442\u044c \u0438\u0445 \u044f\u0432\u043d\u043e, \u0432\u043f\u0440\u043e\u0447\u0435\u043c. \u041f\u043e\u0440\u044f\u0434\u043e\u043a, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0443\u043a\u0430\u0437\u0430\u043d\u044b \u044d\u0442\u0430\u043f\u044b, \u0432\u043b\u0438\u044f\u0435\u0442 \u043d\u0430 \u043f\u043e\u0440\u044f\u0434\u043e\u043a, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043e\u043d\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f. \u0414\u043b\u044f \u043f\u043e\u043b\u043d\u043e\u0442\u044b \u0438\u0437\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">stages:\n  - build\n  - test\n  - deploy<\/code><\/pre>\n<p><\/p>\n<p>\u0414\u043b\u044f \u043e\u0442\u043b\u0430\u0434\u043a\u0438 \u0438\u043c\u0435\u0435\u0442 \u0441\u043c\u044b\u0441\u043b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e\u0431 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0438, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u0437\u0430\u0434\u0430\u0447\u0438. \u0414\u043e\u0431\u0430\u0432\u0438\u043c \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0439 \u043d\u0430\u0431\u043e\u0440 \u043a\u043e\u043c\u0430\u043d\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u043f\u0435\u0440\u0435\u0434 \u043a\u0430\u0436\u0434\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0435\u0439, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>before_script<\/code>:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">before_script:\n  - $PSVersionTable.PSVersion\n  - dotnet --version\n  - nuget help | select-string Version<\/code><\/pre>\n<p><\/p>\n<p>\u041e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0445\u043e\u0442\u044f \u0431\u044b \u043e\u0434\u043d\u0443 \u0437\u0430\u0434\u0430\u0447\u0443, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0435 \u043a\u043e\u043c\u043c\u0438\u0442\u043e\u0432 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043b\u0441\u044f. \u041f\u043e\u043a\u0430 \u0447\u0442\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u043f\u0443\u0441\u0442\u0443\u044e \u0437\u0430\u0434\u0430\u0447\u0443 \u0434\u043b\u044f \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u0438:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">dummy job:\n  script:\n    - echo ok<\/code><\/pre>\n<p><\/p>\n<p>\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u044e, \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435, \u0447\u0442\u043e \u0432\u0441\u0451 \u0445\u043e\u0440\u043e\u0448\u043e, \u043a\u043e\u043c\u043c\u0438\u0442\u0438\u043c, \u043f\u0443\u0448\u0438\u043c, \u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u0441\u0430\u0439\u0442\u0435 \u043d\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b\u2026 \u0418 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043e\u0448\u0438\u0431\u043a\u0443 \u0441\u043a\u0440\u0438\u043f\u0442\u0430 \u2014 <code>bash: .PSVersion: command not found<\/code>. WTF?<\/p>\n<p><\/p>\n<p>\u0412\u0441\u0451 \u043b\u043e\u0433\u0438\u0447\u043d\u043e \u2014 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e runner&#8217;\u044b (\u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0449\u0438\u0435 \u0437\u0430 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432 \u0437\u0430\u0434\u0430\u0447, \u0438 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u0435 GitLab&#8217;\u043e\u043c) \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 <code>bash<\/code> \u0434\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043a\u043e\u043c\u0430\u043d\u0434. \u041c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u044d\u0442\u043e \u0434\u0435\u043b\u043e, \u044f\u0432\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0432 \u0432 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0438 \u0437\u0430\u0434\u0430\u0447\u0438, \u043a\u0430\u043a\u0438\u0435 \u0442\u0435\u0433\u0438 \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0443 \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u044e\u0449\u0435\u0433\u043e \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d \u0440\u0430\u043d\u043d\u0435\u0440\u0430:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">dummy job on windows:\n  script:\n    - echo ok\n  tags:\n    - windows<\/code><\/pre>\n<p><\/p>\n<p>\u041e\u0442\u043b\u0438\u0447\u043d\u043e! \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f.<\/p>\n<p><\/p>\n<p>\u0412\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044c, \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u0432 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0435 \u0448\u0430\u0433\u0438, \u0437\u0430\u043c\u0435\u0442\u0438\u0442, \u0447\u0442\u043e \u0437\u0430\u0434\u0430\u0447\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043b\u0430\u0441\u044c \u0432 \u044d\u0442\u0430\u043f\u0435 <code>test<\/code>, \u0445\u043e\u0442\u044f \u043c\u044b \u043d\u0435 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u043b\u0438 \u044d\u0442\u0430\u043f. \u041a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0433\u0430\u0434\u0430\u0442\u044c\u0441\u044f, <code>test<\/code> \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u044d\u0442\u0430\u043f\u043e\u043c \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e.<\/p>\n<p><\/p>\n<p>\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u043c \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u043a\u0435\u043b\u0435\u0442\u0430 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438, \u0434\u043e\u0431\u0430\u0432\u0438\u0432 \u0432\u0441\u0435 \u0437\u0430\u0434\u0430\u0447\u0438, \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u0432\u044b\u0448\u0435:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">build job:\n  script:\n    - echo &quot;building...&quot;\n  tags:\n    - windows\n  stage: build\n\ntest and cover job:\n  script:\n    - echo &quot;running tests and coverage analysis...&quot;\n  tags:\n    - windows\n  stage: test\n\npack and deploy job:\n  script:\n    - echo &quot;packing and pushing to nuget...&quot;\n  tags:\n    - windows\n  stage: deploy\n\npages:\n  script:\n    - echo &quot;creating docs...&quot;\n  tags:\n    - windows\n  stage: deploy<\/code><\/pre>\n<p><\/p>\n<p>\u041f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u043d\u0435 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0439, \u043d\u043e \u0442\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u0439 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d.<\/p>\n<p><\/p>\n<h3 id=\"nastroyka-triggerov\">\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u043e\u0432<\/h3>\n<p><\/p>\n<p>\u0418\u0437-\u0437\u0430 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043d\u0438 \u0434\u043b\u044f \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 \u0437\u0430\u0434\u0430\u0447 \u043d\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u044b \u0444\u0438\u043b\u044c\u0442\u0440\u044b \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043d\u0438\u044f, \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d \u0431\u0443\u0434\u0435\u0442 <strong>\u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e<\/strong> \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u0439 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0435 \u043a\u043e\u043c\u043c\u0438\u0442\u043e\u0432 \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439. \u0422\u0430\u043a \u043a\u0430\u043a \u044d\u0442\u043e \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0436\u0435\u043b\u0430\u0435\u043c\u044b\u043c \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435\u043c \u0432 \u043e\u0431\u0449\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u043c\u044b \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u043c \u0444\u0438\u043b\u044c\u0442\u0440\u044b \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u0434\u043b\u044f \u0437\u0430\u0434\u0430\u0447.<\/p>\n<p><\/p>\n<p>\u0424\u0438\u043b\u044c\u0442\u0440\u044b \u043c\u043e\u0433\u0443\u0442 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u0434\u0432\u0443\u0445 \u0444\u043e\u0440\u043c\u0430\u0442\u0430\u0445: <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.gitlab.com\/ee\/ci\/yaml\/#onlyexcept-basic\">only\/except<\/a><\/noindex> \u0438 <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.gitlab.com\/ee\/ci\/yaml\/#rules\">rules<\/a><\/noindex>. \u0412\u043a\u0440\u0430\u0442\u0446\u0435, <code>only\/except<\/code> \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c \u0444\u0438\u043b\u044c\u0442\u0440\u044b \u043f\u043e \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u0430\u043c (<code>merge_request<\/code>, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u2014 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442 \u0437\u0430\u0434\u0430\u0447\u0443 \u043d\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u043c \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043d\u0430 \u0441\u043b\u0438\u044f\u043d\u0438\u0435 \u0438 \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u0439 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0435 \u043a\u043e\u043c\u043c\u0438\u0442\u043e\u0432 \u0432 \u0432\u0435\u0442\u043a\u0443, \u044f\u0432\u043b\u044f\u044e\u0449\u0443\u044e\u0441\u044f \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u0432 \u0437\u0430\u043f\u0440\u043e\u0441\u0435 \u043d\u0430 \u0441\u043b\u0438\u044f\u043d\u0438\u0435) \u0438 \u0438\u043c\u0435\u043d\u0430\u043c \u0432\u0435\u0442\u043e\u043a (\u0432 \u0442.\u0447. \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439); <code>rules<\/code> \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c \u043d\u0430\u0431\u043e\u0440 \u0443\u0441\u043b\u043e\u0432\u0438\u0439 \u0438, \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e, \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u0443\u0441\u043b\u043e\u0432\u0438\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0437\u0430\u0434\u0430\u0447\u0438 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0443\u0441\u043f\u0435\u0445\u0430 \u043f\u0440\u0435\u0434\u0448\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0437\u0430\u0434\u0430\u0447 (<noindex><a rel=\"nofollow\" href=\"https:\/\/docs.gitlab.com\/ee\/ci\/yaml\/#when\"><code>when<\/code> \u0432 GitLab CI\/CD<\/a><\/noindex>).<\/p>\n<p><\/p>\n<p>\u0412\u0441\u043f\u043e\u043c\u043d\u0438\u043c \u043d\u0430\u0431\u043e\u0440 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0439 \u2014 \u0441\u0431\u043e\u0440\u043a\u0430 \u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f merge request, \u0443\u043f\u0430\u043a\u043e\u0432\u043a\u0430 \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u0432 Azure DevOps \u2014 \u0434\u043b\u044f merge request \u0438 \u043f\u0443\u0448\u0435\u0439 \u0432 \u043c\u0430\u0441\u0442\u0435\u0440, \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u2014 \u0434\u043b\u044f \u043f\u0443\u0448\u0435\u0439 \u0432 \u043c\u0430\u0441\u0442\u0435\u0440.<\/p>\n<p><\/p>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u043c \u0437\u0430\u0434\u0430\u0447\u0443 \u0441\u0431\u043e\u0440\u043a\u0438 \u043a\u043e\u0434\u0430, \u0434\u043e\u0431\u0430\u0432\u0438\u0432 \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438 merge request:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">build job:\n  # snip\n  only:\n    - merge_request<\/code><\/pre>\n<p><\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u043c \u0437\u0430\u0434\u0430\u0447\u0443 \u0443\u043f\u0430\u043a\u043e\u0432\u043a\u0438 \u043d\u0430 \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u043d\u0430 merge request \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043e\u043c\u043c\u0438\u0442\u043e\u0432 \u0432 \u043c\u0430\u0441\u0442\u0435\u0440:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">pack and deploy job:\n  # snip\n  only:\n    - merge_request\n    - master<\/code><\/pre>\n<p><\/p>\n<p>\u041a\u0430\u043a \u0432\u0438\u0434\u043d\u043e, \u0432\u0441\u0451 \u043f\u0440\u043e\u0441\u0442\u043e \u0438 \u043f\u0440\u044f\u043c\u043e\u043b\u0438\u043d\u0435\u0439\u043d\u043e.<\/p>\n<p><\/p>\n<p>\u0422\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u043d\u0430 \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043d\u0438\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0435\u0441\u043b\u0438 \u0441\u043e\u0437\u0434\u0430\u043d merge request \u0441 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u0439 \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u0438\u043b\u0438 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u0432\u0435\u0442\u043a\u043e\u0439:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">  rules:\n    - if: $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == &quot;master&quot;<\/code><\/pre>\n<p><\/p>\n<p>\u0412 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u0445 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.gitlab.com\/ee\/ci\/variables\/predefined_variables.html\">\u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0435 \u0437\u0434\u0435\u0441\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435<\/a><\/noindex>; \u043f\u0440\u0430\u0432\u0438\u043b\u0430 <code>rules<\/code> \u043d\u0435 \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u044b \u0441 \u043f\u0440\u0430\u0432\u0438\u043b\u0430\u043c\u0438 <code>only\/except<\/code>.<\/p>\n<p><\/p>\n<h3 id=\"nastroyka-sohraneniya-artefaktov\">\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u043e\u0432<\/h3>\n<p><\/p>\n<p>\u0412\u043e \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0437\u0430\u0434\u0430\u0447\u0438 <code>build job<\/code> \u0443 \u043d\u0430\u0441 \u0431\u0443\u0434\u0443\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u044b \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u044b \u0441\u0431\u043e\u0440\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0437\u0430\u0434\u0430\u0447\u0430\u0445. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e \u0437\u0430\u0434\u0430\u0447\u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u0443\u0442\u0438, \u0444\u0430\u0439\u043b\u044b \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043d\u0443\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438 \u043f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0437\u0430\u0434\u0430\u0447\u0430\u0445, \u0432 \u043a\u043b\u044e\u0447 <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.gitlab.com\/ee\/ci\/yaml\/#artifacts\"><code>artifacts<\/code><\/a><\/noindex>:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">build job:\n  # snip\n  artifacts:\n    paths:\n      - path\/to\/build\/artifacts\n      - another\/path\n      - MyCoolLib.*\/bin\/Release\/*<\/code><\/pre>\n<p><\/p>\n<p>\u041f\u0443\u0442\u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442 wildcards, \u0447\u0442\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u0442 \u0438\u0445 \u0437\u0430\u0434\u0430\u043d\u0438\u0435.<\/p>\n<p><\/p>\n<p>\u0415\u0441\u043b\u0438 \u0437\u0430\u0434\u0430\u0447\u0430 \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u044b, \u0442\u043e \u043a\u0430\u0436\u0434\u0430\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430 \u0441\u043c\u043e\u0436\u0435\u0442 \u0438\u0445 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043a \u043d\u0438\u043c \u0434\u043e\u0441\u0442\u0443\u043f \u2014 \u043e\u043d\u0438 \u0431\u0443\u0434\u0443\u0442 \u0440\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430\u0442\u044c\u0441\u044f \u043f\u043e \u0442\u0435\u043c \u0436\u0435 \u043f\u0443\u0442\u044f\u043c \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043a\u043e\u0440\u043d\u044f \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0431\u044b\u043b\u0438 \u0441\u043e\u0431\u0440\u0430\u043d\u044b \u0438\u0437 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438. \u0422\u0430\u043a \u0436\u0435 \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u044b \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0434\u043b\u044f \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u044f \u043d\u0430 \u0441\u0430\u0439\u0442\u0435.<\/p>\n<p><\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c, \u043a\u043e\u0433\u0434\u0430 \u0443 \u043d\u0430\u0441 \u0433\u043e\u0442\u043e\u0432 (\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u0435\u043d) \u043a\u0430\u0440\u043a\u0430\u0441 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438, \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043a \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044e \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432 \u0434\u043b\u044f \u0437\u0430\u0434\u0430\u0447.<\/p>\n<p><\/p>\n<h3 id=\"pishem-skripty\">\u041f\u0438\u0448\u0435\u043c \u0441\u043a\u0440\u0438\u043f\u0442\u044b<\/h3>\n<p><\/p>\n<p>\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u043a\u043e\u0433\u0434\u0430-\u0442\u043e \u0434\u0430\u0432\u043d\u043e, \u0432 \u0434\u0430\u043b\u0451\u043a\u043e\u0439-\u0434\u0430\u043b\u0451\u043a\u043e\u0439 \u0433\u0430\u043b\u0430\u043a\u0442\u0438\u043a\u0435, \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442\u044b (\u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0438 \u043d\u0430 .net) \u0438\u0437 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0431\u044b\u043b\u043e \u0431\u043e\u043b\u044c\u044e. \u0421\u0435\u0439\u0447\u0430\u0441 \u0436\u0435 \u0441\u043e\u0431\u0440\u0430\u0442\u044c, \u043f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438 \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442 \u043c\u043e\u0436\u043d\u043e \u0432 3 \u043a\u043e\u043c\u0430\u043d\u0434\u044b:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">dotnet build\ndotnet test\ndotnet pack<\/code><\/pre>\n<p><\/p>\n<p>\u0415\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0435\u0441\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u044e\u0430\u043d\u0441\u044b, \u0438\u0437-\u0437\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043c\u044b \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0443\u0441\u043b\u043e\u0436\u043d\u0438\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u044b.<\/p>\n<p><\/p>\n<ol>\n<li>\u041c\u044b \u0445\u043e\u0442\u0438\u043c \u0440\u0435\u043b\u0438\u0437\u043d\u0443\u044e, \u0430 \u043d\u0435 \u043e\u0442\u043b\u0430\u0434\u043e\u0447\u043d\u0443\u044e \u0441\u0431\u043e\u0440\u043a\u0443, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043a \u043a\u0430\u0436\u0434\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c <code>-c Release<\/code><\/li>\n<li>\u041f\u0440\u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u043e \u043f\u043e\u043a\u0440\u044b\u0442\u0438\u0438 \u043a\u043e\u0434\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0430\u043d\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440 \u043f\u043e\u043a\u0440\u044b\u0442\u0438\u044f \u0432 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438:\n<ol>\n<li>\u0412\u043e \u0432\u0441\u0435 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u0430\u043a\u0435\u0442 <code>coverlet.msbuild<\/code>: <code>dotnet add package coverlet.msbuild<\/code> \u0438\u0437 \u043f\u0430\u043f\u043a\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430<\/li>\n<li>\u0412 \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0442\u0435\u0441\u0442\u043e\u0432 \u0434\u043e\u0431\u0430\u0432\u0438\u043c <code>\/p:CollectCoverage=true<\/code><\/li>\n<li>\u0412 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e \u0437\u0430\u0434\u0430\u0447\u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u043a\u043b\u044e\u0447 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u043f\u043e\u043a\u0440\u044b\u0442\u0438\u044f (\u0441\u043c. \u043d\u0438\u0436\u0435)<\/li>\n<\/ol>\n<\/li>\n<li>\u041f\u0440\u0438 \u0443\u043f\u0430\u043a\u043e\u0432\u043a\u0435 \u043a\u043e\u0434\u0430 \u0432 nuget-\u043f\u0430\u043a\u0435\u0442\u044b \u0437\u0430\u0434\u0430\u0434\u0438\u043c \u0432\u044b\u0445\u043e\u0434\u043d\u0443\u044e \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e \u0434\u043b\u044f \u043f\u0430\u043a\u0435\u0442\u043e\u0432: <code>-o .<\/code><\/li>\n<\/ol>\n<p><\/p>\n<h4 id=\"sobiraem-dannye-pokrytiya-koda\">\u0421\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u043a\u0440\u044b\u0442\u0438\u044f \u043a\u043e\u0434\u0430<\/h4>\n<p><\/p>\n<p>Coverlet \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0442\u0435\u0441\u0442\u043e\u0432 \u0432\u044b\u0432\u043e\u0434\u0438\u0442 \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u044c \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0443 \u043f\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0443:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">Calculating coverage result...\n  Generating report 'C:Usersxxxsourcereposmy-projectmyProject.testscoverage.json'\n\n+-------------+--------+--------+--------+\n| Module      | Line   | Branch | Method |\n+-------------+--------+--------+--------+\n| project 1   | 83,24% | 66,66% | 92,1%  |\n+-------------+--------+--------+--------+\n| project 2   | 87,5%  | 50%    | 100%   |\n+-------------+--------+--------+--------+\n| project 3   | 100%   | 83,33% | 100%   |\n+-------------+--------+--------+--------+\n\n+---------+--------+--------+--------+\n|         | Line   | Branch | Method |\n+---------+--------+--------+--------+\n| Total   | 84,27% | 65,76% | 92,94% |\n+---------+--------+--------+--------+\n| Average | 90,24% | 66,66% | 97,36% |\n+---------+--------+--------+--------+<\/code><\/pre>\n<p><\/p>\n<p>GitLab \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043f\u043e\u0442\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432 \u0432\u0438\u0434\u0435 \u0431\u0435\u0439\u0434\u0436\u0430. \u0420\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445 \u0437\u0430\u0434\u0430\u0447\u0438 \u0441 \u043a\u043b\u044e\u0447\u043e\u043c <code>coverage<\/code>; \u0432 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0438 \u0434\u043e\u043b\u0436\u043d\u0430 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c capture-\u0433\u0440\u0443\u043f\u043f\u0430, \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0438 \u0431\u0443\u0434\u0435\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043e \u0432 \u0431\u0435\u0439\u0434\u0436:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">test and cover job:\n  # snip\n  coverage: \/|s*Totals*|s*(d+[,.]d+%)\/<\/code><\/pre>\n<p><\/p>\n<p>\u0417\u0434\u0435\u0441\u044c \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0443 \u0438\u0437 \u0441\u0442\u0440\u043e\u043a\u0438 \u0441 \u043e\u0431\u0449\u0438\u043c \u043f\u043e\u043a\u0440\u044b\u0442\u0438\u0435\u043c \u043f\u043e \u043b\u0438\u043d\u0438\u044f\u043c.<\/p>\n<p><\/p>\n<h3 id=\"publikuem-pakety-i-dokumentaciyu\">\u041f\u0443\u0431\u043b\u0438\u043a\u0443\u0435\u043c \u043f\u0430\u043a\u0435\u0442\u044b \u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e<\/h3>\n<p><\/p>\n<p>\u041e\u0431\u0430 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0443 \u043d\u0430\u0441 \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u044b \u043d\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u044d\u0442\u0430\u043f \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u0430 \u2014 \u0440\u0430\u0437 \u0443\u0436 \u0441\u0431\u043e\u0440\u043a\u0430 \u0438 \u0442\u0435\u0441\u0442\u044b \u043f\u0440\u043e\u0448\u043b\u0438, \u043c\u043e\u0436\u043d\u043e \u0438 \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0441 \u043c\u0438\u0440\u043e\u043c \u043d\u0430\u0440\u0430\u0431\u043e\u0442\u043a\u0430\u043c\u0438.<\/p>\n<p><\/p>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u044e \u0432 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u043f\u0430\u043a\u0435\u0442\u043e\u0432:<\/p>\n<p><\/p>\n<ol>\n<li>\n<p>\u0415\u0441\u043b\u0438 \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u043d\u0435 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0444\u0430\u0439\u043b \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 nuget (<code>nuget.config<\/code>), \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043d\u043e\u0432\u044b\u0439: <code>dotnet new nugetconfig<\/code><\/p>\n<p><\/p>\n<p><em>\u0417\u0430\u0447\u0435\u043c:<\/em> \u0432 \u043e\u0431\u0440\u0430\u0437\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0437\u0430\u043f\u0440\u0435\u0449\u0451\u043d \u0434\u043e\u0441\u0442\u0443\u043f \u043d\u0430 \u0437\u0430\u043f\u0438\u0441\u044c \u043a \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u043c (\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0439 \u0438 \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u0439) \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f\u043c. \u0427\u0442\u043e\u0431\u044b \u043d\u0435 \u043b\u043e\u0432\u0438\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0438, \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043d\u043e\u0432\u0443\u044e \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0443\u044e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e \u0438 \u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u043d\u0435\u0439.<\/p>\n<p>\n<\/li>\n<li>\u0414\u043e\u0431\u0430\u0432\u0438\u043c \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0443\u044e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e \u043d\u043e\u0432\u044b\u0439 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u043f\u0430\u043a\u0435\u0442\u043e\u0432: <code>nuget sources add -name &lt;name&gt; -source &lt;url&gt; -username &lt;organization&gt; -password &lt;gitlab variable&gt; -configfile nuget.config -StorePasswordInClearText<\/code>\n<ol>\n<li><code>name<\/code> \u2014 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u0438\u043c\u044f \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430, \u043d\u0435 \u043f\u0440\u0438\u043d\u0438\u0446\u0438\u043f\u0438\u0430\u043b\u044c\u043d\u043e<\/li>\n<li><code>url<\/code> \u2014 URL \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 \u0438\u0437 \u044d\u0442\u0430\u043f\u0430 &quot;\u0413\u043e\u0442\u043e\u0432\u0438\u043c \u0430\u043a\u043a\u0430\u0443\u043d\u0442\u044b&quot;, \u043f. 6<\/li>\n<li><code>organization<\/code> \u2014 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0432 Azure DevOps<\/li>\n<li><code>gitlab variable<\/code> \u2014 \u0438\u043c\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0441 \u0442\u043e\u043a\u0435\u043d\u043e\u043c \u0434\u043e\u0441\u0442\u0443\u043f\u0430, \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0439 \u0432 GitLab (&quot;\u0413\u043e\u0442\u043e\u0432\u0438\u043c \u0430\u043a\u043a\u0430\u0443\u043d\u0442\u044b&quot;, \u043f. 11). \u0415\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 <code>$variableName<\/code><\/li>\n<li><code>-StorePasswordInClearText<\/code> \u2014 \u0445\u0430\u043a \u0434\u043b\u044f \u043e\u0431\u0445\u043e\u0434\u0430 \u043e\u0448\u0438\u0431\u043a\u0438 \u043e\u0442\u043a\u0430\u0437\u0430 \u0432 \u0434\u043e\u0441\u0442\u0443\u043f\u0435 (<noindex><a rel=\"nofollow\" href=\"https:\/\/discuss.circleci.com\/t\/nuget-private-registry-authorization-fails-with-access-denied-error\/33126\">\u043d\u0435 \u044f \u043f\u0435\u0440\u0432\u044b\u0439 \u043d\u0430 \u044d\u0442\u0438 \u0433\u0440\u0430\u0431\u043b\u0438 \u043d\u0430\u0441\u0442\u0443\u043f\u0438\u043b<\/a><\/noindex>)<\/li>\n<li>\u041d\u0430 \u0441\u043b\u0443\u0447\u0430\u0439 \u043e\u0448\u0438\u0431\u043e\u043a \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u043c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c <code>-verbosity detailed<\/code><\/li>\n<\/ol>\n<\/li>\n<li>\u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u043f\u0430\u043a\u0435\u0442 \u0432 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a: <code>nuget push -source &lt;name&gt; -skipduplicate -apikey &lt;key&gt; *.nupkg<\/code>\n<ol>\n<li>\u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0432\u0441\u0435 \u043f\u0430\u043a\u0435\u0442\u044b \u0438\u0437 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 <code>*.nupkg<\/code>.<\/li>\n<li><code>name<\/code> \u2014 \u0438\u0437 \u0448\u0430\u0433\u0430 \u0432\u044b\u0448\u0435.<\/li>\n<li><code>key<\/code> \u2014 \u043b\u044e\u0431\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430. \u0412 Azure DevOps \u0432 \u043e\u043a\u043d\u0435 Connect to feed \u0432\u0441\u0435\u0433\u0434\u0430 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u043f\u0440\u0438\u0432\u043e\u0434\u044f\u0442 \u0441\u0442\u0440\u043e\u043a\u0443 <code>az<\/code>.<\/li>\n<li><code>-skipduplicate<\/code> \u2014 \u043f\u0440\u0438 \u043f\u043e\u043f\u044b\u0442\u043a\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u043f\u0430\u043a\u0435\u0442 \u0431\u0435\u0437 \u044d\u0442\u043e\u0433\u043e \u043a\u043b\u044e\u0447\u0430 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u0432\u0435\u0440\u043d\u0451\u0442 \u043e\u0448\u0438\u0431\u043a\u0443 <code>409 Conflict<\/code>; \u0441 \u043a\u043b\u044e\u0447\u043e\u043c \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u043f\u0443\u0449\u0435\u043d\u0430.<\/li>\n<\/ol>\n<\/li>\n<\/ol>\n<p><\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u043c \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438:<\/p>\n<p><\/p>\n<ol>\n<li>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430, \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438, \u0432 \u0432\u0435\u0442\u043a\u0435 master, \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442 docfx. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0438\u0437 \u043a\u043e\u0440\u043d\u044f \u043d\u0430\u0434\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u0443 <code>docfx init<\/code> \u0438 \u0432 \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435 \u0437\u0430\u0434\u0430\u0434\u0438\u043c \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 <noindex><a rel=\"nofollow\" href=\"https:\/\/dotnet.github.io\/docfx\/tutorial\/walkthrough\/walkthrough_create_a_docfx_project.html\">\u0437\u0434\u0435\u0441\u044c<\/a><\/noindex>.\n<ol>\n<li>\u041f\u0440\u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0435 \u0432\u0430\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0432\u044b\u0445\u043e\u0434\u043d\u0443\u044e \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e <code>..public<\/code> \u2014 GitLab \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0431\u0435\u0440\u0451\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043f\u0430\u043f\u043a\u0438 public \u0432 \u043a\u043e\u0440\u043d\u0435 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f \u043a\u0430\u043a \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u0434\u043b\u044f Pages. \u0422.\u043a. \u043f\u0440\u043e\u0435\u043a\u0442 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430\u0442\u044c\u0441\u044f \u0432\u043e \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0439 \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u043f\u0430\u043f\u043a\u0435 \u2014 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0432 \u043f\u0443\u0442\u044c \u0432\u044b\u0445\u043e\u0434 \u043d\u0430 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0432\u0432\u0435\u0440\u0445.<\/li>\n<\/ol>\n<\/li>\n<li>\u041e\u0442\u043f\u0440\u0430\u0432\u0438\u043c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 GitLab.<\/li>\n<li>\u0412 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u0430 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0437\u0430\u0434\u0430\u0447\u0443 <code>pages<\/code> (\u0437\u0430\u0440\u0435\u0437\u0435\u0440\u0432\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0441\u043b\u043e\u0432\u043e \u0434\u043b\u044f \u0437\u0430\u0434\u0430\u0447 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \u0441\u0430\u0439\u0442\u043e\u0432 \u0432 GitLab Pages):\n<ol>\n<li>\u0421\u043a\u0440\u0438\u043f\u0442:\n<ol>\n<li><code>nuget install docfx.console -version 2.51.0<\/code> \u2014 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442 docfx; \u0432\u0435\u0440\u0441\u0438\u044f \u0443\u043a\u0430\u0437\u0430\u043d\u0430 \u0434\u043b\u044f \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043f\u0443\u0442\u0435\u0439 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043f\u0430\u043a\u0435\u0442\u0430.<\/li>\n<li><code>.docfx.console.2.51.0toolsdocfx.exe .docfx_projectdocfx.json<\/code> \u2014 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e<\/li>\n<\/ol>\n<\/li>\n<li>\u0423\u0437\u0435\u043b artifacts:<\/li>\n<\/ol>\n<\/li>\n<\/ol>\n<p><\/p>\n<pre><code class=\"plaintext\">pages:\n  # snip\n  artifacts:\n    paths:\n      - public<\/code><\/pre>\n<p><\/p>\n<h4 id=\"liricheskoe-otstuplenie-pro-docfx\">\u041b\u0438\u0440\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043e\u0442\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u0435 \u043f\u0440\u043e docfx<\/h4>\n<p><\/p>\n<p>\u0420\u0430\u043d\u044c\u0448\u0435 \u043f\u0440\u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u044f \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u043b \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u043a\u043e\u0434\u0430 \u0434\u043b\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u043a\u0430\u043a \u0444\u0430\u0439\u043b \u0440\u0435\u0448\u0435\u043d\u0438\u044f. \u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043c\u0438\u043d\u0443\u0441 \u2014 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f \u0438 \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432. \u0412 \u0441\u043b\u0443\u0447\u0430\u0435, \u0435\u0441\u043b\u0438 \u044d\u0442\u043e \u043d\u0435 \u043d\u0443\u0436\u043d\u043e, \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0434\u0430\u0442\u044c \u0442\u0430\u043a\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0443 <code>metadata.src<\/code>:<\/p>\n<p><\/p>\n<pre><code class=\"json\">{\n  &quot;metadata&quot;: [\n    {\n      &quot;src&quot;: [\n        {\n          &quot;src&quot;: &quot;..\/&quot;,\n          &quot;files&quot;: [\n            &quot;**\/*.csproj&quot;\n          ],\n          &quot;exclude&quot;:[\n            &quot;*.tests*\/**&quot;\n          ]\n        }\n      ],\n      \/\/ --- snip ---\n    },\n    \/\/ --- snip ---\n  ],\n  \/\/ --- snip ---\n}<\/code><\/pre>\n<p><\/p>\n<ol>\n<li><code>metadata.src.src: &quot;..\/&quot;<\/code> \u2014 \u0432\u044b\u0445\u043e\u0434\u0438\u043c \u043d\u0430 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0432\u0432\u0435\u0440\u0445 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f <code>docfx.json<\/code>, \u0442.\u043a. \u0432 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u0430\u0445 \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043f\u043e\u0438\u0441\u043a \u0432\u0432\u0435\u0440\u0445 \u043f\u043e \u0434\u0435\u0440\u0435\u0432\u0443 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0439.<\/li>\n<li><code>metadata.src.files: [&quot;**\/*.csproj&quot;]<\/code> \u2014 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u0430\u0442\u0442\u0435\u0440\u043d, \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u0432\u0441\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u044b C# \u0438\u0437 \u0432\u0441\u0435\u0445 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0439.<\/li>\n<li><code>metadata.src.exclude: [&quot;*.tests*\/**&quot;]<\/code> \u2014 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u0430\u0442\u0442\u0435\u0440\u043d, \u0438\u0441\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0432\u0441\u0451 \u0438\u0437 \u043f\u0430\u043f\u043e\u043a \u0441 <code>.tests<\/code> \u0432 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0438<\/li>\n<\/ol>\n<p><\/p>\n<h3 id=\"promezhutochnyy-itog\">\u041f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0439 \u0438\u0442\u043e\u0433<\/h3>\n<p><\/p>\n<p>\u0412\u043e\u0442 \u0442\u0430\u043a\u0443\u044e \u043f\u0440\u043e\u0441\u0442\u0443\u044e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0431\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e \u0437\u0430 \u043f\u043e\u043b\u0447\u0430\u0441\u0430 \u0438 \u043f\u0430\u0440\u0443 \u0447\u0430\u0448\u0435\u043a \u043a\u043e\u0444\u0435, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u043c \u0437\u0430\u043f\u0440\u043e\u0441\u0435 \u0441\u043b\u0438\u044f\u043d\u0438\u044f \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0435 \u0432 \u043c\u0430\u0441\u0442\u0435\u0440 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c, \u0447\u0442\u043e \u043a\u043e\u0434 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0438 \u0442\u0435\u0441\u0442\u044b \u043f\u0440\u043e\u0445\u043e\u0434\u044f\u0442, \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u043f\u0430\u043a\u0435\u0442, \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e \u0438 \u0440\u0430\u0434\u043e\u0432\u0430\u0442\u044c \u0433\u043b\u0430\u0437 \u043a\u0440\u0430\u0441\u0438\u0432\u044b\u043c\u0438 \u0431\u0435\u0439\u0434\u0436\u0438\u043a\u0430\u043c\u0438 \u0432 README \u043f\u0440\u043e\u0435\u043a\u0442\u0430.<\/p>\n<p><\/p>\n<p>                        <b class=\"spoiler_title\">\u0418\u0442\u043e\u0433\u043e\u0432\u044b\u0439 .gitlab-ci.yml<\/b><\/p>\n<pre><code class=\"plaintext\">image: mcr.microsoft.com\/dotnet\/core\/sdk:3.1\n\nbefore_script:\n  - $PSVersionTable.PSVersion\n  - dotnet --version\n  - nuget help | select-string Version\n\nstages:\n  - build\n  - test\n  - deploy\n\nbuild job:\n  stage: build\n  script:\n    - dotnet build -c Release\n  tags:\n    - windows\n  only:\n    - merge_requests\n    - master\n  artifacts:\n    paths:\n      - your\/path\/to\/binaries\n\ntest and cover job:\n  stage: test\n  tags:\n    - windows\n  script:\n    - dotnet test -c Release \/p:CollectCoverage=true\n  coverage: \/|s*Totals*|s*(d+[,.]d+%)\/\n  only:\n    - merge_requests\n    - master\n\npack and deploy job:\n  stage: deploy\n  tags:\n    - windows\n  script:\n    - dotnet pack -c Release -o .\n    - dotnet new nugetconfig\n    - 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\n    - nuget push -source feedName -skipduplicate -apikey az *.nupkg\n  only:\n    - master\n\npages:\n  tags:\n    - windows\n  stage: deploy\n  script:\n    - nuget install docfx.console -version 2.51.0\n    - $env:path = &quot;$env:path;$($(get-location).Path)&quot;\n    - .docfx.console.2.51.0toolsdocfx.exe .docfxdocfx.json\n  artifacts:\n    paths:\n      - public\n  only:\n    - master<\/code><\/pre>\n<p><\/p>\n<h4 id=\"kstati-o-beydzhikah\">\u041a\u0441\u0442\u0430\u0442\u0438 \u043e \u0431\u0435\u0439\u0434\u0436\u0438\u043a\u0430\u0445<\/h4>\n<p><\/p>\n<p>\u0420\u0430\u0434\u0438 \u043d\u0438\u0445 \u0432\u0435\u0434\u044c \u0432\u0441\u0451 \u0438 \u0437\u0430\u0442\u0435\u0432\u0430\u043b\u043e\u0441\u044c!<\/p>\n<p><\/p>\n<p>\u0411\u0435\u0439\u0434\u0436\u0438 \u0441\u043e \u0441\u0442\u0430\u0442\u0443\u0441\u0430\u043c\u0438 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u0430 \u0438 \u043f\u043e\u043a\u0440\u044b\u0442\u0438\u0435\u043c \u043a\u043e\u0434\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0432 GitLab \u0432 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445 CI\/CD \u0432 \u0431\u043b\u043e\u043a\u0435 Gtntral pipelines:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\u0420\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e \u043f\u043e CI\/CD \u0432 GitLab \u0434\u043b\u044f (\u043f\u043e\u0447\u0442\u0438) \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e\u0433\u043e \u043d\u043e\u0432\u0438\u0447\u043a\u0430\" src=\"\/wp-content\/uploads\/2020\/04\/cefa65f82eaf0e3f843ba66ec23a18e0.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u0411\u0435\u0439\u0434\u0436 \u0441\u043e \u0441\u0441\u044b\u043b\u043a\u043e\u0439 \u043d\u0430 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e \u044f \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u043b \u043d\u0430 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435 <noindex><a rel=\"nofollow\" href=\"https:\/\/shields.io\/\">Shields.io<\/a><\/noindex> \u2014 \u0442\u0430\u043c \u0432\u0441\u0451 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u044f\u043c\u043e\u043b\u0438\u043d\u0435\u0439\u043d\u043e, \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u0431\u0435\u0439\u0434\u0436 \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0435\u0433\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0437\u0430\u043f\u0440\u043e\u0441\u0430.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">![\u041f\u0440\u0438\u043c\u0435\u0440 \u0441 Shields.io](https:\/\/img.shields.io\/badge\/custom-badge-blue)<\/code><\/pre>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\u0420\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e \u043f\u043e CI\/CD \u0432 GitLab \u0434\u043b\u044f (\u043f\u043e\u0447\u0442\u0438) \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e\u0433\u043e \u043d\u043e\u0432\u0438\u0447\u043a\u0430\" src=\"\/wp-content\/uploads\/2020\/04\/1852aa7ead9aec94b7082ca78c8dc571.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Azure DevOps Artifacts \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0431\u0435\u0439\u0434\u0436\u0438 \u0434\u043b\u044f \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u0441 \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u0435\u043c \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0435 \u043d\u0430 \u0441\u0430\u0439\u0442\u0435 Azure DevOps \u043d\u0443\u0436\u043d\u043e \u043d\u0430\u0436\u0430\u0442\u044c \u043d\u0430 Create badge \u0443 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u0430\u043a\u0435\u0442\u0430 \u0438 \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c markdown-\u0440\u0430\u0437\u043c\u0435\u0442\u043a\u0443:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\u0420\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e \u043f\u043e CI\/CD \u0432 GitLab \u0434\u043b\u044f (\u043f\u043e\u0447\u0442\u0438) \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e\u0433\u043e \u043d\u043e\u0432\u0438\u0447\u043a\u0430\" src=\"\/wp-content\/uploads\/2020\/04\/8e795fb39ebd842a7059edd4736979d4.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\u0420\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e \u043f\u043e CI\/CD \u0432 GitLab \u0434\u043b\u044f (\u043f\u043e\u0447\u0442\u0438) \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e\u0433\u043e \u043d\u043e\u0432\u0438\u0447\u043a\u0430\" src=\"\/wp-content\/uploads\/2020\/04\/4ed90d9655d9b55a75bb5de7be7bd795.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<h3 id=\"dobavlyaem-krasoty\">\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043a\u0440\u0430\u0441\u043e\u0442\u044b<\/h3>\n<p><\/p>\n<h4 id=\"vydelyaem-obschie-fragmenty-konfiguracii\">\u0412\u044b\u0434\u0435\u043b\u044f\u0435\u043c \u043e\u0431\u0449\u0438\u0435 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u044b \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438<\/h4>\n<p><\/p>\n<p>\u0412\u043e \u0432\u0440\u0435\u043c\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0438 \u043f\u043e\u0438\u0441\u043a\u043e\u0432 \u043f\u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438, \u044f \u043d\u0430\u0442\u043a\u043d\u0443\u043b\u0441\u044f \u043d\u0430 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0443\u044e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c YAML \u2014 \u043f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u043e\u0432.<\/p>\n<p><\/p>\n<p>\u041a\u0430\u043a \u0432\u0438\u0434\u043d\u043e \u0438\u0437 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a \u0437\u0430\u0434\u0430\u0447, \u0432\u0441\u0435 \u043e\u043d\u0438 \u0442\u0440\u0435\u0431\u0443\u044e\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0442\u0435\u0433\u0430 <code>windows<\/code> \u0443 \u0440\u0430\u043d\u043d\u0435\u0440\u0430, \u0438 \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e\u0442 \u043f\u0440\u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0435 \u0432 \u043c\u0430\u0441\u0442\u0435\u0440\/\u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043d\u0430 \u0441\u043b\u0438\u044f\u043d\u0438\u0435 (\u043a\u0440\u043e\u043c\u0435 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438). \u0414\u043e\u0431\u0430\u0432\u0438\u043c \u044d\u0442\u043e \u0432\u043e \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u043c \u043f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">.common_tags: &amp;common_tags\n  tags:\n    - windows\n.common_only: &amp;common_only\n  only:\n    - merge_requests\n    - master<\/code><\/pre>\n<p><\/p>\n<p>\u0418 \u0442\u0435\u043f\u0435\u0440\u044c \u0432 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0438 \u0437\u0430\u0434\u0430\u0447\u0438 \u043c\u043e\u0436\u0435\u043c \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u043d\u044b\u0439 \u0440\u0430\u043d\u0435\u0435 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">build job:\n  &lt;&lt;: *common_tags\n  &lt;&lt;: *common_only<\/code><\/pre>\n<p><\/p>\n<p>\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u043e\u0432 \u0434\u043e\u043b\u0436\u043d\u044b \u043d\u0430\u0447\u0438\u043d\u0430\u0442\u044c\u0441\u044f \u0441 \u0442\u043e\u0447\u043a\u0438, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0431\u044b\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438 \u043a\u0430\u043a \u0437\u0430\u0434\u0430\u0447\u0430.<\/p>\n<p><\/p>\n<h4 id=\"versionirovanie-paketov\">\u0412\u0435\u0440\u0441\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0430\u043a\u0435\u0442\u043e\u0432<\/h4>\n<p><\/p>\n<p>\u041f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u043f\u0430\u043a\u0435\u0442\u0430 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043a\u043b\u044e\u0447\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438, \u0438 \u0432 \u0438\u0445 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u2014 \u0444\u0430\u0439\u043b\u044b \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432; \u043d\u0430\u0439\u0434\u044f \u0443\u0437\u0435\u043b Version, \u043e\u043d \u0431\u0435\u0440\u0451\u0442 \u0435\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043a\u0430\u043a \u0432\u0435\u0440\u0441\u0438\u044e \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c\u043e\u0433\u043e \u043f\u0430\u043a\u0435\u0442\u0430. \u0412\u044b\u0445\u043e\u0434\u0438\u0442, \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u043f\u0430\u043a\u0435\u0442 \u0441 \u043d\u043e\u0432\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0435\u0439, \u043d\u0443\u0436\u043d\u043e \u043b\u0438\u0431\u043e \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0435\u0451 \u0432 \u0444\u0430\u0439\u043b\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u043b\u0438\u0431\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u043a\u0430\u043a \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438.<\/p>\n<p><\/p>\n<p>\u0414\u043e\u0431\u0430\u0432\u0438\u043c \u0435\u0449\u0451 \u043e\u0434\u043d\u0443 \u0445\u043e\u0442\u0435\u043b\u043a\u0443 \u2014 \u043f\u0443\u0441\u0442\u044c \u043c\u043b\u0430\u0434\u0448\u0438\u0435 \u0434\u0432\u0430 \u043d\u043e\u043c\u0435\u0440\u0430 \u0432 \u0432\u0435\u0440\u0441\u0438\u0438 \u0431\u0443\u0434\u0443\u0442 \u0433\u043e\u0434\u043e\u043c \u0438 \u0434\u0430\u0442\u043e\u0439 \u0441\u0431\u043e\u0440\u043a\u0438 \u043f\u0430\u043a\u0435\u0442\u0430, \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u043f\u0440\u0435\u0440\u0435\u043b\u0438\u0437\u043d\u044b\u0435 \u0432\u0435\u0440\u0441\u0438\u0438. \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u044d\u0442\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0444\u0430\u0439\u043b \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u043f\u0435\u0440\u0435\u0434 \u043a\u0430\u0436\u0434\u043e\u0439 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u043e\u0439 \u043c\u043e\u0436\u043d\u043e, \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u2014 \u043d\u043e \u043c\u043e\u0436\u043d\u043e \u0432\u0435\u0434\u044c \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u0438 \u0432 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u0435, \u0441\u043e\u0431\u0438\u0440\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044e \u043f\u0430\u043a\u0435\u0442\u0430 \u0438\u0437 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u044f \u0447\u0435\u0440\u0435\u0437 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438.<\/p>\n<p><\/p>\n<p>\u0423\u0441\u043b\u043e\u0432\u0438\u043c\u0441\u044f, \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u0432 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0438 \u043a\u043e\u043c\u043c\u0438\u0442\u0430 \u0435\u0441\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0430 \u0432\u0438\u0434\u0430 <code>release (v.\/ver.\/version) &lt;version number&gt; (rev.\/revision &lt;revision&gt;)?<\/code>, \u0442\u043e \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0437 \u044d\u0442\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0431\u0440\u0430\u0442\u044c \u0432\u0435\u0440\u0441\u0438\u044e \u043f\u0430\u043a\u0435\u0442\u0430, \u0434\u043e\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0435\u0451 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0434\u0430\u0442\u043e\u0439 \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u043a\u0430\u043a \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 <code>dotnet pack<\/code>. \u0412 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u2014 \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u043f\u0430\u043a\u0435\u0442.<\/p>\n<p><\/p>\n<p>\u0414\u0430\u043d\u043d\u0443\u044e \u0437\u0430\u0434\u0430\u0447\u0443 \u0440\u0435\u0448\u0430\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0441\u043a\u0440\u0438\u043f\u0442: <\/p>\n<p><\/p>\n<pre><code class=\"powershell\"># \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u0441\u0442\u0440\u043e\u043a\u0438 \u0441 \u0432\u0435\u0440\u0441\u0438\u0435\u0439\n$rx = &quot;releases+(v.?|ver.?|version)s*(?&lt;maj&gt;d+)(?&lt;min&gt;.d+)?(?&lt;rel&gt;.d+)?s*((rev.?|revision)?s+(?&lt;rev&gt;[a-zA-Z0-9-_]+))?&quot;\n# \u0438\u0449\u0435\u043c \u0441\u0442\u0440\u043e\u043a\u0443 \u0432 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0438 \u043a\u043e\u043c\u043c\u0438\u0442\u0430, \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0435\u043c\u043e\u043c \u0432 \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 \u043f\u0440\u0435\u0434\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c\u044b\u0445 GitLab'\u043e\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445\n$found = $env:CI_COMMIT_MESSAGE -match $rx\n# \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u0439 \u043d\u0435\u0442 - \u0432\u044b\u0445\u043e\u0434\u0438\u043c\nif (!$found) { Write-Output &quot;no release info found, aborting&quot;; exit }\n# \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u043c \u043c\u0430\u0436\u043e\u0440\u043d\u0443\u044e \u0438 \u043c\u0438\u043d\u043e\u0440\u043d\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u0438\n$maj = $matches['maj']\n$min = $matches['min']\n# \u0435\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043d\u043e\u043c\u0435\u0440 \u0440\u0435\u043b\u0438\u0437\u0430 - \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0435\u0433\u043e, \u0438\u043d\u0430\u0447\u0435 - \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0433\u043e\u0434\nif ($matches.ContainsKey('rel')) { $rel = $matches['rel'] } else { $rel = &quot;.$(get-date -format &quot;yyyy&quot;)&quot; }\n# \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043d\u043e\u043c\u0435\u0440\u0430 \u0441\u0431\u043e\u0440\u043a\u0438 - \u0442\u0435\u043a\u0443\u0449\u0438\u0435 \u043c\u0435\u0441\u044f\u0446 \u0438 \u0434\u0435\u043d\u044c\n$bld = $(get-date -format &quot;MMdd&quot;)\n# \u0435\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e \u043f\u0440\u0435\u0440\u0435\u043b\u0438\u0437\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 - \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0438\u0445 \u0432 \u0432\u0435\u0440\u0441\u0438\u044e\nif ($matches.ContainsKey('rev')) { $rev = &quot;-$($matches['rev'])&quot; } else { $rev = '' }\n# \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u0435\u0434\u0438\u043d\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443 \u0432\u0435\u0440\u0441\u0438\u0438\n$version = &quot;$maj$min$rel.$bld$rev&quot;\n# \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u043f\u0430\u043a\u0435\u0442\u044b\ndotnet pack -c Release -o . \/p:Version=$version<\/code><\/pre>\n<p><\/p>\n<p>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u043a\u0440\u0438\u043f\u0442 \u0432 \u0437\u0430\u0434\u0430\u0447\u0443 <code>pack and deploy job<\/code> \u0438 \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0435\u043c \u0441\u0431\u043e\u0440\u043a\u0443 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u0441\u0442\u0440\u043e\u0433\u043e \u043f\u0440\u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u0438 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0438 \u043a\u043e\u043c\u043c\u0438\u0442\u0430.<\/p>\n<p><\/p>\n<h2 id=\"itogo\">\u0418\u0442\u043e\u0433\u043e<\/h2>\n<p><\/p>\n<p>\u041f\u043e\u0442\u0440\u0430\u0442\u0438\u0432 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u043f\u043e\u043b\u0447\u0430\u0441\u0430-\u0447\u0430\u0441 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043d\u0430 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438, \u043e\u0442\u043b\u0430\u0434\u043a\u0443 \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u043c powershell \u0438, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u043f\u0430\u0440\u0443 \u043d\u0435\u0443\u0434\u0430\u0447\u043d\u044b\u0445 \u0437\u0430\u043f\u0443\u0441\u043a\u043e\u0432, \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u043d\u0435\u0441\u043b\u043e\u0436\u043d\u0443\u044e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e \u0434\u043b\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u0440\u0443\u0442\u0438\u043d\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447. <\/p>\n<p><\/p>\n<p>\u041a\u043e\u043d\u0435\u0447\u043d\u043e, GitLab CI\/CD \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u043e\u0431\u0448\u0438\u0440\u043d\u0435\u0435 \u0438 \u043c\u043d\u043e\u0433\u043e\u0433\u0440\u0430\u043d\u043d\u0435\u0435, \u0447\u0435\u043c \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0447\u0442\u0435\u043d\u0438\u044f \u044d\u0442\u043e\u0433\u043e \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u0430 \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.gitlab.com\/ee\/ci\/README.html\">\u044d\u0442\u043e \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u043d\u0435 \u0442\u0430\u043a<\/a><\/noindex>. \u0422\u0430\u043c \u0434\u0430\u0436\u0435 <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.gitlab.com\/ee\/topics\/autodevops\/\">Auto DevOps \u0435\u0441\u0442\u044c<\/a><\/noindex>, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0439 <\/p>\n<p><\/p>\n<blockquote><p>automatically detect, build, test, deploy, and monitor your applications<\/p><\/blockquote>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0432 \u043f\u043b\u0430\u043d\u0430\u0445 \u2014 \u0441\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d \u0434\u043b\u044f \u0440\u0430\u0437\u0432\u0451\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0432 Azure, \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c Pulumi \u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435\u043c \u0446\u0435\u043b\u0435\u0432\u043e\u0433\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f, \u0447\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u043e \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435.<\/p>\n<p>\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/498436\/\">habr.com<\/a> <\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0418\u043b\u0438 \u043a\u0430\u043a \u043e\u0431\u0437\u0430\u0432\u0435\u0441\u0442\u0438\u0441\u044c \u043a\u0440\u0430\u0441\u0438\u0432\u044b\u043c\u0438 \u0431\u0435\u0439\u0434\u0436\u0438\u043a\u0430\u043c\u0438 \u0434\u043b\u044f \u0441\u0432\u043e\u0435\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0437\u0430 \u043e\u0434\u0438\u043d \u0432\u0435\u0447\u0435\u0440 \u043d\u0435\u043d\u0430\u043f\u0440\u044f\u0436\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0438\u043d\u0433\u0430 \u041d\u0430\u0432\u0435\u0440\u043d\u043e\u0435, \u0443 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430, \u0438\u043c\u0435\u044e\u0449\u0435\u0433\u043e \u0445\u043e\u0442\u044f \u0431\u044b \u043e\u0434\u0438\u043d \u043f\u0435\u0442-\u043f\u0440\u043e\u0435\u043a\u0442, \u0432 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u0437\u0443\u0434 \u043d\u0430 \u0442\u0435\u043c\u0443 \u043a\u0440\u0430\u0441\u0438\u0432\u044b\u0445 \u0431\u0435\u0439\u0434\u0436\u0438\u043a\u043e\u0432 \u0441\u043e \u0441\u0442\u0430\u0442\u0443\u0441\u0430\u043c\u0438, \u043f\u043e\u043a\u0440\u044b\u0442\u0438\u0435\u043c \u043a\u043e\u0434\u0430, \u0432\u0435\u0440\u0441\u0438\u044f\u043c\u0438 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u0432 nuget\u2026 \u0418 \u043c\u0435\u043d\u044f \u044d\u0442\u043e\u0442 \u0437\u0443\u0434 \u043f\u0440\u0438\u0432\u0451\u043b \u043a \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044e \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438. \u0412 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0438 \u043a \u0435\u0451 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044e \u044f [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":78954,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-78953","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 4.9.10 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0418\u043b\u0438 \u043a\u0430\u043a \u043e\u0431\u0437\u0430\u0432\u0435\u0441\u0442\u0438\u0441\u044c \u043a\u0440\u0430\u0441\u0438\u0432\u044b\u043c\u0438 \u0431\u0435\u0439\u0434\u0436\u0438\u043a\u0430\u043c\u0438 \u0434\u043b\u044f \u0441\u0432\u043e\u0435\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0437\u0430 \u043e\u0434\u0438\u043d \u0432\u0435\u0447\u0435\u0440 \u043d\u0435\u043d\u0430\u043f\u0440\u044f\u0436\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0438\u043d\u0433\u0430 \u041d\u0430\u0432\u0435\u0440\u043d\u043e\u0435, \u0443 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430, \u0438\u043c\u0435\u044e\u0449\u0435\u0433\u043e \u0445\u043e\u0442\u044f \u0431\u044b \u043e\u0434\u0438\u043d \u043f\u0435\u0442-\u043f\u0440\u043e\u0435\u043a\u0442, \u0432 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u0437\u0443\u0434 \u043d\u0430 \u0442\u0435\u043c\u0443 \u043a\u0440\u0430\u0441\u0438\u0432\u044b\u0445 \u0431\u0435\u0439\u0434\u0436\u0438\u043a\u043e\u0432 \u0441\u043e \u0441\u0442\u0430\u0442\u0443\u0441\u0430\u043c\u0438, \u043f\u043e\u043a\u0440\u044b\u0442\u0438\u0435\u043c \u043a\u043e\u0434\u0430, \u0432\u0435\u0440\u0441\u0438\u044f\u043c\u0438 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u0432 nuget\u2026 \u0418 \u043c\u0435\u043d\u044f \u044d\u0442\u043e\u0442 \u0437\u0443\u0434 \u043f\u0440\u0438\u0432\u0451\u043b \u043a \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044e \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438. \u0412 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0438 \u043a \u0435\u0451 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044e \u044f\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/rukovodstvo-po-ci-cd-v-gitlab-dlya-pochti-absolyutnogo-novichka\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.10\" \/>\n\t\t<meta property=\"og:locale\" content=\"it_IT\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u0420\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e \u043f\u043e CI\/CD \u0432 GitLab \u0434\u043b\u044f (\u043f\u043e\u0447\u0442\u0438) \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e\u0433\u043e \u043d\u043e\u0432\u0438\u0447\u043a\u0430 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0418\u043b\u0438 \u043a\u0430\u043a \u043e\u0431\u0437\u0430\u0432\u0435\u0441\u0442\u0438\u0441\u044c \u043a\u0440\u0430\u0441\u0438\u0432\u044b\u043c\u0438 \u0431\u0435\u0439\u0434\u0436\u0438\u043a\u0430\u043c\u0438 \u0434\u043b\u044f \u0441\u0432\u043e\u0435\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0437\u0430 \u043e\u0434\u0438\u043d \u0432\u0435\u0447\u0435\u0440 \u043d\u0435\u043d\u0430\u043f\u0440\u044f\u0436\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0438\u043d\u0433\u0430 \u041d\u0430\u0432\u0435\u0440\u043d\u043e\u0435, \u0443 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430, \u0438\u043c\u0435\u044e\u0449\u0435\u0433\u043e \u0445\u043e\u0442\u044f \u0431\u044b \u043e\u0434\u0438\u043d \u043f\u0435\u0442-\u043f\u0440\u043e\u0435\u043a\u0442, \u0432 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u0437\u0443\u0434 \u043d\u0430 \u0442\u0435\u043c\u0443 \u043a\u0440\u0430\u0441\u0438\u0432\u044b\u0445 \u0431\u0435\u0439\u0434\u0436\u0438\u043a\u043e\u0432 \u0441\u043e \u0441\u0442\u0430\u0442\u0443\u0441\u0430\u043c\u0438, \u043f\u043e\u043a\u0440\u044b\u0442\u0438\u0435\u043c \u043a\u043e\u0434\u0430, \u0432\u0435\u0440\u0441\u0438\u044f\u043c\u0438 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u0432 nuget\u2026 \u0418 \u043c\u0435\u043d\u044f \u044d\u0442\u043e\u0442 \u0437\u0443\u0434 \u043f\u0440\u0438\u0432\u0451\u043b \u043a \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044e \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438. \u0412 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0438 \u043a \u0435\u0451 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044e \u044f\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/rukovodstvo-po-ci-cd-v-gitlab-dlya-pochti-absolyutnogo-novichka\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-04-23T05:42:46+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-04-23T05:42:46+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Guida a CI\/CD in GitLab per (quasi) assoluti principianti | ProHoster","description":"O come creare badge accattivanti per il tuo progetto in una sola serata di programmazione senza stress. Probabilmente ogni sviluppatore con almeno un progetto personale avr\u00e0, a un certo punto, la necessit\u00e0 di avere dei badge belli che mostrino stati, copertura del codice, versioni dei pacchetti in NuGet\u2026 E questa esigenza mi ha portato a scrivere questo articolo. Durante la preparazione per la scrittura, mi","canonical_url":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/rukovodstvo-po-ci-cd-v-gitlab-dlya-pochti-absolyutnogo-novichka","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"it_IT","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u0420\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e \u043f\u043e CI\/CD \u0432 GitLab \u0434\u043b\u044f (\u043f\u043e\u0447\u0442\u0438) \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e\u0433\u043e \u043d\u043e\u0432\u0438\u0447\u043a\u0430 | ProHoster","og:description":"\u0418\u043b\u0438 \u043a\u0430\u043a \u043e\u0431\u0437\u0430\u0432\u0435\u0441\u0442\u0438\u0441\u044c \u043a\u0440\u0430\u0441\u0438\u0432\u044b\u043c\u0438 \u0431\u0435\u0439\u0434\u0436\u0438\u043a\u0430\u043c\u0438 \u0434\u043b\u044f \u0441\u0432\u043e\u0435\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0437\u0430 \u043e\u0434\u0438\u043d \u0432\u0435\u0447\u0435\u0440 \u043d\u0435\u043d\u0430\u043f\u0440\u044f\u0436\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0438\u043d\u0433\u0430 \u041d\u0430\u0432\u0435\u0440\u043d\u043e\u0435, \u0443 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430, \u0438\u043c\u0435\u044e\u0449\u0435\u0433\u043e \u0445\u043e\u0442\u044f \u0431\u044b \u043e\u0434\u0438\u043d \u043f\u0435\u0442-\u043f\u0440\u043e\u0435\u043a\u0442, \u0432 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u0437\u0443\u0434 \u043d\u0430 \u0442\u0435\u043c\u0443 \u043a\u0440\u0430\u0441\u0438\u0432\u044b\u0445 \u0431\u0435\u0439\u0434\u0436\u0438\u043a\u043e\u0432 \u0441\u043e \u0441\u0442\u0430\u0442\u0443\u0441\u0430\u043c\u0438, \u043f\u043e\u043a\u0440\u044b\u0442\u0438\u0435\u043c \u043a\u043e\u0434\u0430, \u0432\u0435\u0440\u0441\u0438\u044f\u043c\u0438 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u0432 nuget\u2026 \u0418 \u043c\u0435\u043d\u044f \u044d\u0442\u043e\u0442 \u0437\u0443\u0434 \u043f\u0440\u0438\u0432\u0451\u043b \u043a \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044e \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438. \u0412 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0438 \u043a \u0435\u0451 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044e \u044f","og:url":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/rukovodstvo-po-ci-cd-v-gitlab-dlya-pochti-absolyutnogo-novichka","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-04-23T05:42:46+00:00","article:modified_time":"2020-04-23T05:42:46+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"78953","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 16:47:26","updated":"2022-09-28 03:26:35"},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/78953","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/comments?post=78953"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/78953\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media\/78954"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media?parent=78953"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/categories?post=78953"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/tags?post=78953"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}