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 |
---|---|
|
|
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.
- O Cloud Source Repositories [Guia de início rápido] fornece um fluxo de trabalho sem custos financeiros do Git para seu código-fonte.
- O Artifact Registry [Contêineres] [Pacotes Java] é um ótimo lugar para manter seus artefatos Java criados.
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:
- DependaBot do GitHub (em inglês)
- Whitesource RenovateBot
- Snyk (em inglês)
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.