{"id":401919,"date":"2024-06-29T16:10:46","date_gmt":"2024-06-29T16:10:46","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=401919"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=401919","title":{"rendered":"<span>CI\/CD \u0434\u043b\u044f Dynamics CRM \u043d\u0430 \u0431\u0430\u0437\u0435 Azure DevOps. \u0427\u0430\u0441\u0442\u044c 2. Continuous Deployment<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-1\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0412 \u043f\u0440\u043e\u0448\u043b\u043e\u0439 <a href=\"https:\/\/habr.com\/ru\/post\/536530\/\">\u0441\u0442\u0430\u0442\u044c\u0435<\/a> \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u043b \u043a\u0430\u043a \u0441\u043e\u0431\u0440\u0430\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 CI\/CD \u043d\u0430 \u0431\u0430\u0437\u0435 Azure DevOps Pipelines \u0434\u043b\u044f Microsoft Dynamics CRM. \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u0436\u0435 \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c \u043e CD (Continuous Deployment) \u0447\u0430\u0441\u0442\u0438. <\/p>\n<p><a name=\"habracut\"><\/a>  <\/p>\n<p>\u0414\u043b\u044f \u0440\u0435\u043b\u0438\u0437\u043e\u0432 \u0432 Azure DevOps \u0435\u0441\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u044b (Release Pipelines) \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0441 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430\u043c\u0438 Build Pipeline, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u0434\u0435\u043b\u0430\u043b\u0438 \u0432 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435, \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u0442\u0443\u0442 <a href=\"https:\/\/docs.microsoft.com\/en-us\/azure\/devops\/pipelines\/release\/?view=azure-devops\" rel=\"nofollow noopener noreferrer\">Release pipelines<\/a>.<\/p>\n<p>  <\/p>\n<p>\u0421\u0435\u0433\u043e\u0434\u043d\u044f \u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u0442\u044c \u043d\u0430\u0448\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0432 CRM Online \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <a href=\"https:\/\/marketplace.visualstudio.com\/items?itemName=WaelHamze.xrm-ci-framework-build-tasks\" rel=\"nofollow noopener noreferrer\">Power DevOps Tools<\/a>. \u042d\u0442\u043e \u043d\u0430\u0431\u043e\u0440 \u0443\u0442\u0438\u043b\u0438\u0442 \u043f\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f CRM. \u041a\u043e\u0434 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u043d\u0430 GitHub <a href=\"https:\/\/github.com\/WaelHamze\/xrm-ci-framework\" rel=\"nofollow noopener noreferrer\">https:\/\/github.com\/WaelHamze\/xrm-ci-framework<\/a>. \u0427\u0442\u043e\u0431\u044b \u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0432 \u0441\u0432\u043e\u0439 Azure DevOps \u0447\u0435\u0440\u0435\u0437 Marketplace \u043f\u043e \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0438 \u0441 SonarCloud \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u044f \u0441\u0441\u044b\u043b\u0430\u043b\u0441\u044f \u0432 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435. <\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u043e\u0431\u043d\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e MS Dynamics CRM \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0437\u0434\u0435\u0441\u044c <a href=\"https:\/\/trials.dynamics.com\/\" rel=\"nofollow noopener noreferrer\">https:\/\/trials.dynamics.com<\/a>. \u042f \u0441\u043e\u0437\u0434\u0430\u043b \u0434\u0432\u0435 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438, \u0414\u0435\u0432 \u0438 \u0422\u0435\u0441\u0442, \u0441 \u0414\u0435\u0432\u0430 \u0431\u0443\u0434\u0443 \u0437\u0430\u0431\u0438\u0440\u0430\u0442\u044c \u043a\u0430\u0441\u0442\u043e\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0442\u043e\u043c \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u0432\u0441\u0435\u043c \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u043c \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043d\u0430 \u0422\u0435\u0441\u0442\u0435.<\/p>\n<p>  <\/p>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a Power DevOps Tools \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e \u0434\u0440\u0443\u0433\u043e\u043c\u0443 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 \u043f\u043b\u0430\u0433\u0438\u043d\u0430\u043c\u0438, \u0441\u043a\u0440\u0438\u043f\u0442\u0430\u043c\u0438 \u0438 \u0441\u043e\u043b\u044e\u0448\u0435\u043d\u0430\u043c\u0438 \u044f \u0441\u0434\u0435\u043b\u0430\u043b \u043a\u043e\u043f\u0438\u044e \u043f\u0430\u0439\u043f\u0430 \u0438\u0437 \u043f\u0440\u043e\u0448\u043b\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 &#171;CRMCI PDT&#187; \u0438 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0435\u0433\u043e \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u043b. \u0421\u0442\u0430\u0440\u044b\u0439 \u043f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043b \u0432 CRMCI SPKL.<br \/>  \u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043e\u0442\u043b\u0438\u0447\u0438\u044f \u043e\u0442 SPKL:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0448\u0430\u0433\u043e\u0432 \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u043c JSON-\u0444\u0430\u0439\u043b\u0435 \u0430 \u043d\u0435 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430\u043c\u0438;<\/li>\n<li>\u043c\u0430\u043f\u043f\u0438\u043d\u0433 \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432, \u0442\u0430\u043a\u0436\u0435, \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u043c JSON-\u0444\u0430\u0439\u043b\u0435;<\/li>\n<li>\u041a\u0430\u0441\u0442\u043e\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u0435 \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u044b, solution XML \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u0430\u043d\u043d\u044b\u0439 SPKL \u043d\u0435 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f PDT.<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u042d\u0442\u043e \u044f \u0438 \u043f\u043e\u043f\u0440\u0430\u0432\u0438\u043b \u0432 \u043d\u043e\u0432\u043e\u043c \u043f\u0430\u0439\u043f\u0435 <a href=\"https:\/\/dev.azure.com\/ZhukoffPublic\/CRMCICD\/_build?definitionId=2\" rel=\"nofollow noopener noreferrer\">Build PDT<\/a>.<\/p>\n<p>  <\/p>\n<p>\u0412\u043e\u0442, \u0447\u0442\u043e \u044f \u0434\u043e\u0431\u0430\u0432\u0438\u043b.<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">  # \u041f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u044f \u0432\u0435\u0431-\u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u0438 \u043c\u0430\u043f\u043f\u0438\u043d\u0433\u0430 \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 webresources'     inputs:       SourceFolder: '$(Build.SourcesDirectory)\\CRMCI\\WebResources\\'       Contents: |         gz_\\**\\*.js         gz_\\**\\*.css         gz_\\**\\*.html       TargetFolder: '$(Build.StagingDirectory)\\webresources\\'       CleanTargetFolder: true   - task: CopyFiles@2     displayName: 'Copy webresources mapping'     inputs:       SourceFolder: '$(Build.SourcesDirectory)\\CRMCI\\WebResources\\'       Contents: 'WebResources.json'       targetFolder: '$(Build.StagingDirectory)\\webresources\\'   - publish: '$(Build.StagingDirectory)\\webresources'     displayName: 'Publish webresources as an artifact'     artifact: webresources   # \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 Power DevOps Tools   - task: MSCRMToolInstaller@12     displayName: 'Install Power DevOps Tools'     inputs:       nugetFeed: 'official'       psFeed: 'official'   # \u041f\u0430\u043a\u0443\u0435\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u0435   - task: MSCRMPackSolution@12     inputs:       unpackedFilesFolder: '$(Build.SourcesDirectory)\/CRMCI\/Solution\/Extracted'       mappingFile: '$(Build.SourcesDirectory)\/CRMCI\/Solution\/SolutionMapping.xml'       outputPath: '$(build.binariesdirectory)\/Solution'   # \u041f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f CRM   - task: CopyFiles@2     displayName: 'Publish CRM Solution to artefacts'     inputs:         SourceFolder: '$(build.binariesdirectory)\\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>\u0422\u0430\u043a\u0436\u0435, \u044f \u0441\u0434\u0435\u043b\u0430\u043b \u0435\u0449\u0435 \u043e\u0434\u0438\u043d \u043f\u0430\u0439\u043f, <a href=\"https:\/\/dev.azure.com\/ZhukoffPublic\/CRMCICD\/_build?definitionId=3\" rel=\"nofollow noopener noreferrer\">Export Solution<\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b\u0433\u0440\u0443\u0436\u0430\u0435\u0442 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0438 \u043a\u043e\u043c\u043c\u0438\u0442\u0438\u0442 \u0435\u0433\u043e \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439. \u0418\u0434\u0435\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043f\u0430\u0439\u043f \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d \u043d\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0438 \u043a\u043e\u0433\u0434\u0430 \u043a\u0442\u043e-\u0442\u043e \u043f\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u043b \u043d\u0430\u0434 \u043a\u0430\u0441\u0442\u043e\u043c\u0438\u0437\u0430\u0446\u0438\u044f\u043c\u0438 \u043e\u043d \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u043f\u0430\u0439\u043f \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u043d\u0435\u0441\u0435\u043d\u043d\u044b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438. \u041d\u0438\u0436\u0435 YAML \u044d\u0442\u043e\u0433\u043e \u043f\u0430\u0439\u043f\u0430:<\/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  steps: - task: MSCRMToolInstaller@12   displayName: 'Install Power DevOps Tools'   inputs:     nugetFeed: 'official'     psFeed: 'official' # \u0412\u044b\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u0435 - task: MSCRMExportSolution@12   displayName: 'Export CRM Solution'   inputs:     crmConnectionString: 'AuthType=OAuth;Url=https:\/\/orgc646f491.crm4.dynamics.com\/;Username=$(UserName);Password=$(UserPwd);ClientId=$(ClientId);LoginPrompt=Never;RedirectUri=app:\/\/58145B91-0C36-4500-8554-080854F2AC97'     solutionName: 'CICDDemo'     exportManaged: false     exportUnmanaged: true     outputPath: '$(build.binariesdirectory)'     crmConnectionTimeout: '300'     useAsyncMode: true - task: MSCRMExtractSolution@12   displayName: 'Unpack CRM Solution'   inputs:     unpackedFilesFolder: '$(Build.SourcesDirectory)\/CRMCI\/Solution\/Extracted'     solutionFile: '$(build.binariesdirectory)\/CICDDemo.zip'  - task: CmdLine@2   displayName: 'Commit solution to Git'   inputs:     script: >       echo set name         git config --local user.email \"grigory@zhukoff.pro\"        git config --local user.name \"Grigory Zhukov\"        git checkout $(Build.SourceBranchName)        echo pull        git pull https:\/\/Personal%20Access%20Token:$(PAT)@dev.azure.com\/ZhukoffPublic\/CRMCICD\/_git\/CRMCICD $(Build.SourceBranchName)        git add --all        git commit -m \"Solution Update from Dev\"        echo push code to $(Build.SourceBranchName)        git push https:\/\/Personal%20Access%20Token:$(PAT)@dev.azure.com\/ZhukoffPublic\/CRMCICD\/_git\/CRMCICD $(Build.SourceBranchName)<\/code><\/pre>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u043a CRM Online \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0443 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043d\u0430 \u0431\u0430\u0437\u0435 OAuth2.0. \u042f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u043f\u0440\u0438\u043c\u0435\u0440 \u0441 \u0441\u0430\u0439\u0442\u0430 Microsoft <a href=\"https:\/\/docs.microsoft.com\/en-us\/powerapps\/developer\/data-platform\/xrm-tooling\/use-connection-strings-xrm-tooling-connect\" rel=\"nofollow noopener noreferrer\">Use connection strings in XRM tooling to connect to Microsoft Dataverse<\/a> \u0431\u0435\u0437 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 TokenCacheStorePath \u0438 \u0432\u043c\u0435\u0441\u0442\u043e AppId \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b ClientId. \ud83d\ude42<br \/>  <code>AuthType=OAuth;Username=jsmith@contoso.onmicrosoft.com;Password=passcode;Url=https:\/\/contosotest.crm.dynamics.com;AppId=51f81489-12ee-4a9e-aaae-a2591f45987d;RedirectUri=app:\/\/58145B91-0C36-4500-8554-080854F2AC97;TokenCacheStorePath=c:\\MyTokenCache;LoginPrompt=Auto<\/code><\/p>\n<p>  <\/p>\n<h3 id=\"perehodim-k-delu\">\u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0434\u0435\u043b\u0443<\/h3>\n<p>  <\/p>\n<p>\u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u043d\u0430\u0448 \u043f\u0440\u043e\u0435\u043a\u0442, \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u0432 \u0440\u0430\u0437\u0434\u0435\u043b <strong>Pipelines<\/strong> \u043f\u043e\u0434\u0440\u0430\u0437\u0434\u0435\u043b <strong>Releases<\/strong>. \u0422\u0430\u043c \u043f\u043e\u043a\u0430 \u043f\u0443\u0441\u0442\u043e \u0442\u0430\u043a, \u0447\u0442\u043e \u0436\u043c\u0435\u043c \u043a\u043d\u043e\u043f\u043a\u0443 <strong>New pipeline<\/strong>.<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/47\/e5\/op\/47e5opljfoabgaxhkdkh1lvlnuk.png\" data-src=\"https:\/\/habrastorage.org\/webt\/47\/e5\/op\/47e5opljfoabgaxhkdkh1lvlnuk.png\"\/><\/p>\n<p>  <\/p>\n<p>\u043f\u043e\u043f\u0430\u0434\u0430\u0435\u043c \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0440\u0435\u043b\u0438\u0437\u043d\u043e\u0433\u043e \u043f\u0430\u0439\u043f\u0430. \u041a\u0430\u043a \u043c\u044b \u0432\u0438\u0434\u0438\u043c, \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u0434\u0438\u0437\u0430\u0439\u043d\u0435\u0440 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430 \u0441\u0430\u043c \u043f\u0430\u0439\u043f \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 <strong>Artifacts<\/strong> \u0438 <strong>Stages<\/strong>, \u043f\u0435\u0440\u0432\u043e\u0435 \u044d\u0442\u043e \u0442\u043e \u043e\u0442\u043a\u0443\u0434\u0430 \u043c\u044b \u0431\u0435\u0440\u0435\u043c \u043d\u0430\u0448 \u0431\u0438\u043b\u0434 \u0430 \u0432\u0442\u043e\u0440\u043e\u0435 \u044d\u0442\u0430\u043f\u044b \u043f\u0430\u0439\u043f\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u0442 \u0438\u0437 \u0434\u0436\u043e\u0431\u043e\u0432, \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 \u0442\u0430\u0441\u043a\u043e\u0432. <\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/jz\/eh\/kv\/jzehkvpiqugeyicmnl7qnv52y98.png\" data-src=\"https:\/\/habrastorage.org\/webt\/jz\/eh\/kv\/jzehkvpiqugeyicmnl7qnv52y98.png\"\/><\/p>\n<p>  <\/p>\n<p>\u0422\u0430\u043a\u0436\u0435, \u043d\u0430\u043c \u0441\u0440\u0430\u0437\u0443 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f \u043a\u0443\u0447\u043a\u0430 \u0433\u043e\u0442\u043e\u0432\u044b\u0445 \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0434\u0436\u043e\u0431\u043e\u0432. \u041a \u043d\u0438\u043c \u043c\u044b \u0435\u0449\u0435 \u0432\u0435\u0440\u043d\u0435\u043c\u0441\u044f \u0430 \u0441\u0435\u0439\u0447\u0430\u0441 \u0436\u043c\u0435\u043c <strong>Empty job<\/strong>.<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/ll\/mk\/2n\/llmk2nq0ukusrf90kc1q3azkpv8.png\" data-src=\"https:\/\/habrastorage.org\/webt\/ll\/mk\/2n\/llmk2nq0ukusrf90kc1q3azkpv8.png\"\/><\/p>\n<p>  <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \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. \u0438 \u0437\u0434\u0435\u0441\u044c \u043c\u044b \u0432\u0438\u0434\u0438\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0441\u0435\u043a\u0446\u0438\u0438:<\/p>\n<p>  <\/p>\n<ol>\n<li>\u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u043f\u0430\u043d\u0435\u043b\u044c \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043f\u0430\u0439\u043f\u043e\u043c, \u0432 <strong>Artifacts<\/strong> \u043c\u044b \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c \u043e\u0442\u043a\u0443\u0434\u0430 \u0438 \u043f\u0440\u0438 \u043a\u0430\u043a\u0438\u0445 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u0445 \u0437\u0430\u0431\u0438\u0440\u0430\u0442\u044c \u0431\u0438\u043b\u0434 \u0430 \u0432 <strong>Stages<\/strong> \u0447\u0442\u043e \u0434\u0430\u043b\u044c\u0448\u0435 \u0441 \u043d\u0438\u043c \u0434\u0435\u043b\u0430\u0442\u044c \u0438 \u043a\u0430\u043a.<\/li>\n<li>\u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0435 \u043c\u0435\u043d\u044e \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a:<br \/> \n<ul>\n<li><strong>Pipeline<\/strong> \u2014 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043f\u0430\u0439\u043f\u043e\u043c<\/li>\n<li><strong>Tasks<\/strong> \u2014 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u0442\u0430\u0441\u043a\u0430\u043c\u0438 \u0440\u0430\u0437\u043d\u044b\u0445 \u044d\u0442\u0430\u043f\u043e\u0432<\/li>\n<li><strong>Variables<\/strong> \u2014 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u043f\u0430\u0439\u043f\u0430<\/li>\n<li><strong>Retention<\/strong> \u2014 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0436\u0438\u0437\u043d\u0438 \u043f\u0430\u0439\u043f\u0430, \u0447\u0435\u0440\u0435\u0437 \u043a\u0430\u043a\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043f\u0430\u0439\u043f\u0430 \u0431\u0443\u0434\u0435\u0442 \u0443\u0434\u0430\u043b\u0435\u043d.<\/li>\n<li><strong>Options<\/strong> \u2014 \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0430\u0439\u043f\u0430, \u0435\u0433\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0439<\/li>\n<li><strong>History<\/strong> \u2014 \u0438\u0441\u0442\u043e\u0440\u0438\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439<\/li>\n<\/ul>\n<\/li>\n<li>\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u043c\u0435\u043d\u044e \u0433\u0434\u0435 \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u043f\u0430\u0439\u043f, \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c, \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0438 \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c.<\/li>\n<li>\u041e\u043a\u043d\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u044d\u0442\u0430\u043f\u0430, \u0433\u0434\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u0435\u0433\u043e \u0438\u043c\u044f, \u0432\u043b\u0430\u0434\u0435\u043b\u044c\u0446\u0430 \u0438 \u0434\u0440. \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438.<\/li>\n<\/ol>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u043d\u0430\u0448 \u0431\u0438\u043b\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0442\u044c. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043a\u043b\u0438\u043a\u0430\u0435\u043c \u043d\u0430 <strong>Add an artifact<\/strong> \u0438 \u0432 \u043f\u043e\u043b\u0435 <strong>Source (build pipeline)<\/strong> \u043d\u0430\u0448 \u043f\u0430\u0439\u043f <strong>Build PDT<\/strong>.<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/ed\/re\/ai\/edreaic78e6613onototeejjyqo.png\" data-src=\"https:\/\/habrastorage.org\/webt\/ed\/re\/ai\/edreaic78e6613onototeejjyqo.png\"\/><\/p>\n<p>  <\/p>\n<p>\u0415\u0441\u043b\u0438 \u043a\u043b\u0438\u043a\u043d\u0443\u0442\u044c \u043f\u043e \u043c\u043e\u043b\u043d\u0438\u0438 \u0432 \u0432\u0435\u0440\u043d\u0435\u043c \u043f\u0440\u0430\u0432\u043e\u043c \u0443\u0433\u043b\u0443 \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u044b \u0434\u043b\u044f \u043f\u0430\u0439\u043f\u0430, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u043f\u0440\u0438 \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0438 \u043d\u043e\u0432\u043e\u0433\u043e \u0431\u0438\u043b\u0434\u0430. \u0422\u0430\u043a\u0436\u0435, \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0437\u0430\u043f\u0443\u0441\u043a \u043f\u043e \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u044e, \u043a\u043b\u0438\u043a\u043d\u0443\u0432 \u043d\u0430 \u0437\u043d\u0430\u0447\u043e\u043a \u0447\u0430\u0441\u043e\u0432 \u0441\u043d\u0438\u0437\u0443.<\/p>\n<p>  <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u043d\u0430\u0448\u0435\u043c\u0443 \u043f\u0435\u0440\u0432\u043e\u043c\u0443 \u0448\u0430\u0433\u0443 <strong>Stage 1<\/strong>, \u043a\u043b\u0438\u043a\u0430\u0435\u043c \u043d\u0430 \u043d\u0435\u0433\u043e \u0438 \u043c\u0435\u043d\u044f\u0435\u043c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043d\u0430 <strong>Deploy Solutions<\/strong>. \u0417\u0434\u0435\u0441\u044c \u0436\u0435, \u043a\u043b\u0438\u043a\u043d\u0443\u0432 \u043d\u0430 \u043c\u043e\u043b\u043d\u0438\u044e, \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u044b \u0438 \u0444\u0438\u043b\u044c\u0442\u0440\u044b \u0434\u043b\u044f \u044d\u0442\u0430\u043f\u0430 \u0430 \u0442\u0430\u043a\u0436\u0435, \u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0430 (Quality gate).<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/t0\/rp\/sg\/t0rpsgaug-pyh_uugvywkc7wqf4.png\" data-src=\"https:\/\/habrastorage.org\/webt\/t0\/rp\/sg\/t0rpsgaug-pyh_uugvywkc7wqf4.png\"\/><\/p>\n<p>  <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u043c \u043f\u0435\u0440\u0432\u044b\u0439 \u0448\u0430\u0433 \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u043d\u0430 \u0441\u0440\u0435\u0434\u0443 \u0422\u0435\u0441\u0442. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043a\u043b\u0438\u043a\u0430\u0435\u043c \u043d\u0430 <strong><em>1 job, 0 task<\/em><\/strong> \u0438 \u043f\u043e\u043f\u0430\u0434\u0430\u0435\u043c \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u044d\u0442\u0430\u043f\u0430, \u0433\u0434\u0435 \u043a\u043b\u0438\u043a\u0430\u0435\u043c \u043d\u0430 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 <strong>Agent job<\/strong>.<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/wn\/_q\/bt\/wn_qbtrjq0qpmrktrjre7wdqqxk.png\" data-src=\"https:\/\/habrastorage.org\/webt\/wn\/_q\/bt\/wn_qbtrjq0qpmrktrjre7wdqqxk.png\"\/><\/p>\n<p>  <\/p>\n<p>\u0417\u0434\u0435\u0441\u044c \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u0438\u043c\u044f \u0434\u0436\u043e\u0431\u044b, \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0430\u0433\u0435\u043d\u0442\u0430, \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e \u043e\u0431\u043b\u0430\u0447\u043d\u044b\u0439 \u0430\u0433\u0435\u043d\u0442 &#171;<strong>vs2017-win2016<\/strong>&#171;, \u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0435\u0441\u043b\u0438 \u043d\u0430\u0448\u0435\u043c\u0443 \u043f\u0430\u0439\u043f\u0443 \u043d\u0443\u0436\u0435\u043d PowerShell \u0438\u043b\u0438 Java.<\/p>\n<p>  <\/p>\n<p>\u041d\u0430\u0436\u0438\u043c\u0430\u0435\u043c + \u0441\u043f\u0440\u0430\u0432\u0430 \u043e\u0442 <strong>Agent Job<\/strong> \u0447\u0442\u043e\u0431\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u0435\u0440\u0432\u044b\u0439 \u0442\u0430\u0441\u043a \u0438 \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 <strong>Power DevopsTool Installer<\/strong>, \u0442.\u043a. \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043e\u0431\u043b\u0430\u0447\u043d\u043e\u0433\u043e \u0430\u0433\u0435\u043d\u0442\u0430 \u0442\u043e \u043d\u0430\u0434\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u0441\u0435 \u0447\u0435\u0433\u043e \u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442 \u043d\u0430 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u0435, \u0433\u0434\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d \u0430\u0433\u0435\u043d\u0442. \u0415\u0441\u043b\u0438 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0435\u0433\u043e \u0430\u0433\u0435\u043d\u0442\u0430, \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u0441\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0435 \u0438 \u0442\u0430\u043a\u0438\u0435 \u0448\u0430\u0433\u0438 \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0442\u044c.<\/p>\n<p>  <\/p>\n<p>\u0412 \u043f\u043e\u043b\u0435 \u043f\u043e\u0438\u0441\u043a\u0430 \u0432\u0432\u043e\u0434\u0438\u043c <em>Power dev<\/em>, \u043d\u0430\u0445\u043e\u0434\u0438\u043c <strong>Power DevopsTool Installer<\/strong> \u0438 \u0436\u043c\u0435\u043c <strong>Add<\/strong>.<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/oi\/_e\/pc\/oi_epcc7vyitut6lcxs5nrelozm.png\" data-src=\"https:\/\/habrastorage.org\/webt\/oi\/_e\/pc\/oi_epcc7vyitut6lcxs5nrelozm.png\"\/><\/p>\n<p>  <\/p>\n<p>\u0417\u0430\u0442\u0435\u043c, \u0432 \u043f\u043e\u0438\u0441\u043a\u0435 \u0432\u0432\u043e\u0434\u0438\u043c <em>import<\/em> \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0442\u0430\u0441\u043a <strong>Import Solution<\/strong>. \u041f\u043e\u0441\u043b\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043c\u044b \u0443\u0432\u0438\u0434\u0438\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 <em>&#171;Some settings need attention&#187;<\/em>, \u043a\u043b\u0438\u043a\u0430\u0435\u043c \u043d\u0430 \u0442\u0430\u0441\u043a \u0438 \u0432\u0438\u0434\u0438\u043c \u0447\u0442\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0432\u0432\u0435\u0441\u0442\u0438 \u0441\u0442\u0440\u043e\u043a\u0443 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f.<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/jw\/-l\/g4\/jw-lg4vz2rrwpzq83jusnokbbng.png\" data-src=\"https:\/\/habrastorage.org\/webt\/jw\/-l\/g4\/jw-lg4vz2rrwpzq83jusnokbbng.png\"\/><\/p>\n<p>  <\/p>\n<p>\u0417\u0434\u0435\u0441\u044c, \u043a\u0430\u043a \u0438 \u0432 \u0431\u0438\u043b\u0434-\u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u0435, \u043d\u0430\u043c \u043f\u043e\u043c\u043e\u0433\u0443\u0442 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435. \u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u043f\u0430\u0439\u043f \u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043d\u0430 \u0437\u0430\u043a\u043b\u0430\u0434\u043a\u0443 <strong>Variables<\/strong> 2 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435, <strong>UserName<\/strong>, <strong>UserPwd<\/strong> \u0438 <strong>ClientId<\/strong> \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u043d\u0430\u0448 \u043b\u043e\u0433\u0438\u043d \u0438 \u043f\u0430\u0440\u043e\u043b\u044c \u043e\u0442 \u043e\u0431\u043b\u0430\u0447\u043d\u043e\u0439 CRM \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e.<\/p>\n<p>  <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u0441\u044f \u043a \u043d\u0430\u0448\u0435\u043c\u0443 \u0448\u0430\u0433\u0443 \u0438 \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0432 \u043f\u043e\u043b\u0435 Connection string \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443<br \/>  <code>AuthType=OAuth;Url=https:\/\/org87d49aa0.crm4.dynamics.com\/;Username=$(UserName);Password=$(UserPwd);ClientId=$(ClientId);LoginPrompt=Never;RedirectUri=app:\/\/58145B91-0C36-4500-8554-080854F2AC97<\/code><\/p>\n<p>  <\/p>\n<blockquote><p>\u041d\u0435 \u0437\u0430\u0431\u0443\u0434\u044c\u0442\u0435 \u0443 \u0441\u0435\u0431\u044f \u043f\u043e\u043f\u0440\u0430\u0432\u0438\u0442\u044c url \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438.<\/p><\/blockquote>\n<p>\u0412\u0441\u0435, \u043f\u0435\u0440\u0432\u044b\u0439 \u0448\u0430\u0433 \u0433\u043e\u0442\u043e\u0432.<\/p>\n<p>  <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0434\u043b\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u0448\u0430\u0433\u0430 \u0438\u043c\u043f\u043e\u0440\u0442\u0430 \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u0432 \u0433\u043b\u0430\u0432\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u043a\u043b\u0438\u043a\u043d\u0443\u0432 \u043d\u0430 \u0437\u0430\u043a\u043b\u0430\u0434\u043a\u0443 <strong>Pipeline<\/strong> \u0430 \u0437\u0430\u0442\u0435\u043c \u043d\u0430 \u043f\u043b\u044e\u0441\u0438\u043a \u0441\u043f\u0440\u0430\u0432\u0430 \u043e\u0442 <strong>Stages<\/strong> \u0438 \u043d\u0430 <strong>New stage<\/strong>.<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/jx\/q8\/-b\/jxq8-bsznnecy6nt33_b0lpwny0.png\" data-src=\"https:\/\/habrastorage.org\/webt\/jx\/q8\/-b\/jxq8-bsznnecy6nt33_b0lpwny0.png\"\/><\/p>\n<p>  <\/p>\n<p>\u0417\u0434\u0435\u0441\u044c \u0441\u043d\u043e\u0432\u0430 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c <strong>Empty job<\/strong> \u0434\u0430\u043b\u044c\u0448\u0435 \u043f\u043e \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0438 \u0441 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u043c \u044d\u0442\u0430\u043f\u043e\u043c, \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u0437\u043e\u0432\u0435\u043c \u0435\u0433\u043e <strong>Deploy WebResources<\/strong> \u0438 \u0432\u0442\u043e\u0440\u044b\u043c \u0434\u0436\u043e\u0431\u043e\u043c \u0431\u0443\u0434\u0435\u0442 <strong>Update Web resources<\/strong>? \u0433\u0434\u0435 \u043d\u0430\u0434\u043e \u0431\u0443\u0434\u0435\u0442 \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0443 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f, \u0442\u0438\u043f \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f, \u0443 \u043c\u0435\u043d\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0444\u0430\u0439\u043b\u0430 \u043c\u0430\u043f\u043f\u0438\u043d\u0433\u0430 .json, \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u043f\u0430\u043f\u043a\u0443 \u0441 \u0432\u0435\u0431-\u0440\u0435\u0441\u0443\u0440\u0441\u0430\u043c\u0438, \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u0444\u0430\u0439\u043b \u043c\u0430\u043f\u043f\u0438\u043d\u0433\u0430 \u0438 \u043d\u0430\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0435 \u0432\u0435\u0431-\u0440\u0435\u0441\u0443\u0440\u0441\u044b.<br \/>  \u0424\u0430\u0439\u043b \u043c\u0430\u043f\u043f\u0438\u043d\u0433\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">{     'webresources': [{             'root': '',             'files': [{                     'uniquename': 'gz_\/js\/ContactFormEvents.js',                     'file': 'js\/ContactFormEvents.js',                     'description': '\u0421\u043a\u0440\u0438\u043f\u0442\u044b \u0444\u043e\u0440\u043c\u044b \u041a\u043e\u043d\u0442\u0430\u043a\u0442\u0430'                 }             ]         }     ] }<\/code><\/pre>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/qh\/qu\/bu\/qhqubudasce6hzcuzhhijtraj2k.png\" data-src=\"https:\/\/habrastorage.org\/webt\/qh\/qu\/bu\/qhqubudasce6hzcuzhhijtraj2k.png\"\/><\/p>\n<p>  <\/p>\n<p>\u0418 \u0435\u0449\u0435 \u0440\u0430\u0437 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u044d\u0442\u0430\u043f\u0430 \u0434\u043b\u044f \u0438\u043c\u043f\u043e\u0440\u0442\u0430 \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u0437\u043e\u0432\u0435\u043c Plugin Registration \u0438 \u0432\u0442\u043e\u0440\u044b\u043c \u0434\u0436\u043e\u0431\u043e\u043c \u0431\u0443\u0434\u0435\u0442 <strong>Plugin Registration<\/strong>. \u0422\u0430\u043a \u0436\u0435 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0441\u0442\u0440\u043e\u043a\u0443 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f, \u0442\u0438\u043f \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f:<\/p>\n<p>  <\/p>\n<ul>\n<li><strong>Upsert<\/strong>: \u041e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0441\u0431\u043e\u0440\u043a\u0438\/\u0448\u0430\u0433\u0438 \u0438 \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u043d\u043e\u0432\u044b\u0435. <\/li>\n<li><strong>Reset<\/strong>: \u0423\u0434\u0430\u043b\u044f\u0435\u0442 \u0432\u0441\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0441\u0431\u043e\u0440\u043a\u0438\/\u0448\u0430\u0433\u0438 \u0438 \u0437\u0430\u043d\u043e\u0432\u043e \u0441\u043e\u0437\u0434\u0430\u0435\u0442. <\/li>\n<li><strong>Delsert<\/strong>: \u0414\u0435\u043b\u0430\u0435\u0442 \u0442\u043e\u0436\u0435 \u0441\u0430\u043c\u043e\u0435 \u0447\u0442\u043e \u0438 Upsert \u0438 \u043f\u043e\u0442\u043e\u043c \u0443\u0434\u0430\u043b\u044f\u0435\u0442 \u0441\u0431\u043e\u0440\u043a\u0438\/\u0448\u0430\u0433\u0438\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043d\u0435\u0442 \u0432 \u043c\u0430\u043f\u043f\u0438\u043d\u0433\u0435.<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0423 \u043c\u0435\u043d\u044f <strong>Delsert<\/strong>, \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u043f\u0430\u043f\u043a\u0443 \u0441 dll \u0444\u0430\u0439\u043b\u0430\u043c\u0438, \u043d\u0430\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u0442\u044c \u043f\u043b\u0430\u0433\u0438\u043d\u044b \u0438 \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u0444\u0430\u0439\u043b \u043c\u0430\u043f\u043f\u0438\u043d\u0433\u0430.<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/qh\/qu\/bu\/qhqubudasce6hzcuzhhijtraj2k.png\" data-src=\"https:\/\/habrastorage.org\/webt\/qh\/qu\/bu\/qhqubudasce6hzcuzhhijtraj2k.png\"\/><\/p>\n<p>  <\/p>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u043f\u0430\u0439\u043f \u0441 \u0442\u0440\u0435\u043c\u044f \u044d\u0442\u0430\u043f\u0430\u043c\u0438 \u043a\u043e\u0442\u043e\u0440\u044b\u0439\u0435 \u0438\u0434\u0443\u0442 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u0440\u0443\u0433 \u0437\u0430 \u0434\u0440\u0443\u0433\u043e\u043c.<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/t0\/hf\/uw\/t0hfuwm7a4194trunxw1laiy3y4.png\" data-src=\"https:\/\/habrastorage.org\/webt\/t0\/hf\/uw\/t0hfuwm7a4194trunxw1laiy3y4.png\"\/><\/p>\n<p>  <\/p>\n<p>\u0423 \u043c\u043d\u043e\u0433\u0438\u0445 \u043c\u043e\u0436\u0435\u0442 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u0443\u0442\u044c \u0432\u043e\u043f\u0440\u043e\u0441 \u043f\u043e\u0447\u0435\u043c\u0443 \u044f \u0441\u0434\u0435\u043b\u0430\u043b \u0442\u0440\u0438 \u0440\u0430\u0437\u043d\u044b\u0445 \u044d\u0442\u0430\u043f\u0430 \u043f\u043e 2 \u0434\u0436\u043e\u0431\u0430 \u0430 \u043d\u0435 \u043e\u0434\u0438\u043d \u044d\u0442\u0430\u043f \u0441 \u0447\u0435\u0442\u044b\u0440\u044c\u043c\u044f \u0434\u0436\u043e\u0431\u0430\u043c\u0438?<br \/>  \u041d\u0430 \u044d\u0442\u043e \u0435\u0441\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438\u0447\u0438\u043d:<\/p>\n<p>  <\/p>\n<ol>\n<li>\u0415\u0441\u043b\u0438 \u0447\u0442\u043e-\u0442\u043e \u043f\u043e\u0448\u043b\u043e \u043d\u0435 \u0442\u0430\u043a \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u044d\u0442\u0430\u043f \u0430 \u0434\u0436\u043e\u0431 \u043d\u0435\u043b\u044c\u0437\u044f \u0438 \u0435\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u043a\u0430\u043a\u0430\u044f-\u0442\u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0441 \u043f\u043b\u0430\u0433\u0438\u043d\u0430\u043c\u0438 \u043d\u0435 \u043a\u0430\u0441\u0430\u044e\u0449\u0430\u044f\u0441\u044f \u0441\u0430\u043c\u0438\u0445 \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, Deploy Admin \u043d\u0435\u0442\u0443 \u0443 \u0443\u0447\u0435\u0442\u043a\u0438 \u043e\u0442 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043a\u0440\u0443\u0442\u0438\u0442\u0441\u044f \u0430\u0433\u0435\u043d\u0442 \u0430 \u0432 \u0441\u0431\u043e\u0440\u043a\u0435 \u043f\u043b\u0430\u0433\u0438\u043d \u043d\u0435 \u0432 \u0441\u0430\u043d\u0434\u0431\u043e\u043a\u0441\u0435. \u0422\u043e, \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u0434\u043d\u043e\u0433\u043e \u044d\u0442\u0430\u043f\u0430, \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c\u0435\u0433\u043e \u0446\u0435\u043b\u0438\u043a\u043e\u043c \u0438 \u043d\u0430\u043a\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0435\u0449\u0435 \u0440\u0430\u0437 \u043a\u0430\u0441\u0442\u043e\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u0432\u0435\u0431\u0440\u0435\u0441\u0443\u0440\u0441\u044b, \u0447\u0442\u043e \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u0443\u0434\u043e\u0431\u043d\u043e. <\/li>\n<li>\u042d\u0442\u0430\u043f\u044b \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0442\u044c, \u0447\u0442\u043e-\u0431\u044b \u043e\u043d\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u043b\u0438\u0441\u044c \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441 \u043f\u043b\u0430\u0433\u0438\u043d\u0430\u043c\u0438 \u0438 \u0432\u0435\u0431-\u0440\u0435\u0441\u0443\u0440\u0441\u0430\u043c\u0438 \u0442.\u043a. \u043e\u043d\u0438 \u0437\u0430\u0432\u0438\u0441\u044f\u0442 \u043e\u0442 \u043a\u0430\u0441\u0442\u043e\u043c\u0438\u0437\u0430\u0446\u0438\u0439 \u043d\u043e \u043d\u0435 \u0437\u0430\u0432\u0438\u0441\u044f\u0442 \u0434\u0440\u0443\u0433 \u043e\u0442 \u0434\u0440\u0443\u0433\u0430. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043a\u043b\u0438\u043a\u0430\u0435\u043c \u043d\u0430 <strong>Pre-deployment Conditions<\/strong> \u0438, \u0432 \u043f\u043e\u044f\u0432\u0438\u0432\u0448\u0435\u043c\u0441\u044f \u043c\u0435\u043d\u044e \u0443 \u043d\u0430\u0441 \u0434\u043e\u043b\u0436\u043d\u043e \u0441\u0442\u043e\u044f\u0442\u044c <strong>Select trigger \u2014 After stage<\/strong> \u0438 \u0432 Stages \u043c\u044b \u0441\u0442\u0430\u0432\u0438\u043c \u0433\u0430\u043b\u043a\u0443 \u043d\u0430\u043f\u0440\u043e\u0442\u0438\u0432 <strong>Deploy Solution<\/strong> \u0430 \u043d\u0430\u043f\u0440\u043e\u0442\u0438\u0432 <strong>Deploy WebResources<\/strong> \u0443\u0431\u0438\u0440\u0430\u0435\u043c. <\/li>\n<\/ol>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/gm\/mk\/gw\/gmmkgwpbv1jx8lhq0onh_fo0u7m.png\" data-src=\"https:\/\/habrastorage.org\/webt\/gm\/mk\/gw\/gmmkgwpbv1jx8lhq0onh_fo0u7m.png\"\/><\/p>\n<p>  <\/p>\n<p>to be continued&#8230;<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \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\/articles\/567110\/\"> https:\/\/habr.com\/ru\/articles\/567110\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-1\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0412 \u043f\u0440\u043e\u0448\u043b\u043e\u0439 <a href=\"https:\/\/habr.com\/ru\/post\/536530\/\">\u0441\u0442\u0430\u0442\u044c\u0435<\/a> \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u043b \u043a\u0430\u043a \u0441\u043e\u0431\u0440\u0430\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 CI\/CD \u043d\u0430 \u0431\u0430\u0437\u0435 Azure DevOps Pipelines \u0434\u043b\u044f Microsoft Dynamics CRM. \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u0436\u0435 \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c \u043e CD (Continuous Deployment) \u0447\u0430\u0441\u0442\u0438. <\/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-401919","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/401919","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=401919"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/401919\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=401919"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=401919"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=401919"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}