Vinicius Quaiato

{tecnologia, conceitos, negócios, idéias, práticas, .NET, ruby, osx, ios e algo mais}

Deploy Windows Azure usando Powershell


Fala galera. Quando procuramos maior produtividade e redução de problemas em nosso ambiente e processo de trabalho vamos nos deparar inevitavelmente com automação de algumas coisas.O processo de deploy do Windows Azure pode ser feito de três maneiras, a saber:- Via Windows Azure portal

Criando um novo deploy Windows Azure no Powershell

Como ainda não estamos automatizando nosso build vamos compilar uma solution Azure no Visual Studio que será utilizada para o deploy.Para todos os scripts que executaremos precisaremos de algumas informações repetidamente. Para isso vamos criar variáveis no Powershell e armazenar alguns valores:

$nome_servico = "meu_servico"$subs_id = "a123bc12a-a123-1234-1234-a12b123c1234"$cert = Get-Item cert:\CurrentUser\My\<thumbprint />

(os dados acima são fictícios hein! :P)Após definirmos estes dados vamos então começar a criar o deploy. Para isso vou definir mais três variáveis uma para o label da nossa publicação, uma para o caminho do pacote e uma para o caminho do arquivo de configuração.

$label = "deploy via powershell"$pacote = "C:\Publish\MVCSummitCloudApp.cspkg"$config = "C:\Publish\ServiceConfiguration.cscfg"

No meu caso eu gerei estes arquivo no C: para facilitar o exemplo no blog.Vamos agora criar o script de deploy de fato:

New-Deployment -ServiceName $nome_servico -SubscriptionId $subs_id -Certificate $cert -Slot staging -Package $pacote -Configuration $config -Label $label | Get-OperationStatus -WaitToComplete

Após enviarmos o deploy precisamos colocá-lo para rodar, e para isso utilizaremos o script abaixo:

Get-HostedService -ServiceName $service_name -SubscriptionId $subscription_id -Certificate $certificate | Get-Deployment -Slot staging |Set-DeploymentStatus running |Get-OperationStatus -WaitToComplete

Depois que colocamos o serviço para rodar podemos testá-lo. Após os testes podemos então mover o deploy de staging para produção, e para isso vamos nos utilizar de mais um script:

Get-HostedService -ServiceName $service_name -SubscriptionId $subscription_id -Certificate $certificate |Get-Deployment -Slot staging |Move-Deployment |Get-OperationStatus -WaitToComplete

Quando promovemos um deploy para produção, acabamos ficando com uma instância de staging ativa. Se mantivermos a mesma seremos cobrados por essa alocação. Para que não sejamos cobrados precisamos parar o serviço em staging e então deletá-lo. Para isso utilizaremos os dois scripts abaixo em conjunto:

Get-HostedService -ServiceName $service_name -SubscriptionId $subscription_id -Certificate $certificate |
  Get-Deployment -Slot staging |
  Set-DeploymentStatus suspended |
  Get-OperationStatus -WaitToComplete

Get-HostedService -ServiceName $service_name -SubscriptionId $subscription_id -Certificate $certificate |
  Get-Deployment -Slot staging |
  Remove-Deployment |
  Get-OperationStatus -WaitToComplete

Pronto! Isso é tudo que você precisa fazer para “automatizar” seu deploy com o Windows Azure.Eu criei um script powershell que já faz tudo isso e é possível chamá-lo com passagem de parâmetros, isso deve facilitar um pouco as coisas.O script completo está no gist(github) e aqui:

Param($S, $I, $Cert, $L, $P, $Cfg)

$start = Get-Date
$service_name = $S
$subscription_id = $I
$certificate = $Cert
$label = $L
$package = $P
$config_file = $Cfg

if (-not(Get-PSSnapin AzureManagementToolsSnapIn)) {
  Add-PSSnapin AzureManagementToolsSnapIn
}

New-Deployment -ServiceName $service_name -SubscriptionId $subscription_id -Certificate $certificate -Slot staging -Package $package -Configuration $config_file -Label $label |
  Get-OperationStatus -WaitToComplete

Get-HostedService -ServiceName $service_name -SubscriptionId $subscription_id -Certificate $certificate |
  Get-Deployment -Slot staging |
  Set-DeploymentStatus running |
  Get-OperationStatus -WaitToComplete

Get-HostedService -ServiceName $service_name -SubscriptionId $subscription_id -Certificate $certificate |
  Get-Deployment -Slot staging |
  Move-Deployment |
  Get-OperationStatus -WaitToComplete

Get-HostedService -ServiceName $service_name -SubscriptionId $subscription_id -Certificate $certificate |
  Get-Deployment -Slot staging |
  Set-DeploymentStatus suspended |
  Get-OperationStatus -WaitToComplete

Get-HostedService -ServiceName $service_name -SubscriptionId $subscription_id -Certificate $certificate |
  Get-Deployment -Slot staging |
  Remove-Deployment |
  Get-OperationStatus -WaitToComplete

$end = Get-Date
"Deploy finished in " + ($end - $start).TotalSeconds + " secs."

O uso deste script é algo mais ou menos assim:

.'.\push.ps1' -S "service_name" -I "your_subscription_id" -Cert (Get-Item cert:\CurrentUser\My\<thumb_print>) -L "label_name" -P ".cspkg local" -Cfg ".cscfg local"</thumb_print>

A idéia é transformar isso em cmdlets do powershell para facilitar um pouco as coisas e depois disso criar build tasks para o MS-Build.

Abraços, Vinicius Quaiato.

Voltar

Fork me on GitHub