Sitecore Unicorn Sync
Octopus.Script exported 07/14/2016 by GuitarRich belongs to 'Sitecore' category.
Syncs all the specified configurations via the Unicorn remote sync PowerShell script. Uses the newer MicroChap security layer. Please see the following post for instructions: http://www.sitecorenutsbolts.net/2016/03/14/Octopus-Deploy-Step-for-Unicorn-Sync/
Parameters
When steps based on the template are included in a project's deployment process, the parameters below can be set.
Shared Secret
The shared secret used for the MicroChap handshake
Site Url
The Url of your content authoring system. Must be able to view /unicorn.aspx
MicroCHAP DLL Location
The location of the MicroCHAP.dll file in your project
Configurations
Add a configuration per line
Script body
$ErrorActionPreference = 'Stop'
Add-Type -Path "${MicroChap}\MicroCHAP.dll"
Function Sync-Unicorn {
Param(
[Parameter(Mandatory=$True)]
[string]$ControlPanelUrl,
[Parameter(Mandatory=$True)]
[string]$SharedSecret,
[Parameter(Mandatory=$True)]
[string[]]$Configurations,
[string]$Verb = 'Sync'
)
# PARSE THE URL TO REQUEST
$parsedConfigurations = ($Configurations) -join "^"
$url = "{0}?verb={1}&configuration={2}" -f $ControlPanelUrl, $Verb, $parsedConfigurations
Write-Host "Sync-Unicorn: Preparing authorization for $url"
# GET AN AUTH CHALLENGE
$challenge = Get-Challenge -ControlPanelUrl $ControlPanelUrl
Write-Host "Sync-Unicorn: Received challenge: $challenge"
# CREATE A SIGNATURE WITH THE SHARED SECRET AND CHALLENGE
$signatureService = New-Object MicroCHAP.SignatureService -ArgumentList $SharedSecret
$signature = $signatureService.CreateSignature($challenge, $url, $null)
Write-Host "Sync-Unicorn: Created signature $signature, executing $Verb..."
# USING THE SIGNATURE, EXECUTE UNICORN
$result = Invoke-WebRequest -Uri $url -Headers @{ "X-MC-MAC" = $signature; "X-MC-Nonce" = $challenge } -TimeoutSec 10800 -UseBasicParsing
$result.Content
}
Function Get-Challenge {
Param(
[Parameter(Mandatory=$True)]
[string]$ControlPanelUrl
)
$url = "$($ControlPanelUrl)?verb=Challenge"
$result = Invoke-WebRequest -Uri $url -TimeoutSec 360 -UseBasicParsing
$result.Content
}
$configs = $Configurations.split("`n")
Sync-Unicorn -ControlPanelUrl "$($SiteUrl)/unicorn.aspx" -SharedSecret $SharedSecret -Configurations $configs
To use this template in Octopus Deploy, copy the JSON below and paste it into the Library → Step templates → Import dialog.
Show JSON{
"Id": "d5adc467-69a8-49ca-b4d0-4f793fad4d62",
"Name": "Sitecore Unicorn Sync",
"Description": "Syncs all the specified configurations via the Unicorn remote sync PowerShell script. Uses the newer MicroChap security layer. Please see the following post for instructions: http://www.sitecorenutsbolts.net/2016/03/14/Octopus-Deploy-Step-for-Unicorn-Sync/",
"Version": 14,
"ExportedAt": "2016-07-14T15:40:31.349+00:00",
"ActionType": "Octopus.Script",
"Author": "GuitarRich",
"Parameters": [
{
"Name": "SharedSecret",
"Label": "Shared Secret",
"HelpText": "The shared secret used for the MicroChap handshake",
"DefaultValue": null,
"DisplaySettings": {
"Octopus.ControlType": "Sensitive"
}
},
{
"Name": "SiteUrl",
"Label": "Site Url",
"HelpText": "The Url of your content authoring system. Must be able to view `/unicorn.aspx`",
"DefaultValue": null,
"DisplaySettings": {
"Octopus.ControlType": "SingleLineText"
}
},
{
"Name": "MicroChap",
"Label": "MicroCHAP DLL Location",
"HelpText": "The location of the MicroCHAP.dll file in your project",
"DefaultValue": null,
"DisplaySettings": {
"Octopus.ControlType": "SingleLineText"
}
},
{
"Name": "Configurations",
"Label": "Configurations",
"HelpText": "Add a configuration per line",
"DefaultValue": null,
"DisplaySettings": {
"Octopus.ControlType": "MultiLineText"
}
}
],
"Properties": {
"Octopus.Action.Script.Syntax": "PowerShell",
"Octopus.Action.Script.ScriptBody": "$ErrorActionPreference = 'Stop'\n\nAdd-Type -Path \"${MicroChap}\\MicroCHAP.dll\"\n\nFunction Sync-Unicorn {\n\tParam(\n\t\t[Parameter(Mandatory=$True)]\n\t\t[string]$ControlPanelUrl,\n\n\t\t[Parameter(Mandatory=$True)]\n\t\t[string]$SharedSecret,\n\n\t\t[Parameter(Mandatory=$True)]\n\t\t[string[]]$Configurations,\n\n\t\t[string]$Verb = 'Sync'\n\t)\n\n\t# PARSE THE URL TO REQUEST\n\t$parsedConfigurations = ($Configurations) -join \"^\"\n\n\t$url = \"{0}?verb={1}&configuration={2}\" -f $ControlPanelUrl, $Verb, $parsedConfigurations\n\n\tWrite-Host \"Sync-Unicorn: Preparing authorization for $url\"\n\n\t# GET AN AUTH CHALLENGE\n\t$challenge = Get-Challenge -ControlPanelUrl $ControlPanelUrl\n\n\tWrite-Host \"Sync-Unicorn: Received challenge: $challenge\"\n\n\t# CREATE A SIGNATURE WITH THE SHARED SECRET AND CHALLENGE\n\t$signatureService = New-Object MicroCHAP.SignatureService -ArgumentList $SharedSecret\n\n\t$signature = $signatureService.CreateSignature($challenge, $url, $null)\n\n\tWrite-Host \"Sync-Unicorn: Created signature $signature, executing $Verb...\"\n\n\t# USING THE SIGNATURE, EXECUTE UNICORN\n\t$result = Invoke-WebRequest -Uri $url -Headers @{ \"X-MC-MAC\" = $signature; \"X-MC-Nonce\" = $challenge } -TimeoutSec 10800 -UseBasicParsing\n\n\t$result.Content\n}\n\nFunction Get-Challenge {\n\tParam(\n\t\t[Parameter(Mandatory=$True)]\n\t\t[string]$ControlPanelUrl\n\t)\n\n\t$url = \"$($ControlPanelUrl)?verb=Challenge\"\n\n\t$result = Invoke-WebRequest -Uri $url -TimeoutSec 360 -UseBasicParsing\n\n\t$result.Content\n}\n\n$configs = $Configurations.split(\"`n\")\nSync-Unicorn -ControlPanelUrl \"$($SiteUrl)/unicorn.aspx\" -SharedSecret $SharedSecret -Configurations $configs\n",
"Octopus.Action.Script.ScriptSource": "Inline"
},
"Category": "Sitecore",
"HistoryUrl": "https://github.com/OctopusDeploy/Library/commits/master/step-templates/sitecore-unicorn-sync.json",
"Website": "/step-templates/d5adc467-69a8-49ca-b4d0-4f793fad4d62",
"Logo": "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",
"$Meta": {
"Type": "ActionTemplate"
}
}Provided under the Apache License version 2.0.