Disabling Sitecore config files in Azure App Service using Azure DevOps


BACK TO BLOG OVERVIEW


Since we are keen on keeping the Sitecore scwdp packages OOTB as untouched as can be (as of our deployment strategy) we have two type of tasks in our release pipeline to disable/rename config files after deploying a vanilla package. Please keep in mind that, while using these tasks, we are always deploying to a staging slot with status ‘stopped’.


While checking the script(s), note that you are able to write your own powershell scripts within the $commandBody variable: "$commandBody = @{ command = "powershell.exe -command `"Get-ChildItem -file `"$kuduFile`" | Rename-Item -newname {`$_.name + '.disabled'}`"" }"


Disabling a single config file (for disabling your CES device detection for example): Within Azure DevOps you should add an Azure Powershell task and point it towards a ps1 file containing:

[code language="powershell”] param( $Environment, $ResourceGroupPaas = “”, $slotName = “”, [string]$kuduFile = “”, [int]$timeOutSec = 180 )

$ErrorActionPreference = “Stop”

function Get-AzureRmWebAppPublishingCredentials($resourceGroupName, $webAppName, $slotName = $null) { if ([string]::IsNullOrWhiteSpace($slotName)){ $resourceType = “Microsoft.Web/sites/config” $resourceName = [string]::Format("{0}/publishingcredentials”,$webAppName)

} else{ $resourceType = “Microsoft.Web/sites/slots/config” $resourceName = [string]::Format("{0}/{1}/publishingcredentials”,$webAppName,$slotName) }

$publishingCredentials = Invoke-AzureRmResourceAction -ResourceGroupName $resourceGroupName -ResourceType $resourceType -ResourceName $resourceName -Action list -ApiVersion 2015-08-01 -Force Write-Host $publishingCredentials return $publishingCredentials }

function Get-KuduApiAuthorisationHeaderValue($resourceGroupName, $webAppName, $slotName = $null) { $publishingCredentials = Get-AzureRmWebAppPublishingCredentials $resourceGroupName $webAppName $slotName Write-Host $publishingCredentials.Properties.PublishingUserName Write-Host $publishingCredentials.Properties.PublishingPassword return (“Basic {0}” -f [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}” -f $publishingCredentials.Properties.PublishingUserName, $publishingCredentials.Properties.PublishingPassword)))) }

function executePowershellCommandWithinKudu($resourceGroupName = “”, $webAppName, $slotName = “”, $kuduFile) { if($resourceGroupName -eq “") { Write-Error ‘resourceGroupName is invalid’ }

if($kuduFile -eq “") { Write-Error ‘kuduFile is invalid’ }

$kuduApiAuthorisationToken = Get-KuduApiAuthorisationHeaderValue $resourceGroupName $webAppName $slotName

if ([string]::IsNullOrWhiteSpace($slotName)){ $kuduApiUrl = [string]::Format(“https://{0}.scm.azurewebsites.net/api/command”,$webAppName) } else{ $kuduApiUrl = [string]::Format(“https://{0}-{1}.scm.azurewebsites.net/api/command”,$webAppName,$slotName) }

$commandBody = @{ command = “powershell.exe -command `"Get-ChildItem -file `"$kuduFile`” | Rename-Item -newname {`$_.name + ‘.disabled’}`”” }

Try { Write-Host $kuduApiUrl Write-Host $kuduApiAuthorisationToken Invoke-RestMethod -Uri $kuduApiUrl ` -Headers @{“Authorization"=$kuduApiAuthorisationToken;“If-Match"=”*"} ` -Method POST ` -ContentType “application/json”` -Body (ConvertTo-Json $commandBody)` -TimeoutSec $timeOutSec

Write-Host “disabled $kuduFile” } Catch { Write-Warning “Could not delete path: $kuduFile” Write-Warning $_.Exception.Message } }

# Execute command executePowershellCommandWithinKudu $ResourceGroupPaas $Environment $slotName $kuduFile [/code]

Use the following example parameters while executing:

-Environment “NameOfYourAppService” -ResourceGroupPaas “ResourceGroupName” -slotName “staging” -kuduFile ‘D:/home/site/wwwroot/App_Config/Include/CES/Sitecore.CES.DeviceDetection.config’ -timeOutSec 360

Disabling all config files within a given folder (for disabling FXM for example): Within Azure DevOps you should add an Azure Powershell task and point it towards a ps1 file containing:

[code language="powershell”]

param( $Environment, $ResourceGroupPaas = “”, $slotName = “”, [string]$kuduPath = “”, [int]$timeOutSec = 180 )

$ErrorActionPreference = “Stop”

function Get-AzureRmWebAppPublishingCredentials($resourceGroupName, $webAppName, $slotName = $null) { if ([string]::IsNullOrWhiteSpace($slotName)){ $resourceType = “Microsoft.Web/sites/config” $resourceName = [string]::Format("{0}/publishingcredentials”,$webAppName)

} else{ $resourceType = “Microsoft.Web/sites/slots/config” $resourceName = [string]::Format("{0}/{1}/publishingcredentials”,$webAppName,$slotName) }

$publishingCredentials = Invoke-AzureRmResourceAction -ResourceGroupName $resourceGroupName -ResourceType $resourceType -ResourceName $resourceName -Action list -ApiVersion 2015-08-01 -Force Write-Host $publishingCredentials return $publishingCredentials }

function Get-KuduApiAuthorisationHeaderValue($resourceGroupName, $webAppName, $slotName = $null) { $publishingCredentials = Get-AzureRmWebAppPublishingCredentials $resourceGroupName $webAppName $slotName Write-Host $publishingCredentials.Properties.PublishingUserName Write-Host $publishingCredentials.Properties.PublishingPassword return (“Basic {0}” -f [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}” -f $publishingCredentials.Properties.PublishingUserName, $publishingCredentials.Properties.PublishingPassword)))) }

function executePowershellCommandWithinKudu($resourceGroupName = “”, $webAppName, $slotName = “”, $kuduPath) { if($resourceGroupName -eq “") { Write-Error ‘resourceGroupName is invalid’ }

if($kuduPath -eq “") { Write-Error ‘kuduPath is invalid’ }

$kuduApiAuthorisationToken = Get-KuduApiAuthorisationHeaderValue $resourceGroupName $webAppName $slotName

if ([string]::IsNullOrWhiteSpace($slotName)){ $kuduApiUrl = [string]::Format(“https://{0}.scm.azurewebsites.net/api/command”,$webAppName) } else{ $kuduApiUrl = [string]::Format(“https://{0}-{1}.scm.azurewebsites.net/api/command”,$webAppName,$slotName) }

$commandBody = @{ command = “powershell.exe -command `"Get-ChildItem -path `"$kuduPath`” -exclude ‘*.disabled’ | Where-Object {!`$_.PsIsContainer} | Rename-Item -newname {`$_.name + ‘.disabled’}`”” } #Remove-Item –path c:\testfolder –recurse

Try { Write-Host $kuduApiUrl Write-Host $kuduApiAuthorisationToken Invoke-RestMethod -Uri $kuduApiUrl ` -Headers @{“Authorization"=$kuduApiAuthorisationToken;“If-Match"=”*"} ` -Method POST ` -ContentType “application/json”` -Body (ConvertTo-Json $commandBody)` -TimeoutSec $timeOutSec

Write-Host “disabled all files in $kuduPath” } Catch { Write-Warning “Could not delete path: $kuduPath” Write-Warning $_.Exception.Message } }

# Execute command executePowershellCommandWithinKudu $ResourceGroupPaas $Environment $slotName $kuduFile [/code]

Use the following example parameters while executing:

-Environment “NameOfYourAppService” -ResourceGroupPaas “ResourceGroupName” -slotName “staging” -kuduPath ‘D:/home/site/wwwroot/App_Config/Sitecore/FederatedExperienceManager’ -timeOutSec 360