Lista de verificação de DevOps

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

Cultura

Garanta o alinhamento de negócios entre organizações e equipes. Conflitos sobre recursos, propósito, metas e prioridades dentro de uma organização podem ser um risco para operações bem-sucedidas. Certifique-se de que as equipes de negócios, desenvolvimento e operações estejam alinhadas.

Certifique-se de que a sua equipa compreende o ciclo de vida do seu software. Sua equipe precisa entender o ciclo de vida geral de seus aplicativos e onde cada aplicativo está dentro desse ciclo de vida. Ter essas informações ajuda todos os membros da equipe a saber o que devem fazer agora e para o que devem planejar e se preparar no futuro.

Reduza o tempo de ciclo. Procure minimizar o tempo que demora a passar de ideias para software desenvolvido utilizável. Limite o tamanho e o escopo de liberações individuais para manter a carga de teste baixa. Automatize os processos de compilação, teste, configuração e implantação sempre que possível. Elimine quaisquer obstáculos à comunicação entre desenvolvedores e entre desenvolvedores e equipes de operações.

Rever e melhorar processos. Os seus processos e procedimentos, tanto automatizados como manuais, nunca são definitivos. Configure revisões regulares dos fluxos de trabalho, procedimentos e documentação atuais, com o objetivo de melhoria contínua.

Faça um planejamento proativo. Planeje proativamente o fracasso. Tenha processos implementados para identificar rapidamente os problemas quando eles ocorrerem, encaminhar os problemas para os membros corretos da equipe corrigirem e confirmar sua resolução.

Aprenda com os fracassos. Os fracassos são inevitáveis, mas é importante aprender com os fracassos para evitar repeti-los. Se ocorrer uma falha operacional, faça a triagem do problema, documente a causa e a solução e compartilhe as lições aprendidas. Sempre que possível, atualize seus processos de compilação para detetar automaticamente tais falhas no futuro.

Otimize para velocidade e colete dados. Toda melhoria planejada é uma hipótese. Trabalhe nos menores incrementos possíveis. Trate novas ideias como experiências. Instrumente os experimentos para que você possa coletar dados de produção para avaliar a eficácia do experimento. Esteja pronto para falhar rapidamente se a hipótese estiver errada.

Reserve tempo para aprender. Os fracassos e os sucessos proporcionam oportunidades de aprendizagem. Antes de avançar para novos projetos, reserve tempo para reunir lições importantes e certifique-se de que sua equipe absorva essas lições. Também dê tempo à sua equipe para desenvolver habilidades, experimentar e aprender sobre novas ferramentas e técnicas.

Operações documentais. Documente todas as ferramentas, processos e tarefas automatizadas com o mesmo nível de qualidade que o código do seu produto. Documente o design e a arquitetura atuais de todos os sistemas suportados, juntamente com os processos de recuperação e outros procedimentos de manutenção. Concentre-se nas etapas que você realmente faz, não nos processos teoricamente ideais. Reveja e atualize regularmente a sua documentação. Para código, certifique-se de incluir comentários significativos, especialmente em APIs públicas. Use ferramentas para gerar documentação de código automaticamente sempre que possível.

Partilhe conhecimento. A documentação só é útil se as pessoas souberem que ela existe e puderem encontrá-la. Mantenha a sua documentação organizada e torne-a facilmente detetável. Seja criativo: use bolsas marrons (apresentações informais), vídeos ou boletins informativos para compartilhar conhecimento.

Desenvolvimento

Forneça aos desenvolvedores ambientes semelhantes aos de produção. 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óximo possível do seu ambiente de produção. Certifique-se de que os dados de teste são consistentes com os dados que você usa na produção, mesmo que sejam dados de amostra e não dados reais de produção (por motivos de privacidade ou conformidade). Planeje gerar e anonimizar dados de teste de amostra.

Certifique-se de que todos os membros autorizados da equipe possam provisionar a infraestrutura e implantar aplicativos. Configurar recursos semelhantes aos de produção e implantar um aplicativo não deve envolver tarefas manuais complicadas ou conhecimento técnico detalhado de um sistema. Qualquer pessoa com as permissões certas deve ser capaz de criar ou implantar recursos semelhantes aos de produção sem ir à sua equipe de operações.

Essa recomendação não implica que qualquer pessoa possa enviar atualizações em tempo real para uma implantação de produção. Trata-se de reduzir o atrito para que as equipes de desenvolvimento e controle de qualidade criem ambientes semelhantes aos da produção.

Instrumente cada aplicação para obter informações. Para entender a integridade de seus aplicativos, você precisa saber como eles funcionam e se eles apresentam erros ou problemas. Sempre inclua a instrumentação como um requisito de projeto e crie instrumentação em cada aplicativo desde o início. A instrumentação deve incluir o log de eventos para análise de causa raiz, mas também telemetria e métricas para monitorar a integridade e o uso de cada aplicativo.

Acompanhe a sua dívida técnica. Muitos projetos priorizam cronogramas de lançamento em vez da qualidade do código em um grau ou outro. Sempre documente quando atalhos são usados ou outras implementações subótimas e agende um horário para revisitar esses problemas.

Considere enviar atualizações diretamente para a produção. Para reduzir o tempo geral do ciclo de lançamento, considere enviar confirmações de código devidamente testadas diretamente para a produção. Use alternâncias de recursos para controlar quais recursos você habilita. Em seguida, você pode passar rapidamente do desenvolvimento para o lançamento usando as alternâncias para habilitar ou desabilitar recursos. As alternâncias também são úteis quando você executa testes como canary releases, onde você implanta um recurso específico em um subconjunto do seu ambiente de produção.

Testar

Automatize os testes. Testar manualmente o software é tedioso e suscetível a erros. Automatize tarefas de teste comuns e integre os testes em seus processos de compilação. Os testes automatizados garantem uma cobertura e reprodutibilidade consistentes dos testes. 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 ajudá-lo a configurar e executar testes. Para obter mais informações, consulte Desenvolver e testar no Azure.

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

Testar na produção. Um processo de liberação não termina com a implantação na produção. Tenha testes para garantir que o código implantado funcione conforme o esperado. Para implantações que você atualiza com pouca frequência, agende testes de produção como parte regular da manutenção.

Automatize os testes de desempenho para identificar problemas de desempenho antecipadamente. O impacto de um problema sério de desempenho pode ser tão grave quanto um bug no código. Embora os testes funcionais automatizados possam evitar bugs de aplicativos, esses testes podem não detetar 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 liberação para garantir que seu aplicativo atenda a essas metas.

Execute testes de capacidade. Um aplicativo pode funcionar bem em condições de teste e, em seguida, ter problemas na produção devido a limitações de escala ou recursos. Defina sempre a capacidade máxima esperada e os limites de utilização. Teste para certificar-se de que o aplicativo pode lidar com esses limites, mas também teste o que acontece quando você excede esses limites. Faça testes de capacidade em intervalos regulares.

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

Execute testes automatizados de penetração de segurança. Garantir a segurança do seu aplicativo é tão importante quanto testar qualquer outra funcionalidade. Faça do teste de penetração automatizado uma parte padrão do seu processo de compilação e implantação. Agende testes de segurança regulares e verificação de vulnerabilidades em aplicativos implantados, monitorando portas abertas, endpoints e ataques. Os testes automatizados não eliminam a necessidade de análises de segurança aprofundadas em intervalos regulares.

Execute testes automatizados de continuidade de negócios. Desenvolva testes para continuidade de negócios em larga escala, incluindo recuperação de backup e failover. Configure processos automatizados para realizar esses testes regularmente.

Versão

Automatize implantações. A automação oferece muitos benefícios, incluindo:

  • Permitindo implantações mais rápidas e confiáveis.
  • Garantir implantações consistentes em qualquer ambiente suportado, incluindo teste, preparo e produção.
  • Removendo o risco de erro humano que as implantações manuais podem introduzir.
  • Facilitando o agendamento de lançamentos para horários convenientes, o que minimiza quaisquer efeitos de possíveis períodos de inatividade.

Automatize o processo de implantação de cada aplicativo em seus ambientes de teste, preparação e produção. Tenha sistemas instalados para detetar quaisquer problemas durante a implementação e tenha uma maneira automatizada de reverter correções ou alterações revertidas.

Use a integração contínua. A integração contínua (CI) é a prática de mesclar todo o código do desenvolvedor em uma base de código central em um cronograma regular e, em seguida, executar automaticamente processos de compilação e teste padrão. A CI garante que uma equipe inteira possa trabalhar em uma base de código ao mesmo tempo 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 toda vez que você confirmar ou fazer check-in de código. Deve funcionar pelo menos uma vez por dia.

Considere a adoção de um modelo de desenvolvimento baseado em tronco. Nesse modelo, os desenvolvedores se comprometem com uma única ramificação (o tronco). Há um requisito que compromete nunca quebrar uma compilação. Esse modelo facilita a CI, porque você faz todo o trabalho de recurso no tronco e resolve quaisquer conflitos de mesclagem quando cada confirmação acontece.

Considere o uso de entrega contínua. A entrega contínua (CD) é a prática de garantir que o código esteja sempre pronto para ser implantado, criando, testando e implantando automaticamente o código em ambientes semelhantes aos de produção. Adicionar CD para criar um pipeline de CI/CD completo ajuda a detetar defeitos de código o mais rápido possível. Ele também garante que você possa lançar atualizações devidamente testadas em um curto espaço de tempo.

A implantação contínua é um processo que pega automaticamente todas as atualizações que passaram por um pipeline de CI/CD e as implanta na produção. A implantação contínua requer testes automáticos robustos e planejamento avançado de processos. Pode não ser apropriado para todas as equipas.

Faça pequenas alterações incrementais. Grandes alterações de código têm um potencial maior para introduzir bugs do que as menores. Sempre que possível, mantenha as alterações pequenas. Isso limita os efeitos potenciais de cada alteração e simplifica a tarefa de entender e depurar problemas.

Controlar a exposição a alterações. Certifique-se de que controla quando as atualizações se tornam visíveis para os utilizadores finais. Considere o uso de alternâncias de recursos para controlar quando você ativa recursos para usuários finais.

Implemente estratégias de gerenciamento de versão para reduzir o risco de implantação. Implantar uma atualização de aplicativo na produção sempre implica algum risco. Para minimizar esse risco, use estratégias como versões canárias ou implantações azuis/verdes para implantar atualizações em um subconjunto de usuários. Confirme se cada atualização funciona conforme o esperado e, em seguida, distribua cada atualização para o resto do sistema.

Documente todas as alterações. Pequenas atualizações e alterações de configuração podem ser uma fonte de confusão e conflito de versão. Mantenha sempre um registo claro de quaisquer alterações, por mais pequenas que sejam. Registre tudo o que for alterado, incluindo patches aplicados, alterações de política e alterações de configuração. O registo das alterações deve estar visível para toda a sua equipa. Mas não inclua dados confidenciais nesses logs. Por exemplo, registre se 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 baseia-se no princípio de que você não deve modificar a infraestrutura depois de implantá-la na produção. Caso contrário, você pode entrar em um estado em que mudanças ad hoc foram aplicadas, tornando difícil saber exatamente o que mudou. A infraestrutura imutável funciona substituindo servidores inteiros como parte de qualquer nova implantação. Com essa abordagem, você pode testar e implantar seu código e seu ambiente de hospedagem como um bloco. Após a implantação, você não modifica os componentes de infraestrutura até o próximo ciclo de compilação e implantação.

Monitorização

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

Agregue e correlacione logs e métricas. Um sistema de telemetria devidamente instrumentado fornece uma grande quantidade de dados brutos de desempenho e logs de eventos. Certifique-se de que seu sistema processa e correlaciona dados de telemetria e log rapidamente, para que a equipe de operações sempre tenha uma imagem 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 entre si.

Consulte sua política de retenção corporativa para obter os requisitos sobre como processar dados e por quanto tempo armazená-los.

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

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

Gestão

Automatize as tarefas de operações. A manipulação manual de processos de operações repetitivas é propensa a erros. Automatize essas tarefas sempre que possível para garantir uma execução e qualidade consistentes. Use o controle do código-fonte para o código de versão que implementa a automação. Como 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 necessária 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, como qualquer outro código que você mantém.

Considere o uso de contêineres. Os contêineres fornecem uma interface padrão baseada em pacotes para a implantação de aplicativos. Ao usar contêineres, você implanta um aplicativo usando pacotes autônomos que incluem qualquer software, dependências e arquivos necessários para executar o aplicativo. Essa prática simplifica muito o processo de implantação.

Os contêineres também criam uma camada de abstração entre um aplicativo e o sistema operacional subjacente, que fornece 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. Resiliência é a capacidade de um aplicativo se recuperar de falhas. As estratégias de resiliência incluem a repetição de falhas transitórias e o failover para uma instância secundária ou até mesmo para outra região. Para obter mais informações, consulte Projetar aplicativos confiáveis do Azure. Instrumente seus aplicativos para relatar problemas imediatamente para que você possa gerenciar interrupções ou outras falhas do sistema.

Tenha um manual de operações. Um manual de operações, ou runbook, documenta os procedimentos e as informações de gerenciamento de 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 entrar em ação durante uma falha ou outra interrupção no seu serviço. Crie esta documentação durante o processo de desenvolvimento e mantenha-a atualizada posteriormente. Trate esses recursos como documentos vivos que você precisa revisar, testar e melhorar regularmente.

A documentação compartilhada é fundamental. Incentive os membros da equipe a contribuir e compartilhar conhecimento. Toda a sua equipa deve ter acesso aos documentos. Torne mais fácil para qualquer pessoa da equipa ajudar a manter os documentos atualizados.

Documentar procedimentos de permanência. Certifique-se de documentar as tarefas, agendas e procedimentos de plantão e compartilhá-los com todos os membros da equipe. Mantenha sempre esta informação atualizada.

Documente procedimentos de escalonamento para dependências de terceiros. Se seu aplicativo depende de serviços externos de terceiros que você não controla diretamente, você precisa de 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 o 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 esses fins. 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 muitos planos de suporte. Determine o plano certo para suas necessidades e certifique-se de que toda a sua equipe saiba como usar o plano. 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ê estiver esperando um evento de alta escala, o suporte do Azure pode ajudá-lo a aumentar seus limites de serviço. Para obter mais informações, consulte Perguntas frequentes sobre planos de suporte do Azure.

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

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

Use um sistema de rastreamento de bugs para rastrear problemas. Sem uma boa maneira de rastrear problemas, é fácil perder itens, duplicar trabalho ou introduzir novos problemas. Não confie na comunicação informal pessoa a pessoa para rastrear o status de bugs. Use uma ferramenta de rastreamento de bugs para registrar detalhes sobre problemas, atribuir recursos para resolvê-los e fornecer uma trilha de auditoria de progresso e status.

Gerencie todos os recursos em um sistema de gerenciamento de mudanças. Se você incluir todos os aspetos do seu processo de DevOps em um sistema de gerenciamento e controle de versão, poderá facilmente controlar e auditar as alterações. Inclua código, infraestrutura, configuração, documentação e scripts. Trate todos esses tipos de recursos como código durante todo o processo de teste, criação e revisão.

Use listas de verificação. As listas de verificação de operações podem ajudá-lo a seguir os processos. É fácil perder algo em um manual grande, mas seguir uma lista de verificação pode forçar a atenção para detalhes que, de outra forma, você poderia ignorar. Mantenha as listas de verificação e procure continuamente maneiras de automatizar tarefas e simplificar processos.

Próximos passos