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.

image

So now you can use a single script for all your web deployments.