Setembro de 2015

Volume 30 - Número 9

Operações de Desenvolvimento: Como habilitá-las na pilha da Microsoft

Michael Learned | Setembro de 2015

Fala-se muito sobre Operações de Desenvolvimento hoje em dia. ter um software personalizado é algo essencial para que uma organização possa oferecer experiências avançadas e fornecer dados úteis para usuários empresariais. Entregar software de qualidade rapidamente não é mais uma opção, é uma necessidade. Ficaram para trás os dias de longas sessões de planejamento e iterações de desenvolvimento. Plataformas de nuvem como o Microsoft Azure eliminaram antigos gargalos e ajudaram a massificar a infraestrutura. O software é, para todas as empresas, um fator-chave e um e diferencial em resultados de negócios. Nenhuma organização, nenhum desenvolvedor ou profissional no ramo de TI pode dar as costas para as Operações de Desenvolvimento.

Essas operações podem ser definidas a partir de vários pontos de vista, mas geralmente estão relacionadas à remoção de barreiras culturais e tecnológicas entre as equipes de desenvolvimento e de operações, para que o software possa chegar à etapa de produção da maneira mais eficiente possível. A partir do momento em que o software está sendo executado em produção, é preciso garantir que você possa capturar dados de uso completos para alimentar as equipes de desenvolvimento e os tomadores de decisão.

Existem várias tecnologias e ferramentas que podem ajudar em operações de desenvolvimento. Essas ferramentas e processos oferecem suporte a ciclos de versão rápidos e à coleta de dados em aplicativos de produção. Na pilha da Microsoft, ferramentas como o Gerenciamento de Versão, que guia versões rápidas e previsíveis, e o Application Insights ajudam a capturar dados de uso de aplicativo bem completos. Este artigo irá revelar e explorar importantes ferramentas e técnicas usadas em Operações de Desenvolvimento, bem como os vários aspectos dessas operações (conforme mostrado na Figura 1).

Os vários aspectos das Operações de Desenvolvimento
Figura 1 Os vários aspectos das Operações de Desenvolvimento

A função das Operações de Desenvolvimento

A maioria das organizações deseja melhorar o histórico de Operações de Desenvolvimento nas seguintes áreas:

  • Pipelines de versão automatizados e confiáveis para testar e lançar em ciclos de muito mais curtos.
  • Depois que o aplicativo está sendo executado na produção, você precisa ser capaz de reagir rapidamente para mudar solicitações e defeitos.
  • É preciso capturar dados telemétricos e de uso para executar aplicativos de produção e aproveitar esses dados para tomar decisões embasadas, em vez de usar a “bola de cristal”.

A sua organização tem silos que bloqueiam esses aspectos do DevOps? Esses silos assumem várias formas, como ferramentas diferentes, idiomas de script, políticas e limites departamentais. O objetivo é fornecer a separação de funções e manter controles de segurança e estabilidade na produção.

Apesar das boas intenções, esses silos, às vezes, podem impedir que uma organização atinja vários objetivos de Operações de Desenvolvimento, como obter versões rápidas e confiáveis, lidar com e responder a defeitos de produção. Em muitos casos, essa estrutura silo gera uma quantidade alarmante de lixo. Funcionários das áreas de desenvolvimento e operações tradicionalmente trabalham em equipes diferentes, com objetivos diferentes. Essas equipes gastam ciclos corrigindo problemas causados por essas barreiras e ficam menos tempo concentrados na condução dos negócios.

Os tomadores de decisões corporativas precisam olhar com outros olhos para os vários limites e avaliar o retorno em investimento e os benefícios que esses silos pretendem fornecer. É cada vez mais evidente que quanto mais barreiras forem removidas, mais fácil será implementar soluções de Operações de Desenvolvimento, reduzindo o desperdício.

É um desafio para manter níveis adequados de segurança, controle, conformidade e por aí vai sem deixar de atender a necessidade de agilidade. As equipes de segurança empresarial devem zelar pela segurança e privacidade dos dados. A segurança é, sem dúvida, tão importante quanto qualquer outro aspecto da organização.

No entanto, há um custo associado a cada limite de segurança que você cria. Se causarem desperdício e atrito entre as equipes, os limites de segurança merecem ser reavaliados para garantir o retorno em investimento. Você pode ter a organização mais segura no mundo, mas se não conseguir lançar software no prazo, terá uma desvantagem competitiva.

Equilibrar as prioridades de balanceamento não é um desafio novo, mas é preciso avaliar com honestidade e uma nova abordagem os vários processos e silos que sua organização criou. As equipes devem se concentrar no valor para os negócios, e não em metas individuais.

O pipeline de lançamento

O pipeline de lançamento é onde seu código nasce com controle de versão, para depois passar por diversos ambientes até ser liberado para produção. Ao longo do caminho, você realiza compilações e testes automáticos. O pipeline funcionar de modo a garantir que a passagem das alterações para a produção seja transparente, repetível, confiável e rápida. E isso, sem dúvida, vai envolver automação. O pipeline de lançamento também pode incluir a provisão do ambiente de host do aplicativo.

O pipeline de lançamento pode não ser otimizado se esses fatores estiverem presentes:

  • Incompatibilidades de ferramentas e processos, em que você tem diversas ferramentas e processos por ambiente. (Por exemplo, as equipes de desenvolvimento implantam com uma ferramenta e as de operações, com outra.)
  • Etapas manuais podem levar a erros, melhor evitá-las.
  • Recompilar apenas para implantar no ambiente seguinte.
  • Vai faltar rastreabilidade e você terá dificuldade para saber quais versões foram lançadas.
  • Ciclos de lançamento longos, mesmo para hotfixes.

Provisionamento

O provisionamento de contêineres é, às vezes, considerado uma parte opcional do pipeline de lançamento. Um cenário clássico no local é aquele em que o ambiente já está em execução para hospedar um aplicativo da Web. O servidor Web do IIS ou outro host e o servidor SQL back-end estão em execução por várias iterações. As versões rápidas para esses ambientes implantan apenas o código do aplicativo, e o esquema e as alterações de dados de SQL subsequentes, necessárias para mover os níveis de atualização apropriados. Neste caso, você não está provisionando uma infraestrutura nova (de IIS e SQL) para hospedar o aplicativo. Você está usando um pipeline de lançamento que ignora o provisionamento e se concentra apenas no próprio código do aplicativo.

Há outros cenários em que você talvez queira alterar vários parâmetros de configuração do contêiner. Talvez seja necessário ajustar algumas configurações do pool de aplicativos no IIS. Você pode implementar esses ajustes como parte do pipeline de lançamento ou manipulá-lo manualmente. Em seguida, você pode optar por controlar essas alterações em algum tipo de sistema de controle de versão com uma estratégia de Infraestrutura como Código (IaC).

Há vários outros cenários em que você desejaria provisionar como parte de um pipeline de lançamento automatizado. Por exemplo, no início dos ciclos de desenvolvimento, você pode querer subdividir e recriar novos bancos de dados SQL para cada versão de forma a testar de forma completa e automática o ambiente de teste.

Plataformas de computação em nuvem, como o Azure, permitem que você pague apenas pelo que precisar. Usar a configuração automatizada e a desativação pode ser economicamente interessante. Ao automatizar o provisionamento e as alterações ambientais, você pode prevenir erros e controlar o ambiente do aplicativo inteiro. Cenários como esses tornam atraente incluir o provisionamento como parte de um sistema holístico de gerenciamento de versão.

Há muitas opções e técnicas para incluir o provisionamento em seu pipeline de lançamento. Elas podem variar de acordo com o tipo de aplicativo e o local em que este estiver hospedado. Um exemplo é hospedar um aplicativo Web ASP.NET clássico versus um aplicativo da Web do Azure ou algum outro aplicativo de plataforma como serviço (PaaS), como os Serviços de Nuvem do Azure. Os contêineres para esses aplicativos são diferentes e exigem técnicas diferentes ferramentas para oferecer suporte às etapas de provisionamento.

Infraestrutura como código

Uma técnica de provisionamento bastante usada é a IaC. Um aplicativo é um executável, que pode ser código compilado, scripts e assim por diante, combinado com um ambiente operacional. Você vai ver que esse ambiente gera muitos benefícios.

Recentemente, a Microsoft encomendou à Forrester Research Inc. um estudo sobre o impacto da IaC (consulte bit.ly/1IiGRk1). O estudo mostrou que a IaC é um componente crítico das Operações de Desenvolvimento. Também mostrou que o provisionamento e a configuração são um grande ponto de atrito para as equipes de fornecimento de software. Será preciso utilizar aproveitar técnicas de automação e IaC se você pretende atingir plenamente suas metas de Operações de Desenvolvimento.

Um dos desafios operacionais comuns é automatizar a capacidade de fornecer ambientes apropriados para execução de aplicativos e serviços, mantendo esses ambientes em bom estado. A virtualização e outras técnicas de automação são benéficas, mas ainda enfrentam problemas para manter os nós em sincronia e gerenciar os descompassos de configuração. As equipes de operações e desenvolvimento continuam a ter dificuldades com conjuntos de ferramentas, habilidades e processos diferentes.

A IaC parte da premissa de que devemos ser capazes de descrever, criar versões, executar e testar nossa infraestrutura de código por meio de um pipeline de lançamento automatizado. Você pode, por exemplo, criar facilmente uma máquina virtual do Windows (VM) configurada com o IIS usando um script simples do Windows PowerShell. O setor de operações deve ser capaz de usar as mesmas ferramentas ALM para scripts, versões e testes de infraestrutura.

Outros benefícios incluem a capacidade de criar e subdividir versões conhecidas de seus ambientes. Você pode evitar problemas incômodos causados por diferenças ambientais entre desenvolvimento e produção. Você pode expressar dependências específicas do ambiente do aplicativo no código e executá-las ao longo do controle de versão. Em resumo, você pode eliminar processos manuais e garantir que contêineres de ambiente automatizados e confiáveis foram testados para seus aplicativos. O desenvolvimento e as operações podem usar idiomas de script e ferramentas comuns para alcançar maior eficiência.

O tipo de aplicativo e o local de host pretendido dirão que ferramentas devem ser usadas na execução de seu código de infraestrutura. Várias ferramentas estão ganhando popularidade pelo suporte oferecido a essas técnicas, tais como Configuração do Estado Desejado (DSC), Puppet e Chef, entre outras. Todas elas ajudam a atingir as metas semelhantes com base no cenário em questão.

O trecho de código da IaC pode ser várias coisas. Talvez sejam simplesmente scripts do Windows PowerShell que provisionam recursos. Novamente, os tipos de aplicativos e o ambiente de hospedagem vão orientar as escolhas.

Para o Azure, você pode usar Projetos do Cloud Deployment, que aproveitam APIs do Gerenciamento de Recursos do Azure para criar e gerenciar Grupos de Recursos do Azure. Isso permite que você descreva seus ambientes com JSON. Os Grupos de Recursos do Azure também permitem que você gerencie recursos relacionados ao grupo, como sites e bancos de dados SQL, juntos. Com os projetos de implantação de nuvem, você pode armazenar requisitos de provisionamento no controle de versão e executar o provisionamento do Azure como parte de um pipeline de lançamento automatizado. Aqui estão as seções que compõem a estrutura básica de um modelo de provisionamento:

{
  "$schema": "http://schema.management.azure.com/schemas2015-01-01/
    deploymentTemplate.json#",
  "contentVersion": "",
  "parameters" { },
  "variables": { },
  "resources": [ ],
  "outputs": { }
}

Para obter mais informações sobre modelos, acesse bit.ly/1RQ3gvg, e para mais informações sobre projetos de implantação de nuvem, confira bit.ly/1flDH3m.

Os idiomas de script e as ferramentas são apenas uma parte das alterações necessárias para adotar uma estratégia de IaC. As equipes de desenvolvimento e operações devem trabalhar juntas para integrar fluxos de trabalho em vista de um conjunto de metas comuns. Isso pode ser desafiador porque, historicamente, as equipes de operações se concentram em manter ambientes estáveis, enquanto as equipes de desenvolvimento se concentram na introdução de novos recursos para esses ambientes. Tecnologias sofisticadas estão surgindo, mas a base de uma implementação de IaC bem-sucedida depende da capacidade das equipes de desenvolvimento e operações de colaborar de maneira eficiente.

Orquestração de versão

O Gerenciamento de Versão é uma tecnologia da pilha do Visual Studio ALM. Na verdade, é mais um conceito em que você pode orquestrar os diversos objetos e tarefas abrangida em um lançamento de software. Alguns desses artefatos incluem a carga ou o pacote produzidos por um sistema de compilação, os testes automatizados que ocorrem como parte de um pipeline de lançamento, fluxos de trabalho de aprovação, notificações e controle de segurança para controlar ambientes mais próximos da produção.

Você pode usar tecnologias como DSC, scripts do Windows PowerShell, Gerenciador de Recursos do Azure, Chef e assim por diante para gerenciar o estado do ambiente e instalar software e dependências em ambientes de execução. Em termos de ferramentas fornecidas pelo Visual Studio ALM, considere o Release Management como o serviço que abarca as tecnologias e ferramentas de que você precisa executar as implantações. O Gerenciamento de Versão pode aproveitar scripts simples de linha de comando ou do Windows PowerShell, usar DSC ou até mesmo executar suas próprias ferramentas personalizadas. A melhor opção é tentar usar a solução mais simples possível para executar suas versões.

Outra boa prática é usar o Windows PowerShell, por ser uma ferramenta onipresente. Você pode, por exemplo, usar scripts do Windows PowerShell como parte de um pipeline de lançamento para implantar Serviços de Nuvem do Azure. Há muitas ferramentas prontas para uso no Gerenciamento de Versão (ver Figura 2), mas você também tem flexibilidade para criar as suas próprias.

Ferramentas e opções disponíveis para Gerenciamento de Versão
Figure 2 Ferramentas e opções disponíveis para Gerenciamento de Versão

O Gerenciamento de Versão pode ajudar a criar um pipeline de lançamento automatizado com elegância e gerar versões automatizadas de aplicativos confiáveis. Você também pode optar por incluir o provisionamento. As ferramentas de Gerenciamento de Versão com o Visual Studio e o Team Foundation Server podem ajudar você a organizar esses artefatos na transação geral de lançamento. Essas ferramentas também fornecem exibições em estilo de painel completas sobre os estados atuais e do histórico. Também há integração avançada com o Team Foundation Server e o Visual Studio Online.

E onde o DSC se encaixa?

O DSC tem tido bastante destaque na imprensa ultimamente. Ele não é, no entanto, uma ferramenta que abrange tudo e pode lidar com tudo. Você usará o DSC como uma das ferramentas de sua estrutura de Operações de Desenvolvimento, não a única.

Você pode usar o DSC nos modos pull ou push. Em seguida, você pode usar a fase “fazer acontecer” para controlar o estado do servidor. Controlar o estado pode ser algo simples como garantir que existe um arquivo ou diretório, ou algo mais complexo, como modificar o registro, interromper ou iniciar serviços ou executar scripts para implantar um aplicativo. Você pode fazer isso repetidamente, sem erros. Também é possível definir seus próprios recursos do DSC ou utilizar um grande número de recursos internos.

O DSC é implementado como um Gerenciador de Configurações Local (LCM) em execução em um nó de destino, que aceita um arquivo de configuração de Arquivo de Objeto de Gerenciamento (MOF) e o usa para aplicar configurações ao próprio nó. Sendo assim, não há ferramenta que use informações de vários componentes. Você nem precisa usar o Windows PowerShell para produzir o MOF.

Para começar a usar a DSC, basta produzir o arquivo MOF. Isso vai descrever os vários recursos a executar, que acabam sendo escritos principalmente no Windows PowerShell. Uma das maiores vantagens do DSC nos sistemas baseados em Windows Server é o LCM nativo do sistema operacional, dando a você o conceito de um agente interno. Também há cenários para aproveitar o DSC com o Linux. Veja a Figura 3 para obter um exemplo de separação dos dados de configuração para o script do DSC.

Figura 3 Dados de configuração separados dentro de um script do DSC

Configuration InstallWebSite
{
  Node $AllNodes.NodeName
  {
    WindowsFeature InstallIIS
    {
      Ensure = "Present"
      Name = "Web-Server"
    }
  }
}
InstallWebSite –ConfigurationData .\config.ps1
Where config.ps1 contains
$ConfigData = @{
  AllNodes = @(
  @{
    NodeName = “localhost”
  })
}

O DSC pode ser uma parte importante de um pipeline de lançamento se tiver recursos disponíveis para ajudar a dar suporte à implantação. Com aplicativos locais ou de IaaS, o DSC é uma excelente opção para ajudar a controlar o ambiente de configuração e dar suporte a seus cenários de implantação.

Ainda assim, o DSC não deve ser usado em qualquer cenário. Contextualizando, se você estiver implantando recursos de PaaS do Azure, é recomendável usar o Gerenciador de Recursos do Azure para iniciar as máquinas virtuais e configurar o sistema de rede. O DSC não foi projetado para isso. Quando as VMs estiverem em execução, você pode usar o DSC para obter a configuração local da maneira desejada e verificar se os elementos de configuração importantes não mudaram.

Monitoramento com o Application Insights

Uma vez que o aplicativo e o ambiente estiverem em produção, é essencial coletar dados e monitorar a integridade operacional. Também é preciso entender os padrões de uso. Esses dados são essenciais para o gerenciamento de um serviço íntegro. Coletar e monitorar esses dados é uma parte importante das Operações de Desenvolvimento. A Microsoft, por exemplo, usou dados de produção para aprimorar as equipes do Visual Studio Online. Esses dados avançados ajudaram as equipes do Visual Studio Online a garantir a disponibilidade do serviço, mostrando como os desenvolvedores estão usando o serviço e informando decisões sobre priorização de recursos. Você pode ler mais sobre a jornada das Operações de Desenvolvimento da Microsoft em bit.ly/1AzDL9V.

O Visual Studio Application Insights adiciona um SDK ao seu aplicativo e envia telemetria ao portal do Azure. Ele oferece suporte a diversas plataformas e idiomas, incluindo iOS, Android, ASP.NET e Java. Você pode capturar dados de desempenho, tempo de atividade do aplicativo e várias análises de uso. Você pode exibir esses dados avançados para tomadores de decisão e participantes para ajudá-los a tomar decisões melhores, detectar problemas e aprimorar continuamente os aplicativos. Você pode ler mais sobre o Application Insights em bit.ly/1IbRnrF.

A Figura 4 e a Figura 5 mostram exemplos de tipos de dados coletados pelo Application Insights.

O Application Insights pode fornecer dados sobre usuários e exibições de páginas
Figura 4 O Application Insights pode fornecer dados sobre usuários e exibições de páginas

O Application Insights também monitora testes da Web
Figura 5 O Application Insights também monitora testes da Web

Conclusão

As Operações de Desenvolvimento ajudam as equipes a alcançar entrega contínua e a aproveitar dados de aplicativos em execução para ajudar a tomar decisões mais embasadas. Este artigo testou várias tecnologias Microsoft proeminentes que você pode usar para atingir essas metas:

  • O Gerenciamento de Versão permite usar qualquer tecnologia para orientar implantações. Entre essas as tecnologias estão scripts simples do Windows PowerShell, configurações do DSC ou até mesmo ferramentas de terceiros, como o Puppet.
  • As estratégias de Infraestrutura como Código ajudam as equipes de desenvolvimento e operações a trabalhar juntas com eficiência.
  • O Visual Studio Application Insights oferece um mecanismo para capturar dados avançados de aplicativos em execução, para ajudar os participantes a entender a integridade de aplicativos e examinar padrões de uso para orientar a tomada de decisões informadas.

Essas tecnologias podem ajudar você a melhorar sensivelmente a maturidade as Operações de Desenvolvimento. Você também precisará mesclar um conjunto apropriado de tecnologias ao trabalhar para superar barreiras culturais.

Recursos adicionais

  • Para saber mais sobre Infraestrutura como Código, ouça a discussão de Brian Keller no Canal 9 em bit.ly/1IiNqmr .
  • Para saber mais sobre os Projetos de Implantação do Grupo de Recursos do Azure, consulte bit.ly/1flDH3m.
  • Para saber mais sobre Planejamento no TFS, Prevenção e Recuperação de Desastre e TFS em IaaS no Azure, consulte o guia em vsarplanningguide.codeplex.com.
  • Para obter mais informações sobre Configuração como Código para profissionais de Operações de Desenvolvimento e ALM, consulte vsardevops.codeplex.com.

Micheal Learned* é Visual Studio ALM Ranger e atualmente está concentrado em Operações de Desenvolvimento e no Microsoft Azure. Ele trabalha em vários projetos de software, dentro e fora da Microsoft, há mais de 15 anos. Micheal mora na região central do estado de Illinois e dedica seu tempo livre a ajudar a comunidade e relaxar com a filha, os dois filhos e a mulher. Siga-o no Twitter em twitter.com/mlhoop.*

Agradecemos aos seguintes especialistas técnicos pela revisão deste artigo: Brown Donovan (Microsoft), Wouter de Kort (desenvolvedor independente), Marcus Fernandez (Microsoft), Richard Hundhausen (Accentient), Willy-Peter Schaub (Microsoft) e Giulio Vian (desenvolvedor independente)