Last active
December 24, 2015 07:19
-
-
Save thinktainer/6762746 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Param( $serviceName = "", | |
$storageAccountName = "", | |
$packageLocation = "", | |
$cloudConfigLocation = "", | |
$environment = "Staging", | |
$deploymentLabel = "ContinuousDeploy to $servicename", | |
$timeStampFormat = "g", | |
$alwaysDeleteExistingDeployments = 1, | |
$enableDeploymentUpgrade = 1, | |
$selectedsubscription = "default", | |
$subscriptionDataFile = "", | |
$containerName = "ps1deploys" | |
) | |
function Publish() | |
{ | |
$deployment = Get-AzureDeployment -ServiceName $serviceName -Slot $slot -ErrorVariable a -ErrorAction silentlycontinue | |
if ($a[0] -ne $null) | |
{ | |
Write-Output "$(Get-Date -f $timeStampFormat) - No deployment is detected. Creating a new deployment. " | |
} | |
#check for existing deployment and then either upgrade, delete + deploy, or cancel according to $alwaysDeleteExistingDeployments and $enableDeploymentUpgrade boolean variables | |
if ($deployment.Name -ne $null) | |
{ | |
switch ($alwaysDeleteExistingDeployments) | |
{ | |
1 | |
{ | |
switch ($enableDeploymentUpgrade) | |
{ | |
1 #Update deployment inplace (usually faster, cheaper, won't destroy VIP) | |
{ | |
Write-Output "$(Get-Date -f $timeStampFormat) - Deployment exists in $servicename. Upgrading deployment." | |
UpgradeDeployment | |
} | |
0 #Delete then create new deployment | |
{ | |
Write-Output "$(Get-Date -f $timeStampFormat) - Deployment exists in $servicename. Deleting deployment." | |
DeleteDeployment | |
CreateNewDeployment | |
} | |
} # switch ($enableDeploymentUpgrade) | |
} | |
0 | |
{ | |
Write-Output "$(Get-Date -f $timeStampFormat) - ERROR: Deployment exists in $servicename. Script execution cancelled." | |
exit | |
} | |
} #switch ($alwaysDeleteExistingDeployments) | |
} else { | |
CreateNewDeployment | |
} | |
} | |
function UploadToStorageContainer() | |
{ | |
$containerState = Get-AzureStorageContainer -Name $containerName -ea 0 | |
if ($containerState -eq $null) | |
{ | |
New-AzureStorageContainer -Name $containerName | out-null | |
} | |
Set-AzureStorageBlobContent -File $packageLocation -Container $containerName -Blob $blob -Force| Out-Null | |
$script:packageLocation = (Get-AzureStorageBlob -blob $blobName -Container $containerName).ICloudBlob.uri.AbsoluteUri | |
} | |
function CreateNewDeployment() | |
{ | |
UploadToStorageContainer | |
write-progress -id 3 -activity "Creating New Deployment" -Status "In progress" | |
Write-Output "$(Get-Date -f $timeStampFormat) - Creating New Deployment: In progress" | |
$opstat = New-AzureDeployment -Slot $slot -Package $packageLocation -Configuration $cloudConfigLocation -label $deploymentLabel -ServiceName $serviceName | |
$completeDeployment = Get-AzureDeployment -ServiceName $serviceName -Slot $slot | |
$completeDeploymentID = $completeDeployment.deploymentid | |
write-progress -id 3 -activity "Creating New Deployment" -completed -Status "Complete" | |
Write-Output "$(Get-Date -f $timeStampFormat) - Creating New Deployment: Complete, Deployment ID: $completeDeploymentID" | |
StartInstances | |
} | |
function UpgradeDeployment() | |
{ | |
UploadToStorageContainer | |
write-progress -id 3 -activity "Upgrading Deployment" -Status "In progress" | |
Write-Output "$(Get-Date -f $timeStampFormat) - Upgrading Deployment: In progress" | |
# perform Update-Deployment | |
$setdeployment = Set-AzureDeployment -Upgrade -Slot $slot -Package $packageLocation -Configuration $cloudConfigLocation -label $deploymentLabel -ServiceName $serviceName -Force | |
$completeDeployment = Get-AzureDeployment -ServiceName $serviceName -Slot $slot | |
$completeDeploymentID = $completeDeployment.deploymentid | |
write-progress -id 3 -activity "Upgrading Deployment" -completed -Status "Complete" | |
Write-Output "$(Get-Date -f $timeStampFormat) - Upgrading Deployment: Complete, Deployment ID: $completeDeploymentID" | |
} | |
function DeleteDeployment() | |
{ | |
write-progress -id 2 -activity "Deleting Deployment" -Status "In progress" | |
Write-Output "$(Get-Date -f $timeStampFormat) - Deleting Deployment: In progress" | |
#WARNING - always deletes with force | |
$removeDeployment = Remove-AzureDeployment -Slot $slot -ServiceName $serviceName -Force | |
write-progress -id 2 -activity "Deleting Deployment: Complete" -completed -Status $removeDeployment | |
Write-Output "$(Get-Date -f $timeStampFormat) - Deleting Deployment: Complete" | |
} | |
function StartInstances() | |
{ | |
write-progress -id 4 -activity "Starting Instances" -status "In progress" | |
Write-Output "$(Get-Date -f $timeStampFormat) - Starting Instances: In progress" | |
$deployment = Get-AzureDeployment -ServiceName $serviceName -Slot $slot | |
$runstatus = $deployment.Status | |
if ($runstatus -ne 'Running') | |
{ | |
$run = Set-AzureDeployment -Slot $slot -ServiceName $serviceName -Status Running | |
} | |
$deployment = Get-AzureDeployment -ServiceName $serviceName -Slot $slot | |
$oldStatusStr = @("") * $deployment.RoleInstanceList.Count | |
while (-not(AllInstancesRunning($deployment.RoleInstanceList))) | |
{ | |
$i = 1 | |
foreach ($roleInstance in $deployment.RoleInstanceList) | |
{ | |
$instanceName = $roleInstance.InstanceName | |
$instanceStatus = $roleInstance.InstanceStatus | |
if ($oldStatusStr[$i - 1] -ne $roleInstance.InstanceStatus) | |
{ | |
$oldStatusStr[$i - 1] = $roleInstance.InstanceStatus | |
Write-Output "$(Get-Date -f $timeStampFormat) - Starting Instance '$instanceName': $instanceStatus" | |
} | |
write-progress -id (4 + $i) -activity "Starting Instance '$instanceName'" -status "$instanceStatus" | |
$i = $i + 1 | |
} | |
sleep -Seconds 1 | |
$deployment = Get-AzureDeployment -ServiceName $serviceName -Slot $slot | |
} | |
$i = 1 | |
foreach ($roleInstance in $deployment.RoleInstanceList) | |
{ | |
$instanceName = $roleInstance.InstanceName | |
$instanceStatus = $roleInstance.InstanceStatus | |
if ($oldStatusStr[$i - 1] -ne $roleInstance.InstanceStatus) | |
{ | |
$oldStatusStr[$i - 1] = $roleInstance.InstanceStatus | |
Write-Output "$(Get-Date -f $timeStampFormat) - Starting Instance '$instanceName': $instanceStatus" | |
} | |
$i = $i + 1 | |
} | |
$deployment = Get-AzureDeployment -ServiceName $serviceName -Slot $slot | |
$opstat = $deployment.Status | |
write-progress -id 4 -activity "Starting Instances" -completed -status $opstat | |
Write-Output "$(Get-Date -f $timeStampFormat) - Starting Instances: $opstat" | |
} | |
function AllInstancesRunning($roleInstanceList) | |
{ | |
foreach ($roleInstance in $roleInstanceList) | |
{ | |
if ($roleInstance.InstanceStatus -ne "ReadyRole") | |
{ | |
return $false | |
} | |
} | |
return $true | |
} | |
#configure powershell with Azure 1.7 modules | |
Import-Module Azure | |
#configure powershell with publishsettings for your subscription | |
$pubsettings = $subscriptionDataFile | |
Import-AzurePublishSettingsFile $pubsettings | |
Set-AzureSubscription -CurrentStorageAccount $storageAccountName -SubscriptionName $selectedsubscription | |
#set remaining environment variables for Azure cmdlets | |
$subscription = Get-AzureSubscription $selectedsubscription | |
$subscriptionname = $subscription.subscriptionname | |
$subscriptionid = $subscription.subscriptionid | |
$slot = $environment | |
#main driver - publish & write progress to activity log | |
Write-Output "$(Get-Date -f $timeStampFormat) - Azure Cloud Service deploy script started." | |
Write-Output "$(Get-Date -f $timeStampFormat) - Preparing deployment of $deploymentLabel for $subscriptionname with Subscription ID $subscriptionid." | |
Publish | |
$deployment = Get-AzureDeployment -slot $slot -serviceName $servicename | |
$deploymentUrl = $deployment.Url | |
Write-Output "$(Get-Date -f $timeStampFormat) - Created Cloud Service with URL $deploymentUrl." | |
Write-Output "$(Get-Date -f $timeStampFormat) - Azure Cloud Service deploy script finished." |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment