A couple of months ago I wrote a post on using PowerShell scripts to deploy web sites in Release Management vNext templates as opposed to DSC. In that post I provided a script to help with the translation of Release Management configuration variables to entries in the [MSDELPOY].setparameters.xml file for web sites.
The code I provided in that post required you to hard code the variables to translate. This quickly become a problem for maintenance. However, there is a simple solution.
If we use a naming convention for our RM configuration variables that map to web.config entries (I chose __NAME__ to be consistent to the old RM Agent based deployment standards) we can let PowerShell do the work.
So the revised script is
$VerbosePreference ='Continue' # equiv to -verbose
function Update-ParametersFile
{
param
(
$paramFilePath,
$paramsToReplace
)
write-verbose "Updating parameters file '$paramFilePath'" -verbose
$content = get-content $paramFilePath
$paramsToReplace.GetEnumerator() | % {
Write-Verbose "Replacing value for key '$($\_.Name)'" -Verbose
$content = $content.Replace($\_.Name, $\_.Value)
}
set-content -Path $paramFilePath -Value $content
}
\# the script folder
$folder = Split-Path -parent $MyInvocation.MyCommand.Definition
write-verbose "Deploying Website '$package' using script in '$folder'"
\# work out the variables to replace using a naming convention
\# we make sure that the value is stored in an array even if it is single item
$parameters = @(Get-Variable -include "\_\_\*\_\_" )
write-verbose "Discovered replacement parameters that match the convention '\_\_\*\_\_': $($parameters | Out-string)"
Update-ParametersFile -paramFilePath "$ApplicationPath$packagePath$package.SetParameters.xml" -paramsToReplace $parameters
write-verbose "Calling '$ApplicationPath$packagePath$package.deploy.cmd'"
& "$ApplicationPath$packagePath$package.deploy.cmd" /Y /m:"$PublishUrl" -allowUntrusted /u:"$PublishUser" /p:"$PublishPassword" /a:Basic | Write-Verbose
Note: This script allow the deployment to a remote IIS server, so useful for Azure Web Sites. If you are running it locally on an IIS server just trim everything after the /Y on the last line
So now I provide
-
$PackagePath – path to our deployment on the deployment VM(relative to the $ApplicationPath local working folder)
-
$Package – name of the MSdeploy package
-
The publish settings you can get from the Azure Portal
-
$PublishUser – The login name
-
$PublishPassword – The login password
-
$PublishUrl – The URL e.g.
https://\[your.site.azure.com\]:433/msdeploy.axd
-
$__PARAM1__ – a value to swap in the web.config
-
$__PARAM2__ – another value to swap in the web.config
In RM it will look like this.
So now you can use a single script for all your web deployments.