Práticas recomendadas para Java

Manter os aplicativos atualizados se tornou importante e difícil. Neste documento, você verá algumas etapas básicas para desenvolvedores Java começarem a usar as práticas de DevOps. Esta lista apresenta alguns exemplos. A maioria dessas ideias vem de estudos da pesquisa e avaliação de DevOps DORA, que apresentam uma visão geral mais completa das práticas recomendadas. Outras fontes incluem Accelerate: the Science of Lean Software and DevOps: Build and Scaling High Performing Technology Organizations da PhD Nicole Forsgren, Jez Humble e Gene Kim, bem como Software Engineering at Google com curadoria da Titus Winters, Tom Manshreck e Hyrum wright

Antes de ler esta página, recomendamos que você consulte Como configurar um ambiente de desenvolvimento em Java.

Cada necessidade da organização de desenvolvimento é única, mas é possível construir um sistema básico usando uma das seguintes pilhas de tecnologia:

Exemplo de pilha de tecnologia 1 Exemplo de pilha de tecnologia 2
  • Cloud Source Repositories, GitHub ou Bitbucket para código-fonte.
  • Whitesource RenovateBot para manter artefatos e bibliotecas atualizados.
  • Teste de unidades / pré-envio do Cloud Build
  • Teste de integração do Cloud Build
  • Cloud Build para implantação
  • GitHub para código-fonte
  • GitHub Dependabot para manter artefatos e bibliotecas atualizados.
  • Ações do GitHub para testes de pré-envio
  • Ações do GitHub para testes de integração
  • Ações do GitHub para implantação

Um sistema simples criado com esses componentes permite que você melhore a qualidade e o tempo do ciclo. Com ele, também é possível manter seu código atualizado facilmente com as correções de bugs e as atualizações de segurança mais recentes.

Controle de versões

Uma pesquisa (página 17, página 14, página 31 e página 60) mostrou que o controle de versões do código-fonte combinado com a automação e os testes prevê uma qualidade melhor e muitos outros benefícios.

GitHub, Gitlab e Bitbucket também são boas opções para seu código-fonte.

Testes automatizados

A maioria das técnicas é essencial para o sucesso do teste contínuo. Para mais ideias sobre práticas recomendadas de testes, consulte o capítulo SRE Testing for Reliability e o blog de testes do Google.

Os desenvolvedores de Java se preocupam principalmente com testes de unidade automatizadas e de integração. JUnit, Testes com Spring, Apache Maven Surefire e Testes em Java do Gradle são recursos úteis para desenvolvedores Java.

Integração contínua / automação da implantação

A integração contínua e a automação de implantação potencializam jobs modernos de DevOps. Criação, teste e implantação.

  • O Cloud Build [Guias de início rápido] [Específico em Java] [Implantação] [Acionador] oferece um sistema de compilação sem custos financeiros (120 minutos de build / dia) ou um sistema de baixo custo e fácil de usar que pode ser facilmente personalizado para a maioria dos jobs.
  • O Tekton é um projeto de código aberto que permite adaptar facilmente as ideias do Cloud Build aos sistemas.
  • O Spinnaker é uma plataforma de entrega contínua de código aberto e compatível com várias nuvens. Ele ajuda você a lançar alterações de software com alta velocidade e segurança. Ele também ajuda a gerenciar o processo de lançamento e reversão de sistemas de software complexos.
  • As ações do GitHub são uma solução de terceiros que permite configurar facilmente os testes e executá-los no GitHub.
  • Há também muitas outras soluções, como Gitlab, Circle CI e Travis CI.

Bibliotecas de cliente do Cloud

Há muitas maneiras de usar os Serviços do Google, mas a melhor maneira é seguir as instruções na página Bibliotecas de cliente do Cloud. Para Java, a Libraries-BOM ajuda a garantir o uso de versões compatíveis de cada artefato.

Se você escolher suas próprias versões das bibliotecas de cliente, é possível que um artefato incompatível seja selecionado. Isso é conhecido como problema de dependência de diamante. Se você ainda precisar escolher suas bibliotecas individuais, atualize-as uma de cada vez e teste se a atualização introduziu um erro. As versões mais recentes estão sempre listadas nesta página ou podem ser encontradas pesquisando o Maven-Central.

Manter dependências atuais

Para se proteger contra atores mal-intencionados, é fundamental manter suas dependências atualizadas. Há muitas ferramentas de terceiros que ajudam você com isso:

Essas ferramentas, quando configuradas corretamente, ajudam você a manter as dependências atualizadas. Quando você combina testes automatizados e integração / implantação contínuas, o fluxo se torna:

  • A automação de dependências propõe uma mudança no controle de origem.
  • O sistema de compilação contínua cria e testa a mudança.
  • Uma pessoa analisa a proposta e, se aceitável, aceita a alteração, possivelmente com outras alterações.
  • Depois que as alterações são aceitas, uma proposta é feita ao sistema de entrega contínua para liberar o código para produção. Ou seu processo personalizado é seguido.

Usar um Java Runtime Environment (JRE) compatível

O JRE, um subconjunto do Kit de Desenvolvimento Java, fica acima do sistema operacional e fornece o software e os recursos necessários para executar um aplicativo Java. A maioria dos usuários prefere usar a versão LTS mais recente na produção para que eles tenham acesso a atualizações, segurança e correções de bugs. Em geral, é possível atualizar para um JRE posterior, mesmo que o código seja compilado com um JDK anterior.

Se você trabalha com várias versões do JDK, o SDKMAN! ajuda a usar e gerenciar diferentes versões do JDK.

Como usar contêineres (Google Kubernetes Engine, Cloud Run, clusters do Anthos)

Se você usa contêineres do Docker com RenovateBot ou DependaBot, o bot propõe periodicamente atualizações para seu JRE e seu JDK. Recomendamos manter o JDK e o JRE na mesma versão.

Também recomendamos o uso do Jib para colocar seus aplicativos Java em um contêiner na maioria das circunstâncias.

Se você atualizar manualmente seu Dockerfile, basta alterar o JRE para a versão mais recente e recriar.

Como usar o Compute Engine

Isso costuma ser muito específico para cada aplicativo. Recomendamos usar um script de inicialização. Para fazer upgrade, você precisa atualizar o script.

Ambiente flexível do App Engine

Compatível apenas com o Java 8.

Ambiente padrão do App Engine

Consulte Como migrar seu aplicativo do App Engine do Java 8 para o Java 11.

Usar uma versão LTS do Kit de desenvolvimento Java

O JDK é um conjunto de ferramentas para desenvolvimento de aplicativos Java. Novos recursos de linguagem estão vinculados a um JDK específico. Recomendamos fixar seu uso em um JDK com suporte de longo prazo (LTS), fazendo upgrade para a próxima versão LTS, quando apropriado para seu aplicativo. Recomendamos que você use a versão secundária mais recente da versão principal LTS fixada.

A maioria dos usuários quer manter o JDK e o JRE sincronizados. Às vezes, isso não é possível (por exemplo, quando o JDK não é mais compatível), e você precisa compilar com um JDK posterior e executá-lo em um JRE anterior.

Para fazer isso com o Maven, siga estas etapas:

Defina o nível de linguagem desejado e o JRE de destino. Atualize seu arquivo pom.xml da seguinte maneira (para Java 8): xml <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target>

Para atualizar para o Java 11, mude para:

    <maven.compiler.source>11</maven.compiler.source>
    <maven.compiler.target>11</maven.compiler.target>

Se você usa o Gradle, atualize o arquivo build.gradle para Java 8 com:

compileJava {
  sourceCompatibility = 1.8
  targetCompatibility = 1.8
}

Ou para Java 11:

compileJava {
  sourceCompatibility = 11
  targetCompatibility = 11
}

Para o Java 8 e versões anteriores, as versões tinham um prefixo 1. (1.7 para Java 7 e 1.8 para Java 8) que foi descartado após o Java 8.