{"id":22074,"date":"2013-01-09T09:37:15","date_gmt":"2013-01-09T16:37:15","guid":{"rendered":"https:\/\/devblogs.microsoft.com\/aspnet\/?p=22074"},"modified":"2013-01-09T09:37:15","modified_gmt":"2013-01-09T16:37:15","slug":"real-scenario-folder-deployment-scenarios-with-msdeploy","status":"publish","type":"post","link":"https:\/\/devblogs.microsoft.com\/dotnet\/real-scenario-folder-deployment-scenarios-with-msdeploy\/","title":{"rendered":"Real Scenario: folder deployment scenarios with MSDeploy"},"content":{"rendered":"<p>Hi everyone <a href=\"http:\/\/sedodream.com\/\" target=\"_blank\" rel=\"noopener\">Sayed<\/a> here. I recently had a customer, Johan, contact me to help with some challenges regarding deployment automation. He had some very specific requirements, but he was able to automate the entire process. He has been kind enough to agree to write up his experience to share with everyone. His story is below. If you have any comments please let us know. I will pass them to Johan.<\/p>\n<p>I\u2019d like to thank Johan for his willingness to write this up and share it. FYI if you\u2019d like me to help you in your projects I will certainly do my best, but if you are willing to share your story like Johan it will motivate me more \ud83d\ude42 \u2013 Sayed<\/p>\n<p>\u00a0<\/p>\n<h3>Folder deployment scenarios with the MsDeploy command line utility<\/h3>\n<p>We have an Umbraco CMS web site where deployment is specific to certain folders only and not the complete website. Below is a snapshot of a typical Umbraco website.<\/p>\n<p><a href=\"https:\/\/msdnshared.blob.core.windows.net\/media\/MSDNBlogsFS\/prod.evol.blogs.msdn.com\/CommunityServer.Blogs.Components.WeblogFiles\/00\/00\/00\/63\/56\/metablogapi\/2450.clip_image001_7E5691DE.jpg\"><img decoding=\"async\" title=\"clip_image001\" border=\"0\" alt=\"clip_image001\" src=\"https:\/\/msdnshared.blob.core.windows.net\/media\/MSDNBlogsFS\/prod.evol.blogs.msdn.com\/CommunityServer.Blogs.Components.WeblogFiles\/00\/00\/00\/63\/56\/metablogapi\/3438.clip_image001_thumb_3DB4456F.jpg\" width=\"118\" height=\"428\" \/><\/a><\/p>\n<p>I have omitted root files such as <strong>web.config<\/strong> as they never get deployed. Now as we develop new features, only those purple folders gets modified so there is no need to redeploy the bulky yellow folders which mostly contains the Umbraco CMS admin system. I will refer to these purple folders as release files.<\/p>\n<p>The green <strong>media<\/strong> folder is a special case. Our ecommerce team modifies the content on a daily basis in a CMS environment. They may publish their changes to production at will. Content related files from this folder automatically synchronises to the production environment through a file watcher utility. Thus the CMS and PROD environments always contain the latest versions and we can never overwrite this.<\/p>\n<p>This results in a special case for deployment. These are the steps we follow:<\/p>\n<p>1&#046; When preparing the QA environment, we first update the media folder from CMS<\/p>\n<p>2&#046; Then we transfer all the release files from DEV to QA<\/p>\n<p>3&#046; After QA sign off, we deploy those same the release files to PROD<\/p>\n<p>4&#046; Next we update the CMS release files<\/p>\n<p>5&#046; And then finally the media is transferred to DEV so<\/p>\n<p>This flow is illustrated below:<\/p>\n<p><a href=\"https:\/\/msdnshared.blob.core.windows.net\/media\/MSDNBlogsFS\/prod.evol.blogs.msdn.com\/CommunityServer.Blogs.Components.WeblogFiles\/00\/00\/00\/63\/56\/metablogapi\/7242.clip_image003_369508F7.jpg\"><img decoding=\"async\" title=\"clip_image003\" border=\"0\" alt=\"clip_image003\" src=\"https:\/\/msdnshared.blob.core.windows.net\/media\/MSDNBlogsFS\/prod.evol.blogs.msdn.com\/CommunityServer.Blogs.Components.WeblogFiles\/00\/00\/00\/63\/56\/metablogapi\/4812.clip_image003_thumb_244C4235.jpg\" width=\"605\" height=\"448\" \/><\/a><\/p>\n<p>Previously this was done by zipping folders up, transferring it to the different environments, expanding and then overriding the target destination. This was tedious and obviously quite risky. With assistance from <a href=\"http:\/\/sedodream.com\/\">Sayed Hashimi<\/a> at Microsoft, I have managed to greatly simplify this task through MsDeploy.<\/p>\n<p>MsDeploy can be downloaded <a href=\"http:\/\/www.iis.net\/downloads\/microsoft\/web-deploy\">here<\/a> and the command line utility normally installs at:<\/p>\n<table cellspacing=\"0\" cellpadding=\"0\" border=\"1\">\n<tbody>\n<tr>\n<td width=\"616\">\n<p>\n          c:\\Program Files\\IIS\\Microsoft Web Deploy V3\\msdeploy.exe\n        <\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>The syntax I will concentrate on is as follows (more details can be found <a href=\"http:\/\/technet.microsoft.com\/en-us\/library\/dd569106(v=ws.10).aspx\">here<\/a>):<\/p>\n<table cellspacing=\"0\" cellpadding=\"0\" border=\"1\">\n<tbody>\n<tr>\n<td width=\"616\">\n<p>\n          msdeploy.exe -verb:sync\n        <\/p>\n<p>\n          \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 -source:=\n        <\/p>\n<p>\n          \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 -dest:=\n        <\/p>\n<p>\n          \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 -useCheckSum -disableRule:BackupRule\n        <\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>The \u2018useCheckSum\u2019 setting will ensure that only file changes are considered and \u2018disableRule:BackupRule\u2019 setting will stop warnings from being thrown. Automatic backups can be enabled with <a href=\"http:\/\/www.iis.net\/learn\/publish\/using-web-deploy\/web-deploy-automatic-backups\">these<\/a> instructions, but to keep things simple, we will create our own backups.<\/p>\n<p>For the purposes of illustration, we\u2019ll assume that our websites are all installed at the following location in each environment:<\/p>\n<table cellspacing=\"0\" cellpadding=\"0\" border=\"1\">\n<tbody>\n<tr>\n<td width=\"616\">\n<p>\n          C:\\MsDeployTest\\[Environment]\\Website\n        <\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h4> <\/h4>\n<h4>Step 1: Update the QA media folder<\/h4>\n<p><a href=\"https:\/\/msdnshared.blob.core.windows.net\/media\/MSDNBlogsFS\/prod.evol.blogs.msdn.com\/CommunityServer.Blogs.Components.WeblogFiles\/00\/00\/00\/63\/56\/metablogapi\/0211.clip_image004_641628BA.png\"><img decoding=\"async\" title=\"clip_image004\" border=\"0\" alt=\"clip_image004\" src=\"https:\/\/msdnshared.blob.core.windows.net\/media\/MSDNBlogsFS\/prod.evol.blogs.msdn.com\/CommunityServer.Blogs.Components.WeblogFiles\/00\/00\/00\/63\/56\/metablogapi\/1781.clip_image004_thumb_71E86EB5.png\" width=\"444\" height=\"166\" \/><\/a><\/p>\n<p>First we need to package up the media folder to a zip file, transfer it over to the QA environment and then deploy that package. We\u2019ll create a .bat file and an .xml file that we can reuse in the future. On the CMS box at a location of your choice, create a <strong>Package.bat<\/strong> file with the following contents:<\/p>\n<table cellspacing=\"0\" cellpadding=\"0\" border=\"1\">\n<tbody>\n<tr>\n<td width=\"616\">\n<p>\n          @echo off\n        <\/p>\n<p>\n          &#8220;c:\\Program Files\\IIS\\Microsoft Web Deploy V3\\msdeploy.exe&#8221; ^\n        <\/p>\n<p>\n          -verb:sync ^\n        <\/p>\n<p>\n          -source:manifest=&#8221;Package.xml&#8221; ^\n        <\/p>\n<p>\n          -dest:package=&#8221;Media @ %date:~6,4%-%date:~3,2%-%date:~0,2% %time:~0,2%-%time:~3,2%.zip&#8221; ^\n        <\/p>\n<p>\n          -useCheckSum ^\n        <\/p>\n<p>\n          -disableRule:BackupRule\n        <\/p>\n<p>\n          pause\n        <\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Also create a <strong>Package.xml<\/strong> file at the same location with the following contents:<\/p>\n<table cellspacing=\"0\" cellpadding=\"0\" border=\"1\">\n<tbody>\n<tr>\n<td width=\"616\">\n<\/p>\n<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>When you execute the <strong>Package.bat<\/strong> file, it will create a zip file (i.e. <strong>Media @ 2013-01-05 10-00.zip<\/strong>) containing the folder and subfolders you listed in <strong>Package.xml<\/strong>. Now we transfer the zip file to the QA box into a folder of our choice. In that same folder, create a <strong>Deploy.bat<\/strong> file with the following contents:<\/p>\n<table cellspacing=\"0\" cellpadding=\"0\" border=\"1\">\n<tbody>\n<tr>\n<td width=\"616\">\n<p>\n          @echo off\n        <\/p>\n<p>\n          set \/p package=Enter the package name (tab to cycle):\n        <\/p>\n<p>\n          if &#8216;%package%&#8217; == &#8221; goto error\n        <\/p>\n<p>\n          set \/p manifest=Enter the manifest name (tab to cycle):\n        <\/p>\n<p>\n          if &#8216;%manifest%&#8217; == &#8221; goto error\n        <\/p>\n<p>\n          &#8220;c:\\Program Files\\IIS\\Microsoft Web Deploy V3\\msdeploy.exe&#8221; ^\n        <\/p>\n<p>\n          -verb:sync ^\n        <\/p>\n<p>\n          -source:package=%package% ^\n        <\/p>\n<p>\n          -dest:manifest=%manifest% ^\n        <\/p>\n<p>\n          -useCheckSum ^\n        <\/p>\n<p>\n          -disableRule:BackupRule ^\n        <\/p>\n<p>\n          -whatif\n        <\/p>\n<p>\n          echo.\n        <\/p>\n<p>\n          set \/p deploy=Trial run complete &#8211; proceed to deployment (Y\/N)?\n        <\/p>\n<p>\n          if &#8220;%deploy%&#8221;==&#8221;Y&#8221; goto deploy\n        <\/p>\n<p>\n          if &#8220;%deploy%&#8221;==&#8221;y&#8221; goto deploy\n        <\/p>\n<p>\n          goto end\n        <\/p>\n<p>\n          :deploy\n        <\/p>\n<p>\n          &#8220;c:\\Program Files\\IIS\\Microsoft Web Deploy V3\\msdeploy.exe&#8221; ^\n        <\/p>\n<p>\n          -verb:sync ^\n        <\/p>\n<p>\n          -source:package=%package% ^\n        <\/p>\n<p>\n          -dest:manifest=%manifest% ^\n        <\/p>\n<p>\n          -useCheckSum ^\n        <\/p>\n<p>\n          -disableRule:BackupRule\n        <\/p>\n<p>\n          md Archive\n        <\/p>\n<p>\n          move %package% Archive\n        <\/p>\n<p>\n          goto end\n        <\/p>\n<p>\n          :error\n        <\/p>\n<p>\n          echo You did not enter a package name\n        <\/p>\n<p>\n          :end\n        <\/p>\n<p>\n          echo.\n        <\/p>\n<p>\n          pause\n        <\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Also create a <strong>Media.xml<\/strong> file at the same location with the same contents as <strong>Package.xml<\/strong> listed above. Update any paths if required.<\/p>\n<p>When you now execute the batch file, supply the package filename when prompted <em>(you can use the tab key to cycle through files in the same folder)<\/em>. Note that we used the \u2018-dest:manifest=\u201dMedia.xml\u201d\u2019 parameter with MsDeploy. This does not modify <strong>Media.xml<\/strong> but rather uses it as reference for deployment instructions. Also note that MsDeploy executes twice, but the first time it uses the \u2018-whatif\u2019 parameter. This gives you the chance to test the deployment first without making any modifications. It will spew out the same output as always but only simulate the syncing of files. Then you will be prompted to commit the deployment and if you proceed, the QA website\u2019s media folder should now be synced up with the CMS environment.<\/p>\n<h4> <\/h4>\n<h4>Step 2: Release to QA<\/h4>\n<p><a href=\"https:\/\/msdnshared.blob.core.windows.net\/media\/MSDNBlogsFS\/prod.evol.blogs.msdn.com\/CommunityServer.Blogs.Components.WeblogFiles\/00\/00\/00\/63\/56\/metablogapi\/4428.clip_image005_3CDBDF85.png\"><img decoding=\"async\" title=\"clip_image005\" border=\"0\" alt=\"clip_image005\" src=\"https:\/\/msdnshared.blob.core.windows.net\/media\/MSDNBlogsFS\/prod.evol.blogs.msdn.com\/CommunityServer.Blogs.Components.WeblogFiles\/00\/00\/00\/63\/56\/metablogapi\/8713.clip_image005_thumb_63A9F5C5.png\" width=\"387\" height=\"171\" \/><\/a><\/p>\n<p>On the DEV box in a folder of your choice, create a <strong>Package.bat<\/strong> file with the following contents:<\/p>\n<table cellspacing=\"0\" cellpadding=\"0\" border=\"1\">\n<tbody>\n<tr>\n<td width=\"616\">\n<p>\n          @echo off\n        <\/p>\n<p>\n          &#8220;c:\\Program Files\\IIS\\Microsoft Web Deploy V3\\msdeploy.exe&#8221; ^\n        <\/p>\n<p>\n          -verb:sync ^\n        <\/p>\n<p>\n          -source:manifest=&#8221;Package.xml&#8221; ^\n        <\/p>\n<p>\n          -dest:package=&#8221;Release @ %date:~6,4%-%date:~3,2%-%date:~0,2% %time:~0,2%-%time:~3,2%.zip&#8221; ^\n        <\/p>\n<p>\n          -useCheckSum ^\n        <\/p>\n<p>\n          -disableRule:BackupRule\n        <\/p>\n<p>\n          pause\n        <\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Also create a <strong>Package.xml<\/strong> file with the following contents:<\/p>\n<table cellspacing=\"0\" cellpadding=\"0\" border=\"1\">\n<tbody>\n<tr>\n<td width=\"616\">\n<\/p>\n<\/p>\n<\/p>\n<\/p>\n<\/p>\n<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Executing the batch file will give you a zip file such as <strong>Release @ 2013-01-05 10-00.zip<\/strong> containing the release folders. Transfer the zip file to the QA box into the same folder as before. Then create a <strong>Release.xml<\/strong> file with the same contents as <strong>Package.xml<\/strong> listed above and fix the path names. When you now execute the <strong>Deploy.bat<\/strong> batch file and supply the release package filename, the QA website\u2019s release folders should now be synced up with the DEV environment.<\/p>\n<h4> <\/h4>\n<h4>Step 3: Release to PROD<\/h4>\n<p><a href=\"https:\/\/msdnshared.blob.core.windows.net\/media\/MSDNBlogsFS\/prod.evol.blogs.msdn.com\/CommunityServer.Blogs.Components.WeblogFiles\/00\/00\/00\/63\/56\/metablogapi\/7635.clip_image006_5C8AB94D.png\"><img decoding=\"async\" title=\"clip_image006\" border=\"0\" alt=\"clip_image006\" src=\"https:\/\/msdnshared.blob.core.windows.net\/media\/MSDNBlogsFS\/prod.evol.blogs.msdn.com\/CommunityServer.Blogs.Components.WeblogFiles\/00\/00\/00\/63\/56\/metablogapi\/1362.clip_image006_thumb_556B7CD5.png\" width=\"383\" height=\"170\" \/><\/a><\/p>\n<p>This follows the same deployment as in step 2, but here we include in a backup step. So after choosing a suitable folder and transferring the release package file there, create a <strong>Deploy.bat<\/strong> file with the following contents:<\/p>\n<table cellspacing=\"0\" cellpadding=\"0\" border=\"1\">\n<tbody>\n<tr>\n<td width=\"616\">\n<p>\n          @echo off\n        <\/p>\n<p>\n          set \/p package=Enter the package name (tab to cycle):\n        <\/p>\n<p>\n          if &#8216;%package%&#8217; == &#8221; goto error\n        <\/p>\n<p>\n          &#8220;c:\\Program Files\\IIS\\Microsoft Web Deploy V3\\msdeploy.exe&#8221; ^\n        <\/p>\n<p>\n          -verb:sync ^\n        <\/p>\n<p>\n          -source:package=%package% ^\n        <\/p>\n<p>\n          -dest:manifest=&#8221;Deploy.xml&#8221; ^\n        <\/p>\n<p>\n          -useCheckSum ^\n        <\/p>\n<p>\n          -disableRule:BackupRule ^\n        <\/p>\n<p>\n          -whatif\n        <\/p>\n<p>\n          echo.\n        <\/p>\n<p>\n          set \/p deploy=Trial run complete &#8211; proceed to deployment (Y\/N)?\n        <\/p>\n<p>\n          if &#8220;%deploy%&#8221;==&#8221;Y&#8221; goto deploy\n        <\/p>\n<p>\n          if &#8220;%deploy%&#8221;==&#8221;y&#8221; goto deploy\n        <\/p>\n<p>\n          goto end\n        <\/p>\n<p>\n          :deploy\n        <\/p>\n<p>\n          md Archive\n        <\/p>\n<p>\n          &#8220;c:\\Program Files\\IIS\\Microsoft Web Deploy V3\\msdeploy.exe&#8221; ^\n        <\/p>\n<p>\n          -verb:sync ^\n        <\/p>\n<p>\n          -source:manifest=&#8221;Deploy.xml&#8221; ^\n        <\/p>\n<p>\n          -dest:package=&#8221;Archive\\Backup @ %date:~6,4%-%date:~3,2%-%date:~0,2% %time:~0,2%-%time:~3,2%.zip&#8221; ^\n        <\/p>\n<p>\n          -useCheckSum ^\n        <\/p>\n<p>\n          -disableRule:BackupRule\n        <\/p>\n<p>\n          echo Backup complete\n        <\/p>\n<p>\n          echo.\n        <\/p>\n<p>\n          &#8220;c:\\Program Files\\IIS\\Microsoft Web Deploy V3\\msdeploy.exe&#8221; ^\n        <\/p>\n<p>\n          -verb:sync ^\n        <\/p>\n<p>\n          -source:package=%package% ^\n        <\/p>\n<p>\n          -dest:manifest=&#8221;Deploy.xml&#8221; ^\n        <\/p>\n<p>\n          -useCheckSum ^\n        <\/p>\n<p>\n          -disableRule:BackupRule\n        <\/p>\n<p>\n          echo Deploy complete\n        <\/p>\n<p>\n          echo.\n        <\/p>\n<p>\n          move %package% Archive\n        <\/p>\n<p>\n          goto end\n        <\/p>\n<p>\n          :error\n        <\/p>\n<p>\n          echo You did not enter a package name\n        <\/p>\n<p>\n          :end\n        <\/p>\n<p>\n          echo.\n        <\/p>\n<p>\n          pause\n        <\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Now create a <strong>Deploy.xml<\/strong> file with the same contents as <strong>Package.xml<\/strong> from step 2 and fix the paths. Once all is in place and the trail run succeeds, you can proceed and deploy your changes to the PROD website.<\/p>\n<p>In addition to releasing your changes, it will first create a backup in the <strong>Archive<\/strong> folder such as <strong>Backup @ 2013-01-05 10-00.zip<\/strong> containing the original folders. If you need to do a restore, you can just execute <strong>Deploy.bat<\/strong> with this same backup file.<\/p>\n<h4>Step 4: Release to CMS<\/h4>\n<p><a href=\"https:\/\/msdnshared.blob.core.windows.net\/media\/MSDNBlogsFS\/prod.evol.blogs.msdn.com\/CommunityServer.Blogs.Components.WeblogFiles\/00\/00\/00\/63\/56\/metablogapi\/1385.clip_image007_112B1589.png\"><img decoding=\"async\" title=\"clip_image007\" border=\"0\" alt=\"clip_image007\" src=\"https:\/\/msdnshared.blob.core.windows.net\/media\/MSDNBlogsFS\/prod.evol.blogs.msdn.com\/CommunityServer.Blogs.Components.WeblogFiles\/00\/00\/00\/63\/56\/metablogapi\/3022.clip_image007_thumb_751A569D.png\" width=\"444\" height=\"174\" \/><\/a><\/p>\n<p>Now everything becomes a formality and you can just repeat the release part of \u201cStep 2: Release to QA\u201d to update the CMS box. After executing <strong>Deploy.bat<\/strong>, all environments are now running the same code.<\/p>\n<h4> <\/h4>\n<h4>Step 5: Update the DEV media folder<\/h4>\n<p><a href=\"https:\/\/msdnshared.blob.core.windows.net\/media\/MSDNBlogsFS\/prod.evol.blogs.msdn.com\/CommunityServer.Blogs.Components.WeblogFiles\/00\/00\/00\/63\/56\/metablogapi\/0207.clip_image008_1BE86CDE.png\"><img decoding=\"async\" title=\"clip_image008\" border=\"0\" alt=\"clip_image008\" src=\"https:\/\/msdnshared.blob.core.windows.net\/media\/MSDNBlogsFS\/prod.evol.blogs.msdn.com\/CommunityServer.Blogs.Components.WeblogFiles\/00\/00\/00\/63\/56\/metablogapi\/7144.clip_image008_thumb_29BAB2D9.png\" width=\"444\" height=\"168\" \/><\/a><\/p>\n<p>For this final step just repeat \u201cStep 1: Update the QA media folder\u201d. Now all environments should have the same content.<\/p>\n<p>I hope this will be helpful to someone with the same problem or something similar where only subsets of folders require updates. There is a lot of room for enhancement, i.e. becoming more creative with the zip file naming convention by including labels. MsDeploy is a great tool and can be used to deploy not just websites, but other kinds of projects which are as well. Please feel free to ask me questions. If I cannot help, I\u2019m sure Sayed or someone at Microsoft will come to the rescue.<\/p>\n<p>\u00a0<\/p>\n<p>You can download the <a href=\"https:\/\/dl.dropbox.com\/u\/40134810\/blog\/SampleFiles.zip\" target=\"_blank\" rel=\"noopener\">SampleFiles<\/a> to help work through the process as well.<\/p>\n<p>\u00a0<\/p>\n<p>Johan van der Merwe<\/p>\n<p><a href=\"mailto:&#x6a;&#111;&#104;&#x61;&#110;&#046;&#x76;&#x64;&#109;e&#x72;&#119;&#101;&#x40;&#x62;&#116;i&#x6e;&#116;&#101;&#x72;&#x6e;&#101;t&#x2e;&#099;&#111;&#x6d;\">&#x6a;&#111;&#104;&#x61;&#110;&#046;&#x76;&#x64;&#109;e&#x72;&#119;&#101;&#x40;&#x62;&#116;i&#x6e;&#116;&#101;&#x72;&#x6e;&#101;t&#x2e;&#099;&#111;&#x6d;<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Hi everyone Sayed here. I recently had a customer, Johan, contact me to help with some challenges regarding deployment automation. He had some very specific requirements, but he was able to automate the entire process. He has been kind enough to agree to write up his experience to share with everyone. His story is below. [&hellip;]<\/p>\n","protected":false},"author":357,"featured_media":58792,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[197],"tags":[9,43,77,108],"class_list":["post-22074","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-aspnet","tag-net-core","tag-bcl","tag-fundamentals","tag-performance"],"acf":[],"blog_post_summary":"<p>Hi everyone Sayed here. I recently had a customer, Johan, contact me to help with some challenges regarding deployment automation. He had some very specific requirements, but he was able to automate the entire process. He has been kind enough to agree to write up his experience to share with everyone. His story is below. [&hellip;]<\/p>\n","_links":{"self":[{"href":"https:\/\/devblogs.microsoft.com\/dotnet\/wp-json\/wp\/v2\/posts\/22074","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/devblogs.microsoft.com\/dotnet\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devblogs.microsoft.com\/dotnet\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/dotnet\/wp-json\/wp\/v2\/users\/357"}],"replies":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/dotnet\/wp-json\/wp\/v2\/comments?post=22074"}],"version-history":[{"count":0,"href":"https:\/\/devblogs.microsoft.com\/dotnet\/wp-json\/wp\/v2\/posts\/22074\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/dotnet\/wp-json\/wp\/v2\/media\/58792"}],"wp:attachment":[{"href":"https:\/\/devblogs.microsoft.com\/dotnet\/wp-json\/wp\/v2\/media?parent=22074"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/dotnet\/wp-json\/wp\/v2\/categories?post=22074"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/dotnet\/wp-json\/wp\/v2\/tags?post=22074"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}