Files
about.tommyparnell.com/PublishScripts/Publish-WebApplicationWebsite.ps1
2015-02-09 19:48:58 -05:00

209 lines
6.4 KiB
PowerShell

#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 = @()
}