{"id":317849,"date":"2021-02-11T15:00:31","date_gmt":"2021-02-11T15:00:31","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=317849"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=317849","title":{"rendered":"CI\/CD \u0434\u043b\u044f Dynamics CRM \u043d\u0430 \u0431\u0430\u0437\u0435 Azure DevOps"},"content":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\">\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/xo\/r1\/rv\/xor1rv_tt04xctbfbbq4xetfrbe.png\" alt=\"image\"><\/p>\n<p>  <\/p>\n<p>\u0412 \u043f\u0440\u043e\u0448\u043b\u043e\u043c \u0433\u043e\u0434\u0443 \u043d\u0430 \u043c\u0438\u0442\u0430\u043f\u0435 <a href=\"https:\/\/www.meetup.com\/ru-RU\/Russian-MVP-Community\/events\/268518026\/\" rel=\"nofollow noopener noreferrer\">&quot;Dynamics 365 &amp; Power Platform meetup Moscow \u2014 25 \u0444\u0435\u0432\u0440\u0430\u043b\u044f 2020&quot;<\/a> \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u043b \u043f\u0440\u043e \u0442\u043e \u043a\u0430\u043a \u043c\u044b \u0432\u044b\u0441\u0442\u0440\u043e\u0438\u043b\u0438 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e\u0439 \u043f\u043e\u0441\u0442\u0430\u0432\u043a\u0438 CI\/CD \u043d\u0430 \u0431\u0430\u0437\u0435 GitLab CI \u0434\u043b\u044f Microsoft Dynamics CRM.<\/p>\n<p>  <\/p>\n<p>\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u0438 \u043f\u043e\u043a\u0430\u0436\u0443 \u043a\u0430\u043a \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c CI-\u0447\u0430\u0441\u0442\u044c \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u0430 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e\u0439 \u043f\u043e\u0441\u0442\u0430\u0432\u043a\u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 Microsoft Dynamics CRM \u043d\u0430 \u0431\u0430\u0437\u0435 Azure DevOps.<\/p>\n<p><a name=\"habracut\"><\/a>  <\/p>\n<p>\u042f \u0434\u0430\u0432\u043d\u043e \u0443\u0436\u0435 \u043d\u0435 \u0437\u0430\u0433\u043b\u044f\u0434\u044b\u0432\u0430\u043b \u0432 Azure \u0438 \u043d\u0430 \u043d\u043e\u0432\u043e\u0433\u043e\u0434\u043d\u0438\u0445 \u043f\u0440\u0430\u0437\u0434\u043d\u0438\u043a\u0430\u0445 \u043d\u0430\u043a\u043e\u043d\u0435\u0446-\u0442\u043e \u043f\u043e\u044f\u0432\u0438\u043b\u043e\u0441\u044c \u0432\u0440\u0435\u043c\u044f \u0432 \u043d\u0435\u043c &quot;\u043f\u043e\u043a\u043e\u0432\u044b\u0440\u044f\u0442\u044c\u0441\u044f&quot;. \ud83d\ude42 \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043d\u0438\u0447\u0435\u0433\u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0433\u043e \u0432 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043d\u0435 \u0431\u0443\u0434\u0443 \u0438 \u0435\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d \u0432 Azure DevOps \u0442\u043e \u0432\u044b, \u0441\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e, \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u043e\u0432\u043e\u0433\u043e \u0437\u0434\u0435\u0441\u044c \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u0442\u0435. \u041e\u0434\u043d\u0430\u043a\u043e, \u0435\u0441\u043b\u0438 \u0432\u044b \u0447\u0443\u0432\u0441\u0442\u0432\u0443\u0435\u0442\u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u043d\u043e\u0441\u0442\u044c \u0432 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u0432\u044b\u043d\u043e\u0441\u0430 \u043d\u043e \u043d\u0435 \u0437\u043d\u0430\u0435\u0442\u0435 \u0441 \u0447\u0435\u0433\u043e \u043d\u0430\u0447\u0430\u0442\u044c \u0442\u043e \u044d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u043a\u0430\u043a \u0440\u0430\u0437 \u0434\u043b\u044f \u0432\u0430\u0441.<\/p>\n<p>  <\/p>\n<p>\u042f \u0431\u0443\u0434\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u043b\u0430\u0447\u043d\u044b\u0439 \u0441\u0435\u0440\u0432\u0438\u0441 <a href=\"https:\/\/dev.azure.com\/\" rel=\"nofollow noopener noreferrer\">Azure DevOps Service<\/a> \u0442.\u043a. \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043d\u0435 \u0443\u0441\u043f\u0435\u043b \u043d\u043e, \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e \u0434\u043e\u043b\u0436\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0442\u043e\u0447\u043d\u043e \u0442\u0430\u043a\u0436\u0435. \u041d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0432\u0441\u0435, \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0441 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f. \u0414\u043b\u044f Azure Devops Pipelines \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0435 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438, Azure Repos Git, Bitbucket Cloud, GitHub, \u043f\u0440\u043e\u0441\u0442\u043e Git \u0438 Subversion \u043d\u043e \u044f, \u0434\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430, \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u044e\u0441\u044c \u043d\u0430 Azure Repos Git \u0447\u0442\u043e\u0431\u044b \u0432\u0441\u0435 \u0431\u044b\u043b\u043e \u0432 \u043e\u0434\u043d\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044f \u043e\u0441\u0442\u0430\u0432\u043b\u044e \u0432 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u043e\u043c \u0434\u043e\u0441\u0442\u0443\u043f\u0435 \u0437\u0434\u0435\u0441\u044c <a href=\"https:\/\/dev.azure.com\/ZhukoffPublic\/CRMCICD\/\" rel=\"nofollow noopener noreferrer\">https:\/\/dev.azure.com\/ZhukoffPublic\/CRMCICD\/<\/a>. <\/p>\n<p>  <\/p>\n<blockquote><p>Microsoft Dynamics CRM \u044d\u0442\u043e CRM \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043d\u0430 \u0431\u0430\u0437\u0435 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0439 ASP.NET, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0442\u0435\u043f\u0435\u0440\u044c \u0432\u0445\u043e\u0434\u0438\u0442 \u0432 \u0441\u0435\u043c\u0435\u0439\u0441\u0442\u0432\u043e Dynamics 365, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0442\u044c \u043f\u0443\u0442\u0435\u043c \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432 \u043d\u0430 C# \u0434\u043b\u044f \u0431\u044d\u043a\u043e\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0438 JScript \u0434\u043b\u044f \u0444\u0440\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0439.<\/p><\/blockquote>\n<p>\u0414\u043b\u044f \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u0446\u0435\u043b\u0435\u0439 \u044f \u0441\u043e\u0437\u0434\u0430\u043b 4 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 (\u0432\u044b \u0438\u0445 \u043c\u043e\u0436\u0435\u0442\u0435 \u043a\u043b\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0437 \u043c\u043e\u0435\u0433\u043e \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f):<\/p>\n<p>  <\/p>\n<ul>\n<li>Plugins \u2014 \u043f\u043b\u0430\u0433\u0438\u043d\u044b CRM. \u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u043c \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u043e\u043b\u043d\u043e\u0433\u043e \u0438\u043c\u0435\u043d\u0438.<\/li>\n<li>Plugins.Tests \u2014 \u044e\u043d\u0438\u0442-\u0442\u0435\u0441\u0442\u044b \u0434\u043b\u044f \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432.<\/li>\n<li>Solution \u2014 \u043a\u0430\u0441\u0442\u043e\u043c\u0438\u0437\u0430\u0446\u0438\u0438 CRM. \u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c \u041a\u043e\u043d\u0442\u0430\u043a\u0442 \u0438 \u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0444\u043e\u0440\u043c\u0430 \u0434\u043b\u044f \u043d\u0435\u0433\u043e.<\/li>\n<li>WebResources \u2014 \u0432\u0435\u0431\u0440\u0435\u0441\u0443\u0440\u0441\u044b CRM. \u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e \u0441\u043a\u0440\u0438\u043f\u0442 \u043d\u0430 \u0444\u043e\u0440\u043c\u0435 \u041a\u043e\u043d\u0442\u0430\u043a\u0442\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b\u0432\u043e\u0434\u0438\u0442 \u043d\u043e\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044e \u0435\u0441\u043b\u0438 \u043d\u0435 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d \u0442\u0435\u043b\u0435\u0444\u043e\u043d.<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043c\u044b \u043f\u043e\u043a\u0440\u043e\u0435\u043c \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f MS Dynamics CRM.<\/p>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u044f \u0431\u0443\u0434\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <a href=\"https:\/\/github.com\/scottdurow\/SparkleXrm\/wiki\" rel=\"nofollow noopener noreferrer\">SparkleXrm<\/a> \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u043d\u0435\u0431\u0435\u0437\u044b\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u043c Scott Durow. \u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0437\u0434\u0435\u0441\u044c <a href=\"https:\/\/develop1.net\/public\/post\/2017\/05\/03\/Simple-No-fuss-Dynamics-365-Deployment-Task-Runner\" rel=\"nofollow noopener noreferrer\">Simple, No fuss, Dynamics 365 Deployment Task Runner<\/a> \u043a\u0430\u043a \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 \u0435\u0433\u043e \u043a\u0430\u043d\u0430\u043b\u0435 \u0432 <a href=\"https:\/\/www.youtube.com\/c\/ScottDurow\" rel=\"nofollow noopener noreferrer\">YouTube<\/a>. \u0422\u0430\u043a\u0436\u0435 \u0443 \u043d\u0435\u0433\u043e \u0435\u0441\u0442\u044c \u0432\u0438\u0434\u0435\u043e\u043a\u0443\u0440\u0441 \u043d\u0430 PaktPub <a href=\"https:\/\/www.packtpub.com\/product\/designing-and-building-custom-apps-using-dynamics-365-video\/9781788390613\" rel=\"nofollow noopener noreferrer\">Designing and Building Custom Apps using Dynamics 365<\/a> \u0433\u0434\u0435 \u043e\u043d \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0439\u0448\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0447\u0442\u043e \u0438 \u043a\u0430\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438 \u0434\u0430\u0436\u0435 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u043a\u0430\u043a \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d \u043d\u0430 \u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442 \u044d\u0442\u043e \u0431\u044b\u043b \u0435\u0449\u0435 VSTS. \u042f \u0432\u044b\u0431\u0440\u0430\u043b <strong>spkl<\/strong> \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043e\u043d \u0443\u0436\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u0438 \u0441\u0430\u043c \u043f\u0440\u043e\u0435\u043a\u0442 \u0432 \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u043c \u0434\u043e\u0441\u0442\u0443\u043f\u0435 \u043d\u0430 GitHub, \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u0430\u043c\u043e\u043c\u0443 \u0435\u0441\u043b\u0438 \u0447\u0442\u043e-\u0442\u043e \u043d\u0435 \u0443\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442. \u042d\u0442\u043e \u0432\u0430\u0440\u0438\u0430\u043d\u0442, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u043d\u0435 \u0431\u0435\u0437 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u043e\u0432, \u043e \u043d\u0438\u0445 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043f\u043e\u0437\u0436\u0435.<\/p>\n<p>  <\/p>\n<p>\u0411\u0443\u0434\u0435\u043c \u0441\u0447\u0438\u0442\u0430\u0442\u044c, \u0447\u0442\u043e \u043f\u0440\u043e\u0435\u043a\u0442 \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0438 \u0447\u0442\u043e \u043e\u043d, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0438 \u0434\u0435\u043f\u043b\u043e\u0438\u0442\u0441\u044f \u0438\u0437 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <strong>spkl<\/strong>. \u0423 \u043c\u0435\u043d\u044f \u044d\u0442\u043e \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0430\u044f \u043c\u0430\u0448\u0438\u043d\u0430 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u043e\u0439 MS CRM 365 (9.0), Visual Studio, SDK, XRMToolBox \u0438 \u043f\u0440., \u043a\u043e\u0440\u043e\u0447\u0435, \u0432\u0441\u0435 \u0432 \u043e\u0434\u043d\u043e\u043c. <\/p>\n<p>  <\/p>\n<p>\u0421\u0430\u043c \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d \u0434\u0435\u043b\u0438\u0442\u0441\u044f \u043d\u0430 \u0434\u0432\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0447\u0430\u0441\u0442\u0438, <strong>CI<\/strong> \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u0430\u044f \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f (<strong>Continuous Integration<\/strong>) \u0442.\u0435. \u043a\u043e\u0433\u0434\u0430 \u043a\u043e\u0434 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432 \u0432\u0435\u0442\u043a\u0435 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f \u0438 <strong>CD<\/strong> \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u0430 \u043a\u0430\u043a \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u0430\u044f \u043f\u043e\u0441\u0442\u0430\u0432\u043a\u0430 (<strong>Continuous Delivery<\/strong>) \u0438\u043b\u0438 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e\u0435 \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435 (<strong>Continuous Deployment<\/strong>).<\/p>\n<p>  <\/p>\n<p>\u041c\u044b \u043d\u0430\u0447\u043d\u0435\u043c, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u0441 <strong>CI<\/strong> \u0438 \u0434\u0443\u043c\u0430\u0442\u044c \u0441\u0435\u0439\u0447\u0430\u0441 \u043a\u0430\u043a \u0434\u0435\u043b\u0430\u0442\u044c <strong>CD<\/strong> \u0432\u043e\u0432\u0441\u0435 \u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e.<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/vh\/-g\/1n\/vh-g1ngxw4wxudzzf9czyhikkuw.png\" alt=\"CI\/CD Pipeline\"><\/p>\n<p>  <\/p>\n<h2 id=\"podgotovitelnye-raboty\">\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0440\u0430\u0431\u043e\u0442\u044b<\/h2>\n<p>  <\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442 CRMCICD \u0432 Azure DevOps.<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/eq\/nn\/ia\/eqnnia5vebswdzzuzohlbftsjcw.png\"><\/p>\n<p>  <\/p>\n<p>\u041a\u043b\u043e\u043d\u0438\u0440\u0443\u0435\u043c \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0438 \u0437\u0430\u043b\u0438\u0432\u0430\u0435\u043c \u043d\u0430\u0448 \u043f\u0440\u043e\u0435\u043a\u0442.<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/p_\/3v\/iv\/p_3vivochtvhedvml8i99ixbaku.png\"><\/p>\n<p>  <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0441\u0430\u043c \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d, \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u0432 \u0441\u0435\u043a\u0446\u0438\u044e <strong>Pipelines<\/strong>, \u0436\u043c\u0435\u043c <strong>Create Pipeline<\/strong>, \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 <strong>Azure Repos Git<\/strong> \u0434\u0430\u043b\u0435\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u043d\u0430\u0448 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 <strong>CRMCICD<\/strong> \u0434\u0430\u043b\u0435\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c <strong>Starter Pipeline<\/strong> \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u043a\u0430\u0440\u0442\u0438\u043d\u0443.<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/fg\/md\/ya\/fgmdyahajosrigmubfmrks5wsbs.png\"><\/p>\n<p>  <\/p>\n<p>\u042d\u0442\u043e \u0438 \u0435\u0441\u0442\u044c \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d, YAML \u043a\u043e\u0434 \u0432 \u0444\u0430\u0439\u043b\u0435 <code>azure-pipelines.yml<\/code> \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0430\u0433\u0435\u043d\u0442\u043e\u043c \u0432 \u043a\u0430\u043a\u043e\u043c-\u0442\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0438, windows \u0438\u043b\u0438 linux \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440. \u041e\u043d \u0434\u043e\u043b\u0436\u0435\u043d \u0441\u043e\u0441\u0442\u043e\u044f\u0442\u044c \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u0438\u0437 \u0442\u0440\u0435\u0445 \u0441\u0435\u043a\u0446\u0438\u0439:<\/p>\n<p>  <\/p>\n<ul>\n<li><strong>trigger:<\/strong> \u0442\u0440\u0438\u0433\u0433\u0435\u0440 \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u0430, \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e -main, \u0442.\u0435. \u043f\u043e \u043a\u043e\u043c\u043c\u0438\u0442\u0443 \u0432 \u0432\u0435\u0442\u043a\u0443 main.<\/li>\n<li><strong>pool:<\/strong> \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u0433\u0434\u0435 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d, \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u0431\u0440\u0430\u0437 ubuntu \u0432 \u043e\u0431\u043b\u0430\u043a\u0435 Azure.<\/li>\n<li><strong>steps:<\/strong> \u0441\u0430\u043c\u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u044b.<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0415\u0441\u043b\u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d \u0432 \u0442\u0430\u043a\u043e\u043c \u0432\u0438\u0434\u0435 \u0442\u043e \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u043a\u043e\u043c\u043c\u0438\u0442 \u0432 \u0432\u0435\u0442\u043a\u0443 main. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u0442\u0430\u0432\u0438\u043c <strong>trigger: none<\/strong> \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0442\u0430\u043a \u043f\u043e\u043a\u0430 \u0435\u0433\u043e \u043d\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u043c \u0438 \u043d\u0435 \u043e\u0442\u043b\u0430\u0434\u0438\u043c.<\/p>\n<p>  <\/p>\n<p>\u041d\u0430\u0448 <strong>CI<\/strong> \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u0442\u044c \u0438\u0437 2 \u044d\u0442\u0430\u043f\u043e\u0432:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u0421\u0431\u043e\u0440\u043a\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u044f<\/li>\n<li>\u0420\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435 \u043d\u0430 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0440\u0435\u0434\u0443<\/li>\n<\/ul>\n<p>  <\/p>\n<p>2-\u0439 \u0448\u0430\u0433 \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u0435\u043d \u043d\u043e \u044f \u0435\u0433\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u0447\u0442\u043e\u0431\u044b \u0431\u044b\u043b \u043f\u0440\u0438\u043c\u0435\u0440 \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u043d\u0430 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0440\u0435\u0434\u0443 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e spkl, \u043f\u043e\u043b\u0435\u0437\u043d\u043e \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0442\u043e, \u0447\u0442\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0442\u043e \u0437\u0430\u043b\u0438\u043b\u0438 \u0432 main \u0432\u0435\u0442\u043a\u0443.<\/p>\n<p>  <\/p>\n<h2 id=\"sborka-proekta-i-resheniya\">\u0421\u0431\u043e\u0440\u043a\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u044f<\/h2>\n<p>  <\/p>\n<p>\u041f\u0435\u0440\u0432\u044b\u043c \u0434\u0435\u043b\u043e\u043c \u043c\u0435\u043d\u044f\u0435\u043c \u0430\u0433\u0435\u043d\u0442\u0430 \u043d\u0430 windows \u0442.\u043a. linux \u043d\u0430\u0441 \u043d\u0438\u043a\u0430\u043a \u043d\u0435 \u0443\u0441\u0442\u0440\u043e\u0438\u0442.<br \/>  <code>vmImage: 'windows-latest'<\/code><\/p>\n<p>  <\/p>\n<p>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430.<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">variables:   solution: '**\/*.sln'   buildPlatform: 'Any CPU'   buildConfiguration: 'Debug'<\/code><\/pre>\n<p>  <\/p>\n<p>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0448\u0430\u0433\u0438:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">steps: # \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 NuGet - task: NuGetToolInstaller@1   displayName: 'Install NuGet tool'  # \u0412\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 NuGet \u0434\u043b\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430 - task: NuGetCommand@2   displayName: 'Restore NuGet packages'   inputs:     restoreSolution: '$(solution)'  # \u0421\u0431\u043e\u0440\u043a\u0430 - task: VSBuild@1   displayName: Buld   inputs:     solution: '$(solution)'     platform: '$(buildPlatform)'     configuration: '$(buildConfiguration)'  # \u041f\u0440\u043e\u0433\u043e\u043d \u044e\u043d\u0438\u0442-\u0442\u0435\u0441\u0442\u043e\u0432 - task: VSTest@2   displayName: 'Run Unit Tests'   inputs:     platform: '$(buildPlatform)'     configuration: '$(buildConfiguration)'  # \u041f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u044f \u0441\u043e\u0431\u0440\u0430\u043d\u043d\u043e\u0439 dll-\u043a\u0438 \u0432 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u043e\u0432 - task: CopyFiles@2   displayName: 'Copy plugins dll'   inputs:     SourceFolder: '$(Build.SourcesDirectory)\\CRMCICD\\Plugins\\bin\\Debug\\'     Contents: 'CRMCI.*.dll'     targetFolder: '$(Build.StagingDirectory)\/plugins' - publish: '$(Build.StagingDirectory)\/plugins'   displayName: 'Publish plugins dll as an artifact'   artifact: plugins<\/code><\/pre>\n<p>  <\/p>\n<p>\u0413\u0434\u0435 $(xxx) \u044d\u0442\u043e \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043a \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u044f \u043e\u0431\u044a\u044f\u0432\u0438\u043b \u0441\u0430\u043c \u0438\u043b\u0438 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u043c, \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0442\u0443\u0442 <a href=\"https:\/\/docs.microsoft.com\/en-us\/azure\/devops\/pipelines\/build\/variables\" rel=\"nofollow noopener noreferrer\">Use predefined variables<\/a> \u0430 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0447\u0442\u043e \u0438 \u0432 \u043a\u0430\u043a\u0438\u0445 \u043f\u0430\u043f\u043a\u0430\u0445 \u043b\u0435\u0436\u0438\u0442 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0442\u0443\u0442 <a href=\"https:\/\/dev.to\/shleeen\/understanding-the-directory-structure-created-by-azure-devops-tasks-1328\" rel=\"nofollow noopener noreferrer\">Understanding the directory structure created by Azure DevOps tasks<\/a>.<\/p>\n<p>  <\/p>\n<blockquote><p>\u0418 \u0431\u0443\u0434\u044c\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u044b, \u044d\u0442\u043e YAML \u0438 \u043e\u0434\u0438\u043d \u043b\u0438\u0448\u043d\u0438\u0439 \u0438\u043b\u0438 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u044e\u0449\u0438\u0439 \u043f\u0440\u043e\u0431\u0435\u043b \u043c\u043e\u0436\u0435\u0442 \u0432\u0441\u0435 \u043f\u043e\u043b\u043e\u043c\u0430\u0442\u044c.<\/p><\/blockquote>\n<p>\u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043f\u0430\u0439\u043f \u0440\u0443\u043a\u0430\u043c\u0438, \u043a\u043d\u043e\u043f\u043a\u0430 <strong>Run pipeline<\/strong> \u0441\u043f\u0440\u0430\u0432\u0430 \u0432\u0432\u0435\u0440\u0445\u0443.<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/-k\/d4\/h-\/-kd4h-g_yx7xlphvhuniwnsiuga.png\"><\/p>\n<p>  <\/p>\n<p>\u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u043e\u043a\u043d\u0435 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043c\u0435\u043d\u044f\u044f \u043f\u0440\u043e\u0441\u0442\u043e \u0436\u043c\u0435\u043c <strong>Run<\/strong>.<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/ww\/uf\/jx\/wwufjxcqjemcbwah6bzaorjk6ma.png\"><\/p>\n<p>  <\/p>\n<p>\u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0447\u0435\u0433\u043e \u043f\u043e\u043f\u0430\u0434\u0430\u0435\u043c \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0442\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043b\u0438 \u0438 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u0442\u043e\u0438\u0442 \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u043d\u0430 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0433\u0434\u0435-\u0442\u043e \u0432 \u043d\u0435\u0434\u0440\u0430\u0445 Azure DevOps. \u041e\u043d \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u043e\u0434\u043d\u043e\u0439 \u0434\u0436\u043e\u0431\u044b (Job).<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/qk\/jn\/mb\/qkjnmbtisxedyvd6t6pa_atfnna.png\"><\/p>\n<p>  <\/p>\n<p>\u0415\u0441\u043b\u0438 \u043a\u043b\u0438\u043a\u043d\u0443\u0442\u044c \u043d\u0430 \u0434\u0436\u043e\u0431\u0443 \u0442\u043e \u043f\u043e\u043f\u0430\u0434\u0435\u043c \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u0441 \u043b\u043e\u0433\u0430\u043c\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 \u0433\u0434\u0435 \u0443\u0432\u0438\u0434\u0438\u043c \u0438\u0445 \u0441\u0442\u0430\u0442\u0443\u0441 \u0438 \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f. <\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/2f\/cm\/t4\/2fcmt4sztvz8jq5hsk1s0lda810.png\"><\/p>\n<p>  <\/p>\n<p>\u0415\u0441\u043b\u0438 \u0443 \u043a\u043e\u0433\u043e-\u0442\u043e \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u043c\u043e\u0436\u0435\u0442\u0435 \u0432\u0437\u044f\u0442\u044c \u0432\u0435\u0440\u0441\u0438\u044e \u043f\u0430\u0439\u043f\u0430 \u0438\u0437 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f, \u043a\u043e\u043c\u043c\u0438\u0442 <a href=\"https:\/\/dev.azure.com\/ZhukoffPublic\/CRMCICD\/_git\/CRMCICD\/commit\/eb2a1465649ffea0266d5b23c1619ce9bbe1ffcd\" rel=\"nofollow noopener noreferrer\">eb2a1465<\/a><\/p>\n<p>  <\/p>\n<p>\u041f\u0435\u0440\u0432\u043e\u0435, \u0447\u0442\u043e \u043c\u043d\u0435 \u043d\u0435 \u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f \u044d\u0442\u043e \u0432\u0435\u0440\u0441\u0438\u044f \u043f\u0430\u0439\u043f\u0430, <strong>#20210129.1<\/strong>. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u0441\u0432\u043e\u044e, \u044f \u043e\u0431\u044b\u0447\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e 4 \u0446\u0438\u0444\u0440\u044b, \u0433\u0434\u0435 \u043f\u0435\u0440\u0432\u044b\u0435 \u0434\u0432\u0435 \u044d\u0442\u043e \u0432\u0435\u0440\u0441\u0438\u044f CRM \u0430 \u0432\u0442\u043e\u0440\u044b\u0435 2 \u0432\u0435\u0440\u0441\u0438\u044f \u043c\u043e\u0438\u0445 \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u043e\u043a, \u043f\u0435\u0440\u0432\u0430\u044f \u0446\u0438\u0444\u0440\u0430 \u044d\u0442\u043e \u043d\u043e\u043c\u0435\u0440 \u0440\u0435\u043b\u0438\u0437\u0430 \u0430 \u0432\u0442\u043e\u0440\u0430\u044f \u043d\u043e\u043c\u0435\u0440 \u0441\u0431\u043e\u0440\u043a\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <strong>9.0.1.0<\/strong>. \u0414\u0430\u043d\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u043c\u0435\u0442\u044c \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u043d\u043e\u043c\u0435\u0440 \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u043e\u0434\u043d\u043e \u0438 \u0442\u043e\u0436\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0440\u0430\u0437\u043d\u044b\u0445 \u0432\u0435\u0440\u0441\u0438\u0439 CRM. \u041f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u043f\u043e\u0447\u0442\u0438 \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0432\u0435\u0440\u0441\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 (\u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u0441\u043c. <a href=\"https:\/\/semver.org\/lang\/ru\/\" title=\"\u0421\u0435\u043c\u0430\u043d\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0412\u0435\u0440\u0441\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 2.0.0\" rel=\"nofollow noopener noreferrer\">https:\/\/semver.org\/lang\/ru\/<\/a>).<\/p>\n<p>  <\/p>\n<p>\u0418\u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0442\u0430\u043a\u043e\u0439 \u043d\u043e\u043c\u0435\u0440 \u0432\u0435\u0440\u0441\u0438\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0432 \u043f\u0430\u0439\u043f \u0432 \u0441\u0435\u043a\u0446\u0438\u044e \u0441 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c\u0438 \u0435\u0449\u0435 3.<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">crmmajor: 9 crmminor: 0 rel: 1<\/code><\/pre>\n<p>  <\/p>\n<p>\u0418, \u043c\u0435\u0436\u0434\u0443 <strong><em>variables<\/em><\/strong> \u0438 <strong><em>steps<\/em><\/strong> \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0441\u0442\u0440\u043e\u0447\u043a\u0443<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">name: $(crmmajor).$(crmminor).$(rel).$(BuildID) <\/code><\/pre>\n<p>  <\/p>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043c\u044b \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043b\u0438 \u043d\u043e\u043c\u0435\u0440 \u0432\u0435\u0440\u0441\u0438\u0438 \u043f\u0430\u0439\u043f\u0430 \u0438, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0441\u0431\u043e\u0440\u043a\u0438. \u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f <strong>BuildID<\/strong> \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u0430 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u0430 \u0438 \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u043a\u043e\u0433\u0434\u0430 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u043f\u0430\u0439\u043f.<\/p>\n<p>  <\/p>\n<p>\u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043f\u0430\u0439\u043f. \u0422\u0435\u043f\u0435\u0440\u044c \u0432\u0438\u0434\u0438\u043c \u043d\u0430\u0448\u0443 \u0432\u0435\u0440\u0441\u0438\u044e \u0432 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0435 \u2014 <strong>Jobs in run #9.0.1.7<\/strong>. \u041e\u0434\u043d\u0430\u043a\u043e, \u043d\u0430\u0448\u0430 \u043d\u043e\u0432\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u043d\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u043b\u0430\u0441\u044c \u043d\u0438 \u0432 dll-\u043a\u0435 \u0441 \u043f\u043b\u0430\u0433\u0438\u043d\u0430\u043c\u0438 \u043d\u0438 \u0432 \u0440\u0435\u0448\u0435\u043d\u0438\u0438. <\/p>\n<p>  <\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u044d\u0442\u043e \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c PowerShell \u0441\u043a\u0440\u0438\u043f\u0442 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043b\u0435\u0436\u0438\u0442 \u0432 \u043f\u0430\u043f\u043a\u0435 <a href=\"https:\/\/dev.azure.com\/ZhukoffPublic\/_git\/CRMCICD?path=%2FCRMCI%2FSolution%2FBuildScripts%2Fupdate-build-versions.ps1\" rel=\"nofollow noopener noreferrer\">CRMCI\/Solution\/BuildScripts\/update-build-versions.ps1<\/a> \u044d\u0442\u043e \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0439 \u0441\u043a\u0440\u0438\u043f\u0442 \u0441 \u0441\u0430\u0439\u0442\u0430 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 Microsoft \u043f\u043e Azure DevOps <a href=\"https:\/\/docs.microsoft.com\/en-us\/azure\/devops\/pipelines\/scripts\/powershell?view=azure-devops&amp;tabs=yaml#example-version-your-assemblies\" rel=\"nofollow noopener noreferrer\">Example: Version your assemblies<\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u0435\u043d\u044f\u0435\u0442 \u0432\u0435\u0440\u0441\u0438\u044e \u043d\u0430 \u0442\u0435\u043a\u0443\u0449\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e \u043f\u0430\u0439\u043f\u0430 \u0432\u043e \u0432\u0441\u0435\u0445 dll \u0438 XML-\u0444\u0430\u0439\u043b\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f CRM \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 Solution.<\/p>\n<p>  <\/p>\n<p>\u0414\u043e\u0431\u0430\u0432\u0438\u043c \u0435\u0433\u043e \u0437\u0430\u043f\u0443\u0441\u043a \u043f\u0435\u0440\u0435\u0434 \u0441\u0431\u043e\u0440\u043a\u043e\u0439 \u043f\u0440\u043e\u0435\u043a\u0442\u0430.<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">- task: PowerShell@2   displayName: 'Update version'   inputs:     filePath: '$(Build.SourcesDirectory)\\CRMCI\\Solution\\BuildScripts\\update-build-versions.ps1'     arguments: 'BUILD_BUILDNUMBER $(Build.BuildNumber) BUILD_SOURCESDIRECTORY $(Build.SourcesDirectory)'<\/code><\/pre>\n<p>  <\/p>\n<p>\u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043f\u0430\u0439\u043f. \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0447\u0442\u043e \u0432 dll \u0441 \u043f\u043b\u0430\u0433\u0438\u043d\u0430\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u043b\u0430\u0441\u044c \u0432 \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u044b \u0441\u0442\u043e\u0438\u0442 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f.<br \/>  \u0422\u0435\u043f\u0435\u0440\u044c \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0441\u0431\u043e\u0440\u043a\u0443 \u0441\u043e\u043b\u044e\u0448\u0435\u043d\u0430 CRM, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u0442\u044c \u0438\u0437 2 \u0437\u0430\u0434\u0430\u0447, \u0441\u0430\u043c\u0430 \u0441\u0431\u043e\u0440\u043a\u0430 \u0438 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u044f \u0441\u043e\u043b\u044e\u0448\u0435\u043d\u0430 \u0432 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u043e\u0432.<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\"># \u0421\u0431\u043e\u0440\u043a\u0430 \u0440\u0435\u0448\u0435\u043d\u0438\u044f CRM - task: CmdLine@2   displayName: 'Pack CRM Solution'   inputs:       script: |         dir         @echo off         set package_root=..\\..\\         REM Find the spkl in the package folder (irrespective of version)         For \/R %package_root% %%G IN (spkl.exe) do (             IF EXIST &quot;%%G&quot; (set spkl_path=%%G             goto :continue)             )         :continue         REM spkl instrument [path] [connection-string] [\/p:release]         &quot;%spkl_path%&quot; pack &quot;$(Build.SourcesDirectory)\\CRMCI\\Solution\\spkl.json&quot; &quot;&quot;         exit \/b %ERRORLEVEL%  # \u041f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f CRM - task: CopyFiles@2   displayName: 'Copy CRM Solution'   inputs:       SourceFolder: '$(Build.SourcesDirectory)\\CRMCI\\Solution\\'       Contents: 'CICDDemo_*.zip'       TargetFolder: '$(Build.StagingDirectory)\/solutions' - publish: '$(Build.StagingDirectory)\/solutions'   displayName: 'Publish solution as an artifact'   artifact: solutions<\/code><\/pre>\n<p>  <\/p>\n<p>\u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043f\u0430\u0439\u043f, \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0447\u0442\u043e \u043f\u043e\u043c\u0438\u043c\u043e dll \u0432 \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u0430\u0445 \u0435\u0449\u0435 \u043f\u043e\u044f\u0432\u0438\u043b\u043e\u0441\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435. \u0412\u0435\u0440\u0441\u0438\u044f \u043f\u0430\u0439\u043f\u0430 \u043d\u0430 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432 \u043a\u043e\u043c\u043c\u0438\u0442\u0435 <a href=\"https:\/\/dev.azure.com\/ZhukoffPublic\/CRMCICD\/_git\/CRMCICD\/commit\/647dae3705c0d6d457b54def6b8b6c5055ba4bac\" rel=\"nofollow noopener noreferrer\">647dae37<\/a>.<\/p>\n<p>  <\/p>\n<p>\u0412 \u043c\u043e\u0435\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u0430\u0441\u0442\u043e\u043c\u0438\u0437\u0430\u0446\u0438\u0438. \u0415\u0441\u043b\u0438 \u0437\u0430\u0445\u043e\u0442\u0438\u0442\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u043b\u0430\u0433\u0438\u043d\u044b \u0442\u043e \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0435\u0449\u0435 \u043e\u0434\u043d\u0443 \u0437\u0430\u0434\u0430\u0447\u0443 \u043d\u0430 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 dll \u0432 \u043f\u0430\u043f\u043a\u0443 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0442.\u043a. \u0447\u0442\u043e\u0431\u044b \u043f\u043b\u0430\u0433\u0438\u043d\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438\u0441\u044c \u0432 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u0438 \u0431\u044b\u043b\u0438 \u0432 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435 \u0438 \u0441\u0430\u043c \u0444\u0430\u0439\u043b \u0431\u044b\u043b \u0431\u0435\u0437 \u0442\u043e\u0447\u0435\u043a \u0432 \u0438\u043c\u0435\u043d\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c PShell \u0430 \u043d\u0435 CopyFiles, \u043f\u0440\u0438\u043c\u0435\u0440 \u043d\u0438\u0436\u0435.<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">- task: PowerShell@2   displayName: 'Copy CRMCI.Plugins.dll \u0432 \u043f\u0430\u043f\u043a\u0443 \u0440\u0435\u0448\u0435\u043d\u0438\u044f'   inputs:     targetType: 'inline'     script: 'Copy-Item  -Path $(System.ArtifactsDirectory)\\plugins\\CRMCI.Plugins.dll  -Destination $(Build.SourcesDirectory)\\CRMCI\\Solution\\package\\PluginAssemblies\\CRMCIPlugins-766F0C7B-4B44-EB11-A812-0022489AC434\\CRMCIPlugins.dll -verbose'     errorActionPreference: 'silentlyContinue'<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <em>errorActionPreference<\/em> \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u043f\u0440\u0438 \u043e\u0448\u0438\u0431\u043a\u0435 \u0442\u0438\u0445\u043e \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 \u0438 \u043d\u0435 \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c \u043f\u0430\u0439\u043f.<\/p>\n<p>  <\/p>\n<blockquote><p>\u0415\u0441\u043b\u0438 \u0432\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435 <strong>TypeScript<\/strong> \u0438\u043b\u0438 <strong>webpack<\/strong> \u0438\u043b\u0438 \u0447\u0442\u043e-\u0442\u043e \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0435 \u0442\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0435\u0449\u0435 \u0438 \u0441\u0431\u043e\u0440\u043a\u0443 \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432. \u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441\u043e spkl \u0438\u0445 \u0442\u043e\u0436\u0435 \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u043f\u043e\u0434\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0442\u044c \u0432 \u0440\u0430\u0431\u043e\u0447\u0443\u044e \u043f\u0430\u043f\u043a\u0443. \ud83d\ude41<\/p><\/blockquote>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u043f\u0430\u0439\u043f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0440\u0430\u0431\u043e\u0442\u044b \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043b\u0435\u0436\u0438\u0442 \u0432 \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u0430\u0445 \u0432 \u0432\u0438\u0434\u0435 dll \u0441 \u043f\u043b\u0430\u0433\u0438\u043d\u0430\u043c\u0438 \u0438 \u0441\u043e\u043b\u044e\u0448\u0435\u043d\u0430 CRM \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u043d\u0430 \u0441\u0440\u0435\u0434\u044b \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 CD \u0434\u043b\u044f \u0447\u0435\u0433\u043e \u0432 AzureDevOps \u0441\u0434\u0435\u043b\u0430\u043d\u044b \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u044b Release pipelines. \u041e \u043d\u0438\u0445 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0440\u0430\u0437.<\/p>\n<p>  <\/p>\n<h2 id=\"razvertyvanie-na-lokalnuyu-sredu\">\u0420\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435 \u043d\u0430 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0440\u0435\u0434\u0443<\/h2>\n<p>  <\/p>\n<p>\u0422.\u043a. \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435 \u043d\u0430 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0440\u0435\u0434\u0443 \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 CRM \u0442\u043e \u043e\u0431\u043b\u0430\u0447\u043d\u044b\u0439 \u0430\u0433\u0435\u043d\u0442 \u043d\u0430\u043c \u043d\u0435 \u043f\u043e\u0434\u043e\u0439\u0434\u0435\u0442. \u041d\u0443\u0436\u043d\u043e \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0439. \u041a\u0430\u043a \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0442\u0443\u0442 <a href=\"https:\/\/docs.microsoft.com\/en-us\/azure\/devops\/pipelines\/agents\/v2-windows\" rel=\"nofollow noopener noreferrer\">Self-hosted Windows agents<\/a> \u0438 \u0442\u0443\u0442 <a href=\"https:\/\/itnext.io\/how-to-create-and-configure-azure-devops-pipelines-agent-88848763f109\" rel=\"nofollow noopener noreferrer\">How to create and configure Azure DevOps Pipelines Agent<\/a>. \u041f\u0435\u0440\u0435\u0434 \u0442\u0435\u043c \u043a\u0430\u043a \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c \u0441\u0430\u043c \u0430\u0433\u0435\u043d\u0442 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0435 \u041f\u041e, \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u044d\u0442\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435:<\/p>\n<p>  <\/p>\n<ul>\n<li><a href=\"https:\/\/git-scm.com\/download\/win\" rel=\"nofollow noopener noreferrer\">Git for Windows<\/a><\/li>\n<li><a href=\"https:\/\/dotnet.microsoft.com\/download\/visual-studio-sdks\" rel=\"nofollow noopener noreferrer\">\u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e .NET Framework developer pack<\/a>, \u0432 \u043c\u043e\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 4.6.2<\/li>\n<li><a href=\"https:\/\/visualstudio.microsoft.com\/ru\/downloads\/\" rel=\"nofollow noopener noreferrer\">Build Tools \u0438 Agents<\/a> \u0434\u043b\u044f Visual Studio<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435, \u043f\u043e\u0441\u043b\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0430\u0433\u0435\u043d\u0442\u0430, \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0432 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445 \u0447\u0442\u043e \u043e\u043d \u0432\u0438\u0434\u0435\u043d \u0438 \u0437\u0430\u043f\u0443\u0449\u0435\u043d. \u0423 \u043c\u0435\u043d\u044f \u043e\u043d \u0432 \u043f\u0443\u043b\u0435 Default.<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/ux\/sv\/sg\/uxsvsg4dwjqoldpuzykmfkeagqi.png\"><\/p>\n<p>  <\/p>\n<p>\u0422.\u043a. \u044d\u0442\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u044d\u0442\u0430\u043f \u0438 \u043e\u043d \u0434\u043e\u043b\u0436\u0435\u043d \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u043c \u0430\u0433\u0435\u043d\u0442\u0435 \u0442\u043e \u0440\u0430\u0437\u043e\u0431\u044c\u0435\u043c \u043d\u0430\u0448 \u043f\u0430\u0439\u043f \u043d\u0430 \u044d\u0442\u0430\u043f\u044b, \u0432\u0441\u0435 \u0447\u0442\u043e \u043c\u044b \u0443\u0436\u0435 \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u0435\u0440\u0432\u044b\u0439 \u044d\u0442\u0430\u043f \u0430 \u0434\u0435\u043f\u043b\u043e\u0439 \u044d\u0442\u043e \u0432\u0442\u043e\u0440\u043e\u0439. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u044b \u0440\u0430\u0437\u043e\u0431\u044c\u0435\u043c \u043d\u0430\u0448 \u043f\u0430\u0439\u043f \u043d\u0430 \u044d\u0442\u0430\u043f\u044b (stages), \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u0442 \u0438\u0437 \u0434\u0436\u043e\u0431\u043e\u0432 (jobs) \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0443\u0436\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u0442 \u0438\u0437 \u0443\u0436\u0435 \u0437\u043d\u0430\u043a\u043e\u043c\u044b\u0445 \u043d\u0430\u043c \u0442\u0430\u0441\u043a\u043e\u0432 (tasks).<\/p>\n<p>  <\/p>\n<blockquote><p>\u0417\u0434\u0435\u0441\u044c \u043d\u0430\u0434\u043e \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0434\u0436\u043e\u0431\u044b \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0430\u0433\u0435\u043d\u0442 (pool), \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0435 \u0434\u0436\u043e\u0431\u044b \u043d\u0430 \u0440\u0430\u0437\u043d\u044b\u0445 \u0430\u0433\u0435\u043d\u0442\u0430\u0445 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u0437\u0430\u0442\u043e\u0447\u0435\u043d\u043d\u044b\u0445 \u043f\u043e\u0434 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u0443\u044e \u0440\u0430\u0431\u043e\u0442\u0443 \u0438 \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0442\u044c \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u0434\u043e\u0440\u043e\u0433\u0438\u0445 \u0430\u0433\u0435\u043d\u0442\u043e\u0432. <\/p>\n<p>  \u0415\u0441\u043b\u0438 \u0432 \u044d\u0442\u0430\u043f\u0435 \u0435\u0441\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0434\u0436\u043e\u0431\u043e\u0432 \u0442\u043e \u043e\u043d\u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u044f\u0442\u0441\u044f \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e, \u044d\u0442\u043e \u0433\u0434\u0435-\u0442\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u043e \u0430 \u0433\u0434\u0435-\u0442\u043e \u043d\u0435\u0442. \u0415\u0441\u043b\u0438 \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0434\u0436\u043e\u0431\u043e\u0432 \u0442\u043e \u043b\u0438\u0431\u043e \u0440\u0430\u0437\u043d\u0435\u0441\u0438\u0442\u0435 \u0438\u0445 \u043f\u043e \u0440\u0430\u0437\u043d\u044b\u043c \u044d\u0442\u0430\u043f\u0430\u043c \u043b\u0438\u0431\u043e \u043f\u0440\u043e\u0441\u0442\u0430\u0432\u044c\u0442\u0435 \u0443\u0441\u043b\u043e\u0432\u0438\u0435 <strong>dependsOn<\/strong>, \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u0442\u0443\u0442 <a href=\"https:\/\/docs.microsoft.com\/en-us\/azure\/devops\/pipelines\/process\/conditions\" title=\"Specify conditions\" rel=\"nofollow noopener noreferrer\">Specify conditions<\/a>. <\/p>\n<p>  \u0422\u0430\u043a\u0436\u0435, \u0432 \u043f\u0430\u0439\u043f\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c &quot;\u0443\u043f\u0430\u0432\u0448\u0438\u0435&quot; \u0434\u0436\u043e\u0431\u044b \u0430 \u043d\u0435 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0435 \u0442\u0430\u043a\u0441\u0438. \u0423\u0447\u0438\u0442\u044b\u0432\u0430\u0439\u0442\u0435 \u044d\u0442\u043e \u043f\u0440\u0438 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0438 \u043f\u0430\u0439\u043f\u0430.<\/p><\/blockquote>\n<p>\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">stages: - stage: Build   displayName: 'Build solution'   jobs:     - job: Build       displayName: 'Build job'       pool: 'Custom'       steps:       - task: NuGetToolInstaller@1         displayName: 'Install NuGet tool'  - stage: Deploy   displayName: 'Deploy local'   jobs:     - job: Deploy       displayName: 'Deploy job'       pool: 'Custom'       steps:       - task: NuGetToolInstaller@1         displayName: 'Install NuGet tool'<\/code><\/pre>\n<p>  <\/p>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e, \u0435\u0441\u0442\u044c \u0438 \u043c\u0438\u043d\u0443\u0441\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430\u0434\u043e \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c, \u0442.\u043a.\u0434\u0436\u043e\u0431\u0430 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043d\u043e\u0432\u043e\u043c \u0430\u0433\u0435\u043d\u0442\u0435 \u0442\u043e \u0440\u0430\u0431\u043e\u0447\u0435\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u043e\u0447\u0438\u0449\u0430\u0435\u0442\u0441\u044f, \u0437\u0430\u043d\u043e\u0432\u043e \u0432\u044b\u043a\u0430\u0447\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 \u0438 \u0432\u0441\u0435\u0433\u043e \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0431\u044b\u043b\u043e \u0441\u0434\u0435\u043b\u0430\u043d\u043e \u043d\u0430 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u043c \u0448\u0430\u0433\u0435 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442, \u0442.\u0435. \u0443 \u043a\u0430\u0436\u0434\u043e\u0439 \u0434\u0436\u043e\u0431\u044b, \u0435\u0441\u043b\u0438 \u043d\u0443\u0436\u0435\u043d \u0435\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0440\u0430\u0431\u043e\u0442\u044b, \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u0435\u0433\u043e \u0432 \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u044b. \u0414\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0444\u0430\u0439\u043b\u044b \u0438\u0437 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u0448\u0430\u0433\u043e\u0432 \u0435\u0441\u0442\u044c \u0448\u0430\u0433 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u043a\u0430\u043a \u0440\u0430\u0437 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432.<\/p>\n<p>  <\/p>\n<p>\u041d\u0430\u0448 \u0444\u0430\u0439\u043b \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0442\u0430\u043a, \u043a\u043e\u043c\u043c\u0438\u0442 <a href=\"https:\/\/dev.azure.com\/ZhukoffPublic\/CRMCICD\/_git\/CRMCICD\/commit\/97f91fece827abdb8466399f262527bf20d6d51c\" rel=\"nofollow noopener noreferrer\">97f91fec<\/a><\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">trigger: none  pool:   vmImage: 'windows-latest'  variables:   solution: '**\/*.sln'   buildPlatform: 'Any CPU'   buildConfiguration: 'Debug'   crmmajor: 9   crmminor: 0   rel: 1  name: $(crmmajor).$(crmminor).$(rel).$(BuildID)  stages: - stage: Build   displayName: 'Build solution'   jobs:     - job: Build       displayName: 'Build job'       pool: 'Default'       steps:       # \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 NuGet       - task: NuGetToolInstaller@1         displayName: 'Install NuGet tool'       # \u0412\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 NuGet \u0434\u043b\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430       - task: NuGetCommand@2         displayName: 'Restore NuGet packages'         inputs:           restoreSolution: '$(solution)'       # \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u0440\u0441\u0438\u0438       - task: PowerShell@2         displayName: 'Update version'         inputs:           filePath: '$(Build.SourcesDirectory)\\CRMCI\\Solution\\BuildScripts\\update-build-versions.ps1'           arguments: 'BUILD_BUILDNUMBER $(Build.BuildNumber) BUILD_SOURCESDIRECTORY $(Build.SourcesDirectory)'       # \u0421\u0431\u043e\u0440\u043a\u0430       - task: VSBuild@1         displayName: Buld         inputs:           solution: '$(solution)'           platform: '$(buildPlatform)'           configuration: '$(buildConfiguration)'       # \u041f\u0440\u043e\u0433\u043e\u043d \u044e\u043d\u0438\u0442-\u0442\u0435\u0441\u0442\u043e\u0432       - task: VSTest@2         displayName: 'Run Unit Tests'         inputs:           platform: '$(buildPlatform)'           configuration: '$(buildConfiguration)'       # \u041f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u044f \u0441\u043e\u0431\u0440\u0430\u043d\u043d\u043e\u0439 dll-\u043a\u0438 \u0432 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u043e\u0432       - task: CopyFiles@2         displayName: 'Publish plugins dll to artifacts'         inputs:           SourceFolder: '$(Build.SourcesDirectory)\\CRMCI\\Plugins\\bin\\Debug\\'           Contents: 'CRMCI*.dll'           targetFolder: '$(Build.StagingDirectory)\/plugins'       - publish: '$(Build.StagingDirectory)\/plugins'         displayName: 'Publish plugins dll as an artifact'         artifact: plugins       # \u0421\u0431\u043e\u0440\u043a\u0430 \u0440\u0435\u0448\u0435\u043d\u0438\u044f CRM       - task: CmdLine@2         displayName: 'Pack CRM Solution'         inputs:             script: |               dir               @echo off               set package_root=..\\..\\               REM Find the spkl in the package folder (irrespective of version)               For \/R %package_root% %%G IN (spkl.exe) do (                   IF EXIST &quot;%%G&quot; (set spkl_path=%%G                   goto :continue)                   )               :continue               REM spkl instrument [path] [connection-string] [\/p:release]               &quot;%spkl_path%&quot; pack &quot;$(Build.SourcesDirectory)\\CRMCI\\Solution\\spkl.json&quot; &quot;&quot;               exit \/b %ERRORLEVEL%       # \u041f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f CRM       - task: CopyFiles@2         displayName: 'Copy CRM Solution'         inputs:             SourceFolder: '$(Build.SourcesDirectory)\\CRMCI\\Solution\\'             Contents: 'CICDDemo_*.zip'             TargetFolder: '$(Build.StagingDirectory)\/solutions'       - publish: '$(Build.StagingDirectory)\/solutions'         displayName: 'Publish solution as an artifact'         artifact: solutions  - stage: Deploy   displayName: 'Deploy local'   jobs:     - job: Deploy       displayName: 'Deploy job'       pool: 'Default'       steps:       - task: NuGetToolInstaller@1         displayName: 'Install NuGet tool'<\/code><\/pre>\n<p>  <\/p>\n<p>\u041d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u0430 \u043c\u044b \u0442\u0435\u043f\u0435\u0440\u044c \u0432\u0438\u0434\u0438\u043c \u0434\u0432\u0430 \u044d\u0442\u0430\u043f\u0430.<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/h6\/sq\/2a\/h6sq2ay8_wlyy0wpspqtwyqrisg.png\"><\/p>\n<p>  <\/p>\n<p>\u0414\u0430\u043b\u0435\u0435 \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u0442\u0430\u0441\u043a\u0438 \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u044d\u0442\u0430\u043f\u0430.<br \/>  \u041f\u0435\u0440\u0432\u044b\u0435 \u0434\u0432\u0435 \u044d\u0442\u043e \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 NuGet \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u0447\u0442\u043e\u0431\u044b \u0443 \u043d\u0430\u0441 \u0431\u044b\u043b \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d spkl.<\/p>\n<p>  <\/p>\n<blockquote><p>\u0417\u0434\u0435\u0441\u044c, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u0445\u043e\u0440\u043e\u0448\u043e \u0431\u044b \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438 \u0437\u0430\u043a\u0430\u0447\u0438\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e spkl \u0442.\u043a. \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u043d\u0430\u043c \u043d\u0435 \u043d\u0443\u0436\u043d\u043e. <\/p><\/blockquote>\n<p>  <\/p>\n<pre><code class=\"plaintext\">  # \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 NuGet   - task: NuGetToolInstaller@1     displayName: 'Install NuGet tool'   # \u0412\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 NuGet \u0434\u043b\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430   - task: NuGetCommand@2     displayName: 'Restore NuGet packages'     inputs:       restoreSolution: '$(solution)'<\/code><\/pre>\n<p>  <\/p>\n<p>\u0414\u0430\u043b\u044c\u0448\u0435 \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0442\u0441\u044f \u043a\u043e\u0441\u0442\u044b\u043b\u0438. \ud83d\ude42 \u0422.\u043a. \u044f \u043d\u0435 \u043d\u0430\u0448\u0435\u043b \u0432 spkl \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u043c\u043f\u043e\u0440\u0442\u0430 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e, \u0442\u0430\u043c \u0435\u0441\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043e\u0432\u043c\u0435\u0449\u0435\u043d\u043d\u044b\u0439 \u0448\u0430\u0433 \u0441\u0431\u043e\u0440\u043a\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0438 \u0435\u0433\u043e \u0438\u043c\u043f\u043e\u0440\u0442\u0430 import, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438 \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u0435\u0449\u0435 \u0440\u0430\u0437 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u0440\u0441\u0438\u0438.<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">  # \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u0440\u0441\u0438\u0438   - task: PowerShell@2     displayName: 'Update version'     inputs:       filePath: '$(Build.SourcesDirectory)\\CRMCI\\Solution\\BuildScripts\\update-build-versions.ps1'       arguments: 'BUILD_BUILDNUMBER $(Build.BuildNumber) BUILD_SOURCESDIRECTORY $(Build.SourcesDirectory)'<\/code><\/pre>\n<p>  <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u0438 \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u0435. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a CRM, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u043c \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043f\u0430\u0439\u043f\u0430 \u043f\u043e\u0434 \u0438\u043c\u0435\u043d\u0435\u043c <code>connstr-local<\/code>. \u041a\u043d\u043e\u043f\u043a\u0443 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0430\u0439\u043f\u0430.<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/nk\/mk\/po\/nkmkpop5qh3nwo5a5zw9js8owdm.png\"><\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">  # \u0418\u043c\u043f\u043e\u0440\u0442 \u0440\u0435\u0448\u0435\u043d\u0438\u044f CRM   - task: CmdLine@2     displayName: 'Deploy solution'     inputs:       script: |         @echo off         set package_root=..\\..\\         For \/R %package_root% %%G IN (spkl.exe) do (           IF EXIST &quot;%%G&quot; (set spkl_path=%%G           goto :continue)           )          :continue         @echo Using '%spkl_path%'          &quot;%spkl_path%&quot; import &quot;$(Build.SourcesDirectory)\\CRMCI\\Solution\\spkl.json&quot; &quot;$(connstr-local)&quot;          if errorlevel 1 (         echo Error Code=%errorlevel%         exit \/b %errorlevel%         )<\/code><\/pre>\n<p>  <\/p>\n<blockquote><p>\u041f\u043e \u0445\u043e\u0440\u043e\u0448\u0435\u043c\u0443, \u043d\u0430\u0434\u043e \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0441\u043e\u0431\u0440\u0430\u043d\u043d\u043e\u0435 \u043d\u0430 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u043c \u044d\u0442\u0430\u043f\u0435 \u0438 \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e, \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e PowerShell \u0438\u043b\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043e\u043d\u0441\u043e\u043b\u044c\u043a\u0443. <\/p><\/blockquote>\n<p>\u0414\u0430\u043b\u044c\u0448\u0435 \u043c\u044b \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u0441\u043e\u0431\u0440\u0430\u043d\u043d\u0443\u044e dll-\u043a\u0443 \u0441 \u043f\u043b\u0430\u0433\u0438\u043d\u0430\u043c\u0438 \u0438 \u043f\u043e\u0434\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u043c \u0442\u0443\u0434\u0430 \u0433\u0434\u0435 \u043e\u043d\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u0435\u0441\u043b\u0438 \u0431\u044b \u043c\u044b \u0441\u043e\u0431\u0438\u0440\u0430\u043b\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0442.\u043a. \u044f \u043d\u0435 \u043d\u0430\u0448\u0435\u043b \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u044f\u0432\u043d\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u043c \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043e\u0442\u043a\u0443\u0434\u0430 \u0431\u0440\u0430\u0442\u044c dll \u043f\u0440\u0438 \u0438\u043c\u043f\u043e\u0440\u0442\u0435 \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432. \u041e\u043f\u044f\u0442\u044c \u043a\u043e\u0441\u0442\u044b\u043b\u044c. \ud83d\ude42<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">  # \u0421\u043a\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u0435 \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432   - task: DownloadPipelineArtifact@2     displayName: 'Download plugins artifacts'     inputs:       buildType: 'specific'       project: 'b44552ad-1d85-4c3b-834b-5109b4c9c2b4'       definition: '1'       buildVersionToDownload: 'latest'       artifactName: 'plugins'       targetPath: '$(System.ArtifactsDirectory)\/plugins'   # \u041a\u043e\u043f\u0438\u0440\u0443\u0435\u043c dll   - task: CopyFiles@2     displayName: 'Copy plugins dll'     inputs:       SourceFolder: '$(System.ArtifactsDirectory)\\plugins'       Contents: '*.dll'       TargetFolder: '$(Build.SourcesDirectory)\\CRMCI\\Plugins\\bin\\Debug\\'       OverWrite: true<\/code><\/pre>\n<p>  <\/p>\n<p>\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0448\u0430\u0433 \u044d\u0442\u043e \u0438\u043c\u043f\u043e\u0440\u0442 \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0438 \u0448\u0430\u0433\u043e\u0432.<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">  # \u0418\u043c\u043f\u043e\u0440\u0442 \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432   - task: CmdLine@2     displayName: 'Deploy plugins'     inputs:       script: |         @echo off         set package_root=..\\..\\         For \/R %package_root% %%G IN (spkl.exe) do (           IF EXIST &quot;%%G&quot; (set spkl_path=%%G           goto :continue)           )          :continue         @echo Using '%spkl_path%'          &quot;%spkl_path%&quot; plugins &quot;$(Build.SourcesDirectory)\\CRMCI\\Plugins\\spkl.json&quot; &quot;$(connstr-local)&quot;          if errorlevel 1 (         echo Error Code=%errorlevel%         exit \/b %errorlevel%         )<\/code><\/pre>\n<p>  <\/p>\n<p>\u041d\u0443 \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u043c \u0448\u0430\u0433\u043e\u043c \u0431\u0443\u0434\u0435\u0442 \u0438\u043c\u043f\u043e\u0440\u0442 \u0432\u0435\u0431-\u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432. \u0422\u0443\u0442 spkl \u043f\u0440\u043e\u0441\u0442\u043e \u0431\u0435\u0440\u0435\u0442 \u0444\u0430\u0439\u043b\u044b \u0438\u0437 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0438 \u043f\u0443\u0431\u043b\u0438\u043a\u0443\u0435\u0442 \u0438\u0445 \u0441\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u043c\u0430\u043f\u043f\u0438\u043d\u0433\u0443 \u0432 <em>spkl.json<\/em>.<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">  # \u0418\u043c\u043f\u043e\u0440\u0442 \u0432\u0435\u0431-\u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432   - task: CmdLine@2     displayName: 'Deploy web-resources'     inputs:       script: |         @echo off         set package_root=..\\..\\         For \/R %package_root% %%G IN (spkl.exe) do (           IF EXIST &quot;%%G&quot; (set spkl_path=%%G           goto :continue)           )          :continue         @echo Using '%spkl_path%'          &quot;%spkl_path%&quot; webresources &quot;$(Build.SourcesDirectory)\\CRMCI\\\\WebResources\\spkl.json&quot; &quot;$(connstr-local)&quot;          if errorlevel 1 (         echo Error Code=%errorlevel%         exit \/b %errorlevel%         )<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412\u043e\u0442, \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0438 \u0432\u0441\u0435. \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0442\u0440\u0438\u0433\u0433\u0435\u0440 \u043d\u0430 \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043d\u0438\u0435 \u043f\u043e \u043a\u043e\u043c\u043c\u0438\u0442\u0443 \u0432 \u0432\u0435\u0442\u043a\u0435 main.<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">trigger: - main<\/code><\/pre>\n<p>  <\/p>\n<p>\u041d\u043e \u044d\u0442\u043e \u043d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u0442\u043e, \u0447\u0442\u043e \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0442.\u043a. \u043f\u0430\u0439\u043f \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043b\u044e\u0431\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435, \u0441\u0430\u043c\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430 <em>azure-pipelines.yml<\/em> \u0447\u0442\u043e \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u0443\u0434\u043e\u0431\u043d\u043e. \u041f\u043e\u044d\u0442\u043e\u043c\u0443, \u0432 \u0441\u0435\u043a\u0446\u0438\u044e trigger \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043f\u043e \u0432\u0435\u0442\u043a\u0435, \u0442\u0435\u0433\u0443 \u0438\u043b\u0438 \u043f\u043e \u043c\u0430\u0441\u043a\u0435. \u042f \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435.<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">trigger:   branches:     include:     - main   paths:     include:     - '*'     exclude:     - 'azure-pipelines.yml'     - '*.md'<\/code><\/pre>\n<p>  <\/p>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0435\u0441\u043b\u0438 \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438 \u043a \u043a\u043e\u043c\u043c\u0438\u0442\u0443 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043e\u0434\u043d\u043e \u0438\u0437 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0441\u043b\u043e\u0432\u043e\u0441\u043e\u0447\u0435\u0442\u0430\u043d\u0438\u0439 \u0442\u043e \u043e\u043d \u043d\u0435 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0441\u044f:<\/p>\n<p>  <\/p>\n<ul>\n<li><em>[skip ci]<\/em> or <em>[ci skip]<\/em><\/li>\n<li><em>skip-checks: true<\/em> or <em>skip-checks:true<\/em><\/li>\n<li><em>[skip azurepipelines]<\/em> or <em>[azurepipelines skip]<\/em><\/li>\n<li><em>[skip azpipelines]<\/em> or <em>[azpipelines skip]<\/em><\/li>\n<li><em>[skip azp]<\/em> or <em>[azp skip]<\/em><\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u0437\u0434\u0435\u0441\u044c <a href=\"https:\/\/docs.microsoft.com\/en-us\/azure\/devops\/pipelines\/repos\/azure-repos-git?view=azure-devops&amp;tabs=yaml#ci-triggers\" title=\"CI triggers\" rel=\"nofollow noopener noreferrer\">CI triggers<\/a><\/p>\n<p>  <\/p>\n<p>\u041f\u0435\u0440\u0432\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0437\u0430\u043a\u043e\u043d\u0447\u0435\u043d\u0430, CI \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d \u0438 \u0434\u0430\u0436\u0435 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0431\u043e\u043b\u044c\u0448\u0435. \u0422\u0443\u0442, \u0435\u0441\u0442\u044c \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u043a\u0443\u0434\u0430 \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u0442\u044c\u0441\u044f, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u043d\u0430\u043b\u0438\u0437 \u043a\u043e\u0434\u0430 (\u043a\u043e\u043c\u0443 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e \u0441\u043c. \u043b\u0430\u0431\u0443 <a href=\"https:\/\/azuredevopslabs.com\/labs\/vstsextend\/sonarcloud\/\" rel=\"nofollow noopener noreferrer\">\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 SonarCloud \u043a AzureDevops<\/a>) \u0438\u043b\u0438 \u0430\u0432\u0442\u043e\u0442\u0435\u0441\u0442\u044b.<\/p>\n<p>  <\/p>\n<p>\u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043f\u0440\u043e \u0440\u0435\u043b\u0438\u0437\u043d\u044b\u0435 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u044b \u0438 CD.  <\/p>\n<p> a2-ia.png)<\/p><\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/post\/536530\/\"> https:\/\/habr.com\/ru\/post\/536530\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\">\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/xo\/r1\/rv\/xor1rv_tt04xctbfbbq4xetfrbe.png\" alt=\"image\"><\/p>\n<p>  <\/p>\n<p>\u0412 \u043f\u0440\u043e\u0448\u043b\u043e\u043c \u0433\u043e\u0434\u0443 \u043d\u0430 \u043c\u0438\u0442\u0430\u043f\u0435 <a href=\"https:\/\/www.meetup.com\/ru-RU\/Russian-MVP-Community\/events\/268518026\/\" rel=\"nofollow noopener noreferrer\">&quot;Dynamics 365 &amp; Power Platform meetup Moscow \u2014 25 \u0444\u0435\u0432\u0440\u0430\u043b\u044f 2020&quot;<\/a> \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u043b \u043f\u0440\u043e \u0442\u043e \u043a\u0430\u043a \u043c\u044b \u0432\u044b\u0441\u0442\u0440\u043e\u0438\u043b\u0438 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e\u0439 \u043f\u043e\u0441\u0442\u0430\u0432\u043a\u0438 CI\/CD \u043d\u0430 \u0431\u0430\u0437\u0435 GitLab CI \u0434\u043b\u044f Microsoft Dynamics CRM.<\/p>\n<p>  <\/p>\n<p>\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u0438 \u043f\u043e\u043a\u0430\u0436\u0443 \u043a\u0430\u043a \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c CI-\u0447\u0430\u0441\u0442\u044c \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u0430 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e\u0439 \u043f\u043e\u0441\u0442\u0430\u0432\u043a\u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 Microsoft Dynamics CRM \u043d\u0430 \u0431\u0430\u0437\u0435 Azure DevOps.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-317849","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/317849","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=317849"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/317849\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=317849"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=317849"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=317849"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}