#Requires -Version 3.0 <# .SYNOPSIS Creates and deploys a Microsoft Azure Website for a Visual Studio web project. For more detailed documentation go to: http://go.microsoft.com/fwlink/?LinkID=394471 .EXAMPLE PS C:\> .\Publish-WebApplicationWebSite.ps1 ` -Configuration .\Configurations\WebApplication1-WAWS-dev.json ` -WebDeployPackage ..\WebApplication1\WebApplication1.zip ` -Verbose #> [CmdletBinding(HelpUri = 'http://go.microsoft.com/fwlink/?LinkID=391696')] param ( [Parameter(Mandatory = $true)] [ValidateScript({Test-Path $_ -PathType Leaf})] [String] $Configuration, [Parameter(Mandatory = $false)] [String] $SubscriptionName, [Parameter(Mandatory = $false)] [ValidateScript({Test-Path $_ -PathType Leaf})] [String] $WebDeployPackage, [Parameter(Mandatory = $false)] [ValidateScript({ !($_ | Where-Object { !$_.Contains('Name') -or !$_.Contains('Password')}) })] [Hashtable[]] $DatabaseServerPassword, [Parameter(Mandatory = $false)] [Switch] $SendHostMessagesToOutput = $false ) function New-WebDeployPackage { #Write a function to build and package your web application #To build your web application, use MsBuild.exe. For help, see MSBuild Command-Line Reference at: http://go.microsoft.com/fwlink/?LinkId=391339 } function Test-WebApplication { #Edit this function to run unit tests on your web application #Write a function to run unit tests on your web application, use VSTest.Console.exe. For help, see VSTest.Console Command-Line Reference at http://go.microsoft.com/fwlink/?LinkId=391340 } function New-AzureWebApplicationWebsiteEnvironment { [CmdletBinding()] param ( [Parameter(Mandatory = $true)] [Object] $Configuration, [Parameter (Mandatory = $false)] [AllowNull()] [Hashtable[]] $DatabaseServerPassword ) Add-AzureWebsite -Name $Config.name -Location $Config.location | Out-String | Write-HostWithTime # Create the SQL databases. The connection string is used for deployment. $connectionString = New-Object -TypeName Hashtable if ($Config.Contains('databases')) { @($Config.databases) | Where-Object {$_.connectionStringName -ne ''} | Add-AzureSQLDatabases -DatabaseServerPassword $DatabaseServerPassword -CreateDatabase | ForEach-Object { $connectionString.Add($_.Name, $_.ConnectionString) } } return @{ConnectionString = $connectionString} } function Publish-AzureWebApplicationToWebsite { [CmdletBinding()] param ( [Parameter(Mandatory = $true)] [Object] $Configuration, [Parameter(Mandatory = $false)] [AllowNull()] [Hashtable] $ConnectionString, [Parameter(Mandatory = $true)] [ValidateScript({Test-Path $_ -PathType Leaf})] [String] $WebDeployPackage ) if ($ConnectionString -and $ConnectionString.Count -gt 0) { Publish-AzureWebsiteProject ` -Name $Config.name ` -Package $WebDeployPackage ` -ConnectionString $ConnectionString } else { Publish-AzureWebsiteProject ` -Name $Config.name ` -Package $WebDeployPackage } } # Script main routine Set-StrictMode -Version 3 Remove-Module AzureWebSitePublishModule -ErrorAction SilentlyContinue $scriptDirectory = Split-Path -Parent $PSCmdlet.MyInvocation.MyCommand.Definition Import-Module ($scriptDirectory + '\AzureWebSitePublishModule.psm1') -Scope Local -Verbose:$false New-Variable -Name VMWebDeployWaitTime -Value 30 -Option Constant -Scope Script New-Variable -Name AzureWebAppPublishOutput -Value @() -Scope Global -Force New-Variable -Name SendHostMessagesToOutput -Value $SendHostMessagesToOutput -Scope Global -Force try { $originalErrorActionPreference = $Global:ErrorActionPreference $originalVerbosePreference = $Global:VerbosePreference if ($PSBoundParameters['Verbose']) { $Global:VerbosePreference = 'Continue' } $scriptName = $MyInvocation.MyCommand.Name + ':' Write-VerboseWithTime ($scriptName + ' Start') $Global:ErrorActionPreference = 'Stop' Write-VerboseWithTime ('{0} $ErrorActionPreference is set to {1}' -f $scriptName, $ErrorActionPreference) Write-Debug ('{0}: $PSCmdlet.ParameterSetName = {1}' -f $scriptName, $PSCmdlet.ParameterSetName) # Save the current subscription. It will be restored to Current status later in the script Backup-Subscription -UserSpecifiedSubscription $SubscriptionName # Verify that you have the Azure module, Version 0.7.4 or later. if (-not (Test-AzureModule)) { throw 'You have an outdated version of Microsoft Azure PowerShell. To install the latest version, go to http://go.microsoft.com/fwlink/?LinkID=320552 .' } if ($SubscriptionName) { # If you provided a subscription name, verify that the subscription exists in your account. if (!(Get-AzureSubscription -SubscriptionName $SubscriptionName)) { throw ("{0}: Cannot find the subscription name $SubscriptionName" -f $scriptName) } # Set the specified subscription to current. Select-AzureSubscription -SubscriptionName $SubscriptionName | Out-Null Write-VerboseWithTime ('{0}: Subscription is set to {1}' -f $scriptName, $SubscriptionName) } $Config = Read-ConfigFile $Configuration #Build and package your web application New-WebDeployPackage #Run unit tests on your web application Test-WebApplication #Create Azure environment described in the JSON configuration file $newEnvironmentResult = New-AzureWebApplicationWebsiteEnvironment -Configuration $Config -DatabaseServerPassword $DatabaseServerPassword #Deploy Web Application package if $WebDeployPackage is specified by the user if($WebDeployPackage) { Publish-AzureWebApplicationToWebsite ` -Configuration $Config ` -ConnectionString $newEnvironmentResult.ConnectionString ` -WebDeployPackage $WebDeployPackage } } finally { $Global:ErrorActionPreference = $originalErrorActionPreference $Global:VerbosePreference = $originalVerbosePreference # Restore the original current subscription to Current status Restore-Subscription Write-Output $Global:AzureWebAppPublishOutput $Global:AzureWebAppPublishOutput = @() }