Lista de verificação de DevOps

DevOps é a integração do desenvolvimento, garantia de qualidade e operações de TI em uma cultura unificada e um conjunto de processos para entrega de software. Use esta lista de verificação como um ponto de partida para avaliar seu processo e cultura de DevOps.

Cultura

Assegure o alinhamento de negócios entre organizações e equipes. Conflitos por recursos, finalidade, metas e prioridades dentro de uma organização podem ser um risco para operações bem-sucedidas. Verifique se as equipes de negócios, desenvolvimento e operações estão alinhadas.

Verifique se a equipe entende o ciclo de vida do software. Sua equipe precisa entender o ciclo de vida geral dos seus aplicativos e em qual parte do ciclo de vida cada um se encontra. Essas informações ajudam a todos os membros da equipe a saber o que devem fazer agora e para o que eles devem se planejar e se preparar no futuro.

Reduza o tempo do ciclo. Busque minimizar o tempo que leva para mover de ideias para software desenvolvido utilizável. Limite o tamanho e o escopo dos lançamentos individuais para manter a carga de teste baixa. Automatize os processos de build, teste, configuração e implantação sempre que possível. Elimine quaisquer obstáculos para comunicação entre os desenvolvedores, bem como aqueles entre as equipes de desenvolvedores e operações.

Examine e aprimore os processos. Seus processos e procedimentos, automatizados e manuais, nunca são finais. Agende revisões regulares dos fluxos de trabalho, procedimentos e documentação atuais, com a meta de aperfeiçoamento contínuo.

Faça planejamento proativo. Planeje-se proativamente para falhas. Estabeleça processos para identificar rapidamente problemas quando eles ocorrem, escalonar problemas para os membros corretos da equipe para correção e confirmar a resolução.

Aprenda com as falhas. As falhas são inevitáveis, mas é importante aprender com as falhas para evitar repeti-las. Se uma falha operacional ocorrer, faça a triagem do problema, documente a causa e a solução e compartilhe as lições que você aprendeu. Sempre que possível, atualize os processos de build para detectar automaticamente essas falhas no futuro.

Otimize para velocidade e colete dados. Todo aprimoramento planejado é uma hipótese. Trabalhe com os menores incrementos possíveis. Trate novas ideias como experimentos. Instrumente os experimentos de forma que você possa coletar dados de produção para avaliar a eficiência deles. Esteja preparado para falhar rapidamente se a hipótese estiver errada.

Reserve tempo para o aprendizado. Êxitos e falhas fornecem oportunidades de aprendizado. Antes de passar para novos projetos, reserve tempo para reunir as lições importantes e verifique se as equipe absorveu essas lições. Além disso, dê à equipe tempo para desenvolver habilidades, experimentar e aprender sobre novas ferramentas e técnicas.

Documente as operações. Documente todas as ferramentas, processos e tarefas automatizadas com o mesmo nível de qualidade que seu código de produto. Documente a arquitetura e o design atual dos sistemas aos quais você dá suporte, juntamente com processos de recuperação e outros procedimentos de manutenção. Concentre-se nas etapas que você de fato executa, e não em processos teoricamente ideais. Examine e atualize sua documentação regularmente. Para o código, certifique-se de incluir comentários significativos, especialmente em APIs públicas. Use ferramentas para gerar a documentação do código automaticamente sempre que possível.

Compartilhe conhecimento. A documentação é útil apenas se as pessoas sabem que ela existe e se podem encontrá-la. Mantenha sua documentação organizada e torne-a facilmente detectável. Abuse da criatividade: use falas (apresentações informais), vídeos ou boletins informativos para compartilhar conhecimento.

Desenvolvimento

Fornece ambientes semelhantes aos de produção aos desenvolvedores. Se os ambientes de desenvolvimento e teste não corresponderem ao seu ambiente de produção, será difícil testar e diagnosticar problemas. Mantenha os ambientes de desenvolvimento e teste o mais próximos possível do ambiente de produção. Verifique se os dados de teste são consistentes com os dados que você usou em produção, mesmo que se tratem de dados de exemplo e não de dados reais de produção (por motivos de conformidade ou de privacidade). Planeje gerar dados de teste de exemplo e torná-los anônimos.

Verifique se todos os membros da equipe autorizada podem provisionar a infraestrutura e implantar aplicativos. A configuração de recursos de produção e a implantação de um aplicativo não devem envolver tarefas manuais complicadas nem conhecimento técnico detalhado de um sistema. Qualquer pessoa com as permissões corretas deve ser capaz de criar ou implantar recursos de produção sem precisar da sua equipe de operações.

Essa recomendação não implica que qualquer pessoa pode enviar atualizações dinâmicas por push para uma implantação de produção. Ela se trata de reduzir o atrito entre as equipes de desenvolvimento de garantia de qualidade para criar ambientes semelhantes aos de produção.

Instrumente cada aplicativo para insight. Para entender a integridade dos seus aplicativos, você precisa saber como eles estão desempenhando e se estão enfrentando erros ou problemas. Sempre inclua a instrumentação como um requisito de design e compile a instrumentação em cada aplicativo desde o início. A instrumentação deve incluir logs de eventos para análise da causa raiz, mas também telemetria e métricas para monitorar a integridade e o uso de cada aplicativo.

Acompanhe a dívida técnica. Muitos projetos priorizam os agendamentos de lançamento em relação à qualidade do código em algum nível. Sempre documente quando atalhos são tomados ou outras implementações não ideais e reserve tempo para voltar a esses problemas.

Considere a possibilidade de enviar atualizações por push diretamente para a produção. Para reduzir o tempo do ciclo de lançamento geral, considere a possibilidade de enviar por push confirmações de código adequadamente testadas diretamente para a produção. Use alternâncias de recursos para controlar quais recursos você habilita. Assim, você pode passar rapidamente do desenvolvimento para o lançamento usando os botões de alternância para habilitar ou desabilitar os recursos. Esses botões também são úteis quando você executa testes como lançamentos canário, em que você implanta um recurso específico em um subconjunto do seu ambiente de produção.

Testando

Automatizar os testes. Testar manualmente o software é entediante e suscetível a erros. Automatize tarefas comuns de teste e integre os testes em seus processos de build. Testes automatizados garantem cobertura e reprodutibilidade de teste consistentes. Ao executar testes de interface do usuário integrados, use também uma ferramenta automatizada. O Azure oferece recursos de desenvolvimento e teste que podem ajudar você a configurar e executar testes. Para obter mais informações, confira Desenvolver e testar no Azure.

Teste em busca de falhas. Quando um sistema não consegue se conectar a um serviço, ele deve responder normalmente. E quando o serviço estiver disponível novamente, o sistema deverá se recuperar. Faça do teste de injeção de falha uma parte padrão da revisão em ambientes de preparo e de teste. Quando as práticas e o processo de teste estiverem maduros, considere a execução desses testes em produção.

Teste em produção. Um processo de lançamento não termina com a implantação na produção. Estabeleça testes para garantir que o código implantado funciona conforme o esperado. Para implantações que você atualiza raramente, agende o teste em produção como parte comum da manutenção.

Automatizar testes de desempenho para identificar problemas de desempenho com antecedência. O impacto de um problema sério de desempenho pode ser tão grave quanto o de um bug no código. Embora testes funcionais automatizados possam impedir bugs no aplicativo, eles podem não detectar problemas de desempenho. Defina metas de desempenho aceitáveis para métricas como latência, tempos de carregamento e uso de recursos. Inclua testes de desempenho automatizados em seu pipeline de lançamento para verificar se o seu aplicativo satisfaz essas metas.

Execute testes de capacidade. Um aplicativo pode funcionar bem em condições de teste e ter problemas na produção devido a limitações de escala ou de recurso. Sempre defina os limites de capacidade e de uso máximos esperados. Teste para verificar se o seu aplicativo pode lidar com esses limites, mas também teste o que acontece quando você excede esses limites. Testes a capacidade em intervalos regulares.

Após um lançamento inicial, você deve executar testes de capacidade e de desempenho sempre que atualizar o código de produção. Use dados históricos para ajustar testes e para determinar quais tipos de testes você precisa fazer.

Execute testes de penetração de segurança automatizados. Verificar se a segurança do aplicativo é tão importante quanto testar qualquer outra funcionalidade. Torne os testes de penetração automatizados uma parte padrão do processo de build e de implantação. Agende testes de segurança e verificações de vulnerabilidade regulares em aplicativos implantados, monitorando em busca de ataques e de portas e pontos de extremidade abertos. Testes automatizados não removem a necessidade de revisões de segurança detalhadas em intervalos regulares.

Realize o teste de continuidade de negócios automatizado. Desenvolva testes para continuidade de negócios de grande escala, inclusive failover e recuperação de backup. Configure processos automatizados para executar esses testes regularmente.

Versão

Automatizar as implantações. A Automação oferece muitos benefícios, incluindo:

  • Implantações mais rápidas e confiáveis.
  • Implantações consistentes em qualquer ambiente com suporte, incluindo teste, processo de preparo e produção.
  • Remoção do risco de erro humano que implantações manuais podem introduzir.
  • Facilidade no agendamento de lançamentos em horários adequados, para reduzir os efeitos de um potencial tempo de inatividade.

Automatize o processo de implantação de cada aplicativo para seus ambientes de teste, de preparo e de produção. Tenha sistemas em vigor para detectar problemas durante a distribuição e tenha uma maneira automatizada de efetuar roll forward de correções ou reverter alterações.

Use a integração contínua. A CI (integração contínua) é a prática de mesclar todo o código de desenvolvedor em uma base de código central em um agendamento regular e, em seguida, executar automaticamente processos padrão de build e de teste. A CI garante que toda a equipe possa trabalhar em uma base de código simultaneamente, sem conflitos. A CI também ajuda você a encontrar defeitos de código o mais cedo possível. De preferência, um processo de CI deve ser executado sempre que você confirmar ou fizer check-in do código. Ele deve ser executado pelo menos uma vez por dia.

Considere adotar um modelo de desenvolvimento baseado em tronco. Nesse modelo, os desenvolvedores são confirmados para um único branch (o tronco). Há um requisito de que commits nunca interrompam um build. Este modelo facilita CI, porque você faz todo o trabalho de recurso no tronco e resolve conflitos de mesclagem quando cada confirmação ocorre.

Considere usar a entrega contínua. A CD (entrega contínua) é a prática de garantir que o código esteja sempre pronto para implantar ao se compilar, testar e implantar automaticamente o código em ambientes semelhantes ao de produção. Adicionar CD para criar um pipeline completo de CI/CD ajuda a detectar defeitos de código o mais rápido possível. Fazer isso também garante que você possa lançar atualizações testadas corretamente em um período curto.

A implantação contínua é um processo que pega automaticamente quaisquer atualizações que tenham passado por um pipeline de CI/CD e as implanta na produção. A implantação contínua requer testes automáticos robustos e um planejamento de processo avançado. Ela pode não ser apropriada para todas as equipes.

Faça alterações em incrementos pequenos. Alterações de código grandes tem um maior potencial para introduzir bugs do que os menores. Sempre que possível, mantenha as alterações pequenas. Fazer isso limita os possíveis efeitos de cada alteração e simplifica a compreensão e a depuração de problemas.

Controle a exposição a alterações. Verifique se você está no controle de quando as atualizações ficam visíveis para os usuários finais. Considere o uso de alternâncias de recurso para controlar quando você habilita os recursos para os usuários finais.

Implemente estratégias de gerenciamento de versão para reduzir o risco de implantação. Implantar uma atualização de aplicativo para produção sempre envolve algum risco. Para minimizar esse risco, use estratégias como os lançamentos canário ou as implantações de tipo azul/verde para implantar atualizações em um subconjunto de usuários. Verifique se cada atualização funciona conforme o esperado e, em seguida, distribua cada atualização para o restante do sistema.

Documente todas as alterações. Atualizações secundárias e alterações de configuração podem ser uma fonte de confusão e de conflito no controle de versão. Mantenha sempre um registro claro das alterações, independentemente de quão pequenas. Registre em log tudo que for alterado, incluindo patches que você aplicou, alterações de política e alterações de configuração. O registro das alterações deve estar visível para toda a sua equipe. Mas não inclua dados confidenciais nesses logs. Por exemplo, registre em log que uma credencial foi atualizada e quem fez a alteração, mas não registre as credenciais atualizadas.

Considere tornar a infraestrutura imutável. A infraestrutura imutável é baseada no princípio segundo o qual não se deve modificar a infraestrutura após sua implantação para produção. Caso contrário, você pode entrar em um estado em que foram aplicadas alterações ad hoc, tornando difícil saber exatamente o que foi alterado. A infraestrutura imutável funciona substituindo-se servidores inteiros como parte de qualquer nova implantação. Com essa abordagem, você pode testar e implantar seu código e ambiente de hospedagem como um bloco. Após a implantação, os componentes da infraestrutura não são modificados até o próximo ciclo de build de implantação.

Monitoramento

Torne os sistemas observáveis. Sua equipe de operações deve ter sempre visibilidade clara da integridade e do status de um sistema ou serviço. Configure pontos de extremidade de integridade externos para monitorar o status e codifique os aplicativos para instrumentar as métricas de operações. Use um esquema comum e consistente que ajude a correlacionar eventos entre sistemas. O método padrão de acompanhamento da integridade e do status de recursos do Azure é o uso do Diagnóstico do Azure e Application Insights. O Azure Monitor também fornece monitoramento e gerenciamento centralizados para soluções híbridas ou de nuvem.

Agregue e correlacione os logs e métricas. Um sistema de telemetria instrumentado corretamente fornece uma grande quantidade de dados de desempenho brutos e logs de eventos. Certifique-se de que o seu sistema processe e correlacione dados de telemetria e de log rapidamente para que a equipe de operações sempre tenha uma visão atualizada da integridade do sistema. Organize e exiba dados para que você tenha uma visão coesa dos problemas e possa ver quando os eventos estão relacionados uns aos outros.

Consulte sua política de retenção da empresa para requisitos de como processar dados e por quanto tempo eles devem ser armazenados.

Implemente notificações e alertas automatizados. Configure ferramentas de monitoramento como o Monitor para detectar padrões ou condições que indiquem problemas potenciais ou atuais. Envie alertas para os membros da equipe que possam resolver os problemas. Ajuste os alertas para evitar falsos positivos.

Monitore ativos e recursos quanto à expiração. Alguns recursos e ativos, como certificados, expiram. Controle quais ativos expiram, quando eles expiram e quais serviços ou recursos dependem deles. Use processos automatizados para monitorar esses ativos. Notifique a sua equipe de operações antes da expiração de um ativo e escale a situação se a expiração ameaça interromper aplicativos.

Gerenciamento

Automatize as tarefas de operações. Manipular processos de operações repetitivas manualmente é propenso a erros. Automatize essas tarefas sempre que possível para garantir qualidade e uma execução consistente. Use o controle do código-fonte para realizar controle de versão do código que implementa a automação. Assim como acontece com qualquer outro código, teste suas ferramentas de automação.

Adote uma abordagem de infraestrutura como código para provisionamento. Minimize a quantidade de configuração manual que você precisa para provisionar recursos. Em vez disso, use scripts e modelos do Azure Resource Manager. Mantenha os scripts e modelos no controle do código-fonte, bem como qualquer outro código que você mantenha.

Considere o uso de contêineres. Contêineres fornecem uma interface baseada em pacote padrão para implantar aplicativos. Ao usar contêineres, você implanta um aplicativo usando pacotes autossuficientes que incluem os softwares, dependências e arquivos que você precisa para executá-lo. Essa prática simplifica muito o processo de implantação.

Contêineres também criam uma camada de abstração entre um aplicativo e o sistema operacional subjacente, o que proporciona consistência entre ambientes. Essa abstração também pode isolar um contêiner de outros processos ou aplicativos executados em um host.

Implemente resiliência e autorrecuperação. A resiliência é a capacidade de um aplicativo se recuperar de falhas. Estratégias para garantir a resiliência incluem fazer novas tentativas em caso de falhas temporárias e fazer failover para uma instância secundária ou até mesmo para outra região. Para saber mais, confira Criar aplicativos confiáveis do Azure. Instrumente seus aplicativos para relatar problemas imediatamente para que você possa gerenciar interrupções ou outras falhas de sistema.

Tenha um manual de operações. Um manual de operações ou runbook documenta os procedimentos e as informações de gerenciamento que você precisa para a equipe de operações manter um sistema. Documente também quaisquer cenários de operações e planos de mitigação que possam surgir durante uma falha ou outra interrupção do seu serviço. Crie essa documentação durante o seu processo de desenvolvimento e mantenha-a atualizada daí em diante. Trate esses recursos como documentos dinâmicos que você precisa examinar, testar e melhorar regularmente.

Documentação compartilhada é algo essencial. Incentivamos que os membros da equipe contribuam e compartilhem conhecimento. Sua equipe inteira deve ter acesso a documentos. Torna mais fácil para qualquer pessoa da equipe ajudar a manter os documentos atualizados.

Documente procedimentos de permanência. Documento procedimentos, agendas e tarefas de permanência e compartilhe-os com todos os membros da equipe. Sempre mantenha essas informações atualizadas.

Documente procedimentos de escalonamento para dependências de terceiros. Se o aplicativo depende de serviços de terceiros externos que você não controla diretamente, você precisa ter um plano para lidar com interrupções. Crie documentação para seus processos de mitigação planejados. Inclua contatos de suporte e caminhos de escalonamento.

Use gerenciamento de configuração. Planeje alterações de configuração, torne-as visíveis para as operações e registre-as. Você pode usar um banco de dados de gerenciamento de configuração ou uma abordagem de configuração como código para essas finalidades. Audite a configuração regularmente para garantir que as configurações esperadas estejam realmente em vigor.

Obtenha um plano de suporte do Azure e entenda o processo de suporte. O Azure oferece diversos planos de suporte. Determine o plano certo para suas necessidades e verifique se toda a sua equipe sabe como usá-lo. Os membros da equipe devem entender os detalhes do plano, como funciona o processo de suporte e como abrir um tíquete de suporte com o Azure. Se você espera ter um evento de grande escala, o suporte do Azure pode ajudar a aumentar os limites do serviço. Para obter mais informações, consulte Perguntas frequentes dos planos de suporte do Azure.

Siga os princípios de privilégios mínimos ao conceder acesso aos recursos. Gerencie o acesso aos recursos cuidadosamente. Negue o acesso por padrão, a menos que você dê explicitamente a um usuário acesso a um recurso. Conceda aos usuários acesso apenas ao que eles precisam para concluir suas tarefas. Acompanhe as permissões de usuário e realize auditorias de segurança frequentes.

Usar o controle de acesso baseado em função do Azure. Atribuir contas de usuário e acesso a recursos não deve ser um processo manual. Use o RBAC (controle de acesso baseado em função) do Azure para conceder acesso com base em identidades e grupos do Microsoft Entra ID.

Usar um sistema de acompanhamento de bugs para acompanhar problemas. Sem uma boa maneira de acompanhar problemas, é fácil deixar itens passarem despercebidos, duplicar o trabalho ou introduzir novos problemas. Não confie na comunicação informal para acompanhar o status de bugs. Use uma ferramenta de acompanhamento de bugs para registrar detalhes sobre problemas, atribuir recursos para solucioná-los e fornecer um log de auditoria de progresso e status.

Gerencie todos os recursos em um sistema de gerenciamento de alterações. Se você incluir todos os aspectos do processo de DevOps em um sistema de gerenciamento e de controle de versão, você pode acompanhar e auditar as alterações facilmente. Inclua código, infraestrutura, configuração, documentação e scripts. Trate todos esses tipos de recursos como código durante o processo de teste, build e revisão.

Use listas de verificação. Listas de verificação de operações podem ajudá-lo a seguir processos. É fácil ignorar alguma coisa em um manual grande, mas seguir uma lista de verificação pode forçar a atenção a detalhes que poderiam, de outra maneira, passar despercebidos. Mantenha as listas de verificação e procure continuamente maneiras de automatizar tarefas e simplificar processos.

Próximas etapas