{tecnologia, conceitos, negócios, idéias, práticas, .NET, ruby, osx, ios e algo mais}
08/02/2011
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 - Via Visual Studio - Via cmdlets Powershell O processo via Powershell pode ser utilizado para automatização de builds e deploys de uma solução, por exemplo em um ambiente de integração contínua e deploy contínuo.(Confira aqui como baixar e usar os cmdlets Powershell para Windows Azure)São necessários alguns passos para realizar um deploy completo. É um processo bastante verboso por enquanto, mas não se assustem pois apesar de tudo é simples.Vou imaginar que você já possui o Powershell em sua máquina. Vou utilizar o Powershell ISE.
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 -WaitToCompleteGet-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 = $Cfgif(-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 -WaitToCompleteGet-HostedService -ServiceName $service_name -SubscriptionId $subscription_id -Certificate $certificate | Get-Deployment -Slot staging |Set-DeploymentStatus running |Get-OperationStatus -WaitToCompleteGet-HostedService -ServiceName $service_name -SubscriptionId $subscription_id -Certificate $certificate |Get-Deployment -Slot staging |Move-Deployment |Get-OperationStatus -WaitToCompleteGet-HostedService -ServiceName $service_name -SubscriptionId $subscription_id -Certificate $certificate | Get-Deployment -Slot staging |Set-DeploymentStatus suspended |Get-OperationStatus -WaitToCompleteGet-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.