I have been working on getting a Sitecore solution using Unicorn (with auto-sync and publish API call) to deploy to my environments using Azure DevOps and Octopus. The power of all these together is pretty cool. It allows you to take a Sitecore solution from its state in a local developer instance and move everything that is needed, code and content, to a deployed environment. In the end, all your code is deployed along with all Sitecore assets and those assets are also published!
It takes just a little bit of setup. This does not go into setting up Sitecore or Unicorn as those projects have that well documented. Once you have those all set up though and you are checking your code and your Unicorn YML files into Azure DevOps you are ready to go here.
Azure DevOps Setup
These are the build steps I setup. There are really just two steps that need a little customization work.
Copy Unicorn YML files.
This is just a basic copy activity that takes the *.yml files and moves them to the content management server to a location.
Feature/*/serialization/**/*.yml
Foundation/*/serialization/**/*.yml
Project/*/serialization/**/*.yml
Security/**/*.yml
My yml files are broken down based on Helix pattern.
I copy them to something like this.
$(Build.StagingDirectory)/Unicorn
Build Solution
Since my solution is set up based on the Helix patterns I use the MSBuild publish commands to publish just the files I need to deploy. A full build and moving that full build-out gives you too much. So in the MSBuild arguments, I provide the following.
/p:DeployOnBuild=true /p:WebPublishMethod=Package /p:PackageAsSingleFile=true /p:SkipInvalidConfigurations=true /p:PackageLocation="$(build.artifactstagingdirectory)\\" /p:TreatWarningsAsErrors=true /p:WarningsNotAsErrors=612%3B618 /p:DeployOnBuild=true /p:DeployDefaultTarget=WebPublish /p:WebPublishMethod=FileSystem /p:publishUrl="$(Build.StagingDirectory)"
Octopus Setup
In your Octopus deployment steps, you will need to execute the following script on your Content Management server.
- Delete any previous deployed yml files. This makes sure as you change things around you don't end up with old yml files. This can cause things to act weird. This requires an app pool reset as the app pool can be holding on to some YML files and not let you delete them.
- Make a call to the unicorn endpoint to start the sync.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | #clear out the Unicorn files so the new deploy is clean $environment = $OctopusParameters["Sitecore-Environment"] $domain = $OctopusParameters["domain"] $rootPath = "YOUR PATH" $doesPathExist = Test-Path -Path "$($rootPath)\Unicorn" Import-Module WebAdministration if ($doesPathExist) { Write-Output "Restarting app pool" Restart-WebAppPool -Name "YOUR APP POOL NAME" Write-Output "Removing Unicorn yml from $($rootPath)\Unicorn" Get-ChildItem -Path "$($rootPath)\Unicorn" -Recurse | Sort-Object -Property FullName -Descending | Remove-Item -Recurse -Force Write-Output "Removing Unicorn configs from $($rootPath)\App_Config\Include\Unicorn" Remove-Item -Path "$($rootPath)\App_Config\Include\Unicorn" -Recurse -Force } else { Write-Output "Path $($rootPath)\Unicorn was not found. No Unicorn files removed" } |
Notice lines 4 and 11 where you need to setup your path.
1 2 3 4 5 6 7 8 9 10 11 12 13 | $ErrorActionPreference = 'Stop' $environment = $OctopusParameters["Sitecore-Environment"] $ScriptPath = "YOUR PATH\Unicorn" #Split-Path $MyInvocation.MyCommand.Path $sharedKey = 'YOUR KEY' Write-Output "Importing module Unicorn.psm1 from $($ScriptPath)" Import-Module "$($ScriptPath)\Unicorn.psm1" # SYNC ALL CONFIGURATIONS Write-Output "Issuing call to sync ALL configurations" Sync-Unicorn -ControlPanelUrl "YOUR PATH/unicorn.aspx" -SharedSecret $sharedKey |
Line 3 and 6 and 13 also need to be updated with your data. The key is the matching key that should be in your Unicorn config.
The Unicorn team has documented how to use their API to trigger the sync via the API. Besides the above there are two other things that need to happen. You need these three files. The first two (Unicorn.psm1 and MicroCHAP.dll) to keep everything self-contained we downloaded and added as part of the deployed code. The third sample.ps1 script is what we converted to the two PowerShell scripts above.
Once you have this hooked up on each deployment your Sitecore enviornment (including your published website) are all deployed and ready to go!
Comments