Skip to content

Instantly share code, notes, and snippets.

@IvanLieckens
Last active March 7, 2022 13:39
Show Gist options
  • Save IvanLieckens/ac00e859698101cb059b8aeccd4a65bd to your computer and use it in GitHub Desktop.
Save IvanLieckens/ac00e859698101cb059b8aeccd4a65bd to your computer and use it in GitHub Desktop.
Deploy SCCH Connector to Azure Web App using MSDeploy and the WDP Package from dev.sitecore.net
[CmdletBinding(DefaultParameterSetName = "no-arguments")]
param(
[Parameter(HelpMessage = "Name of the resource group in Azure to target.")]
[string]$ResourceGroupName,
[Parameter(HelpMessage = "Name of the web app in Azure to target.")]
[string]$WebAppName,
[Parameter(HelpMessage = "Path to the WDP to deploy to the target.")]
[string]$WdpPackagePath,
[Parameter(HelpMessage = "Content Hub Client Id.")]
[string]$CHClientId,
[Parameter(HelpMessage = "Content Hub Client Secret.")]
[string]$CHClientSecret,
[Parameter(HelpMessage = "Content Hub Username.")]
[string]$CHUserName,
[Parameter(HelpMessage = "Content Hub Password.")]
[string]$CHPassword,
[Parameter(HelpMessage = "Content Hub URI.")]
[string]$CHUri,
[Parameter(HelpMessage = "Content Hub Azure Service Bus connection string path in.")]
[string]$CHServiceBusEntityPathIn,
[Parameter(HelpMessage = "Content Hub Subscription name. (must be unique per Sitecore CM deployment)")]
[string]$CHServiceBusSubscription,
[Parameter(HelpMessage = "Content Hub Azure Service Bus connection string path out.")]
[string]$CHServiceBusEntityPathOut,
[Parameter(HelpMessage = "Content Hub Search Page Uri.")]
[string]$CHSearchPage,
[Parameter(HelpMessage = "Content Hub External Redirect Key.")]
[string]$CHExternalRedirectKey = "Sitecore",
[Parameter(HelpMessage = "Path to MSDeploy.")]
[string]$MsDeployPath = "C:\Program Files\IIS\Microsoft Web Deploy V3\msdeploy.exe",
[Parameter(HelpMessage = "Skips Azure Login when True.")]
[switch]$SkipAzureLogin = $False,
[Parameter(HelpMessage = "Amount of retry attempts. 6 by default which with default retryinterval would come down to 1 minute.")]
[int]$RetryAttempts = 6,
[Parameter(HelpMessage = "Amount of time to wait between retries in milliseconds. 10000 by default which is 10 seconds which adds up to 1 minute with default retry attempts.")]
[int]$RetryInterval = 10000
)
Add-Type -AssemblyName "System.IO.Compression.FileSystem"
function PreparePath($path) {
if(-Not (Test-Path $path)) {
$result = New-Item -Path $path -Type Directory -Force
} else {
$result = Resolve-Path $path
}
return $result
}
function UnzipFolder($zipfile, $folder, $dst) {
[IO.Compression.ZipFile]::OpenRead($zipfile).Entries | Where-Object {
($_.FullName -like "$folder/*") -and ($_.Length -gt 0)
} | ForEach-Object {
$parent = Split-Path ($_.FullName -replace $folder, '')
$parent = PreparePath (Join-Path $dst $parent)
$file = Join-Path $parent $_.Name
[IO.Compression.ZipFileExtensions]::ExtractToFile($_, $file, $true)
}
}
function DownloadWebsiteFile($filePath, $downloadFolderName) {
$basePath = Split-Path ".\$downloadFolderName\$filePath"
$fileName = Split-Path $filePath -Leaf
if(-Not (Test-Path ".\$downloadFolderName\$filePath")) {
New-Item -Path $basePath -Type Directory -Force
}
$outFilePath = Join-Path (Resolve-Path "$basePath") $fileName
Invoke-WebRequest -Uri "https://$WebAppName.scm.azurewebsites.net/api/vfs/site/wwwroot/$filePath" -Headers @{"Authorization"=("Basic {0}" -f $base64AuthInfo)} -Method GET -OutFile $outFilePath
}
function UploadWebsiteFile($filePath, $uploadFilePath) {
Invoke-WebRequest -Uri "https://$WebAppName.scm.azurewebsites.net/api/vfs/site/wwwroot/$filePath" -Headers @{"Authorization"=("Basic {0}" -f $base64AuthInfo);"If-Match"="*"} -Method PUT -InFile $uploadFilePath
}
function ApplyTransform($filePath, $xdtFilePath) {
Write-Verbose "Applying XDT transformation '$xdtFilePath' on '$filePath'..."
$target = New-Object Microsoft.Web.XmlTransform.XmlTransformableDocument;
$target.PreserveWhitespace = $true
$target.Load($filePath);
$transformation = New-Object Microsoft.Web.XmlTransform.XmlTransformation($xdtFilePath);
if ($transformation.Apply($target) -eq $false)
{
throw "XDT transformation failed."
}
$target.Save($filePath);
}
if(-Not (Test-Path $MsDeployPath)) {
Write-Host "MS Deploy was not found at `"$MsDeployPath`"!" -ForegroundColor Red
return
}
if(-Not $SkipAzureLogin) {
Write-Host "Logging into Azure..." -ForegroundColor Green
& az login
}
Write-Host "Fetching Publish Profile..." -ForegroundColor Green
$publishProfile = az webapp deployment list-publishing-profiles --resource-group $ResourceGroupName --name $WebAppName --query "[?publishMethod=='MSDeploy']" | ConvertFrom-Json
$userName = $publishProfile.userName
$password = $publishProfile.userPWD
$base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $userName, $password)))
Write-Host "Preparing configuration..." -ForegroundColor Green
$xdtsPath = (PreparePath ".\xdts")
UnzipFolder $WdpPackagePath "Content/Website/App_Data/Transforms/scch/xdts" $xdtsPath
Get-ChildItem $xdtsPath -File -Include "*.xdt" -Recurse | ForEach-Object {
$targetWebsiteFile = $_.FullName.Replace("$xdtsPath\", "").Replace("\", "/").Replace(".xdt", "")
DownloadWebsiteFile $targetWebsiteFile "Configuration"
}
$configurationPath = (PreparePath ".\Configuration")
$currentDateTime = (Get-Date).ToString("dd-MM-yyyy-hh-mm-ss")
$backupPath = (PreparePath ".\Backup-$currentDateTime")
robocopy $configurationPath $backupPath /s
Write-Host "Preparing transformations..." -ForegroundColor Green
$nupkgPath = Join-Path (Resolve-Path ".") "microsoft.web.xdt.3.1.0.nupkg"
$xdtDllBinPath = PreparePath ".\bin"
Invoke-WebRequest -Uri "https://www.nuget.org/api/v2/package/Microsoft.Web.Xdt/3.1.0" -OutFile $nupkgPath
UnzipFolder $nupkgPath "lib/netstandard2.0" $xdtDllBinPath
Add-Type -Path (Resolve-Path ".\bin\Microsoft.Web.XmlTransform.dll")
Write-Host "Fill ConnectionStrings..." -ForegroundColor Green
$connectionStringsXdtPath = Join-Path $xdtsPath "App_Config\ConnectionStrings.config.xdt"
((Get-Content -Path $connectionStringsXdtPath -Raw).Replace("{client_id}", $CHClientId).Replace("{client_secret}", $CHClientSecret).Replace("{username}", $CHUserName).Replace("{password}", $CHPassword).Replace("{uri}", $CHUri).Replace("{Azure Service Bus connection string with incoming topic}", $CHServiceBusEntityPathIn).Replace("{Subscription name}", $CHServiceBusSubscription).Replace("{Azure Service Bus connection string with outcoming topic}", $CHServiceBusEntityPathOut).Replace("{Content Hub search page URI}", $CHSearchPage).Replace("{External redirect key}", $CHExternalRedirectKey)) | Set-Content -Path $connectionStringsXdtPath
Write-Host "Running transformations..." -ForegroundColor Green
Get-ChildItem $xdtsPath -File -Include "*.xdt" -Recurse | ForEach-Object {
$targetFilePath = $_.FullName.Replace($xdtsPath, $configurationPath).Replace(".xdt", "")
if (-not(Test-Path $targetFilePath -PathType Leaf)) {
Write-Verbose "No matching file '$targetFilePath' for transformation '$($_.FullName)'. Skipping..."
} else {
ApplyTransform $targetFilePath $_.FullName
}
}
Write-Host "Starting MSDeploy..." -ForegroundColor Green
$verb = "-verb:sync"
$source = "-source:package=`"$WdpPackagePath`""
$dest = "-dest:auto,ComputerName=`"https://$WebAppName.scm.azurewebsites.net/msdeploy.axd?site=$WebAppName`",UserName=`"$userName`",Password=`"$password`",AuthType=`"Basic`""
$iisWebAppParam = "-setParam:name=`"IIS Web Application Name`",value=`"$WebAppName`""
$coreParam = "-setParam:name=`"Core Admin Connection String`",value=`"notUsed`""
$masterParam = "-setParam:name=`"Master Admin Connection String`",value=`"notUsed`""
$skipDbFullSql = "-skip:objectName=dbFullSql"
$skipDbDacFx = "-skip:objectName=dbDacFx"
$doNotDeleteRule = "-enableRule:DoNotDeleteRule"
$appOfflineRule = "-enableRule:AppOffline"
$retryAttemptsParam = "-retryAttempts:$RetryAttempts"
$retryIntervalParam = "-retryInterval:$RetryInterval"
$verboseParam = "-verbose"
Invoke-Expression "& '$MsDeployPath' --% $verb $source $dest $iisWebAppParam $coreParam $masterParam $skipDbFullSql $skipDbDacFx $doNotDeleteRule $appOfflineRule $retryAttemptsParam $retryIntervalParam $verboseParam"
Write-Host "Uploading configuration..." -ForegroundColor Green
Get-ChildItem $configurationPath -File -Recurse | ForEach-Object {
$targetWebsiteFile = $_.FullName.Replace("$configurationPath\", "").Replace("\", "/")
UploadWebsiteFile $targetWebsiteFile $_.FullName
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment