Mantenere aggiornate le applicazioni è diventato importante e difficile. Questo documento fornisce alcuni passaggi di base per consentire agli sviluppatori Java di iniziare a utilizzare le pratiche DevOps. Non si tratta di un elenco esaustivo. La maggior parte di queste idee proviene dagli studi DORA DevOps Research and Assessment, che forniscono una panoramica più completa delle best practice. Altre fonti includono Accelerate: The Science of Lean Software and DevOps: Building and Scaling High Performing Technology Organizations di Nicole Forsgren PhD, Jez Humble e Gene Kim; e Software Engineering at Google curato da Titus Winters, Tom Manshreck e Hyrum Wright.
Prima di leggere questa pagina, ti consigliamo di leggere Configurazione di un ambiente di sviluppo Java.
Le esigenze di ogni organizzazione di sviluppo sono uniche, ma un sistema di base potrebbe essere costruito utilizzando uno dei seguenti stack tecnologici:
| Stack tecnologico di esempio 1 | Sample Tech Stack 2 |
|---|---|
|
|
Un sistema creato con questi componenti può consentirti di migliorare la qualità e il tempo di ciclo. Inoltre, ti consente di mantenere il codice aggiornato con le correzioni di bug e gli aggiornamenti della sicurezza più recenti.
Controllo delle versioni
La ricerca (pagina 17, pagina 14, pagina 31 e pagina 60) ha rilevato che il controllo delle versioni per il codice sorgente, combinato con l'automazione e i test, prevede una migliore qualità e molti altri vantaggi.
- Cloud Source Repositories [Guida rapida] fornisce un flusso di lavoro Git senza costi per il tuo codice sorgente.
- Artifact Registry [Container] [Pacchetti Java] è un ottimo posto per conservare gli artefatti Java creati.
GitHub, Gitlab e Bitbucket sono anche ottimi repository per il tuo codice sorgente.
Test automatici
L'automazione dei test può essere fondamentale per il tuo successo nell'utilizzo della maggior parte di queste tecniche. Per ulteriori riflessioni sulle best practice per i test, consulta il capitolo del libro SRE sui test per l'affidabilità e il blog Google Testing.
Gli sviluppatori Java si occupano principalmente di test delle unità e di integrazione automatizzati. JUnit, Testing with Spring, Apache Maven Surefire e Gradle Java testing sono risorse utili per gli sviluppatori Java.
Automazione dell'integrazione / del deployment continui
L'integrazione continua e l'automazione del deployment sono alla base dei moderni job DevOps. Crea, testa ed esegui il deployment.
- Cloud Build [Guide rapide] [Specifiche per Java] [Deployment] [Trigger] fornisce un sistema di compilazione senza costi (120 minuti di build al giorno) o a basso costo e facile da usare che può essere facilmente personalizzato per la maggior parte dei lavori.
- Tekton è un progetto open source che ti consente di adattare le idee di Cloud Build ai tuoi sistemi.
- Spinnaker è una piattaforma di distribuzione continua open source e multi-cloud che ti aiuta a rilasciare modifiche del software con velocità e affidabilità elevate. Ti aiuta a gestire il processo di rilascio e rollback di sistemi software complessi.
- GitHub Actions è una soluzione di terze parti che ti consente di configurare i test ed eseguirli su GitHub.
- Esistono anche molte altre soluzioni come Gitlab, Circle CI e Travis CI.
Librerie client cloud
Esistono molti modi per utilizzare i servizi Google, ma il modo preferito è seguire le istruzioni riportate nella pagina Librerie client di Cloud. Per Java, la distinta base delle librerie può aiutarti a garantire l'utilizzo di versioni compatibili di ogni artefatto.
Se scegli di selezionare le tue versioni delle librerie client, è possibile che venga selezionato un artefatto incompatibile. Questo problema è noto come problema di dipendenza a diamante. Se devi comunque scegliere le singole librerie, aggiornale una alla volta e verifica se l'aggiornamento ha introdotto un errore. Le versioni più recenti sono sempre elencate in questa pagina o possono essere trovate cercando Maven-Central.
Mantenere aggiornate le dipendenze
Per proteggerti da malintenzionati, è fondamentale mantenere aggiornate le dipendenze. Esistono molti strumenti di terze parti che ti aiutano in questo compito:
Se configurati correttamente, questi strumenti ti aiutano a mantenere aggiornate le tue dipendenze. Quando combini test automatizzati e integrazione continua / distribuzione continua, il flusso diventa:
- L'automazione delle dipendenze propone una modifica al controllo della sorgente.
- Il sistema di compilazione continua compila e testa la modifica.
- Una persona esamina la proposta e, se accettabile, accetta la modifica, possibilmente insieme ad altre modifiche.
- Una volta accettate le modifiche, viene inviata una proposta al sistema di Continuous Delivery per rilasciare il codice in produzione. (o viene seguito il tuo processo personalizzato).
Utilizzare un ambiente Java Runtime Environment (JRE) supportato
JRE, un sottoinsieme del Java Development Kit, si trova sopra il sistema operativo e fornisce il software e le risorse necessari per eseguire un'applicazione Java. La maggior parte degli utenti preferisce utilizzare l'ultima versione LTS in produzione per avere accesso ad aggiornamenti, sicurezza e correzioni di bug. In genere è possibile eseguire l'aggiornamento a una versione successiva di JRE anche se il codice è compilato in base a una versione precedente di JDK.
Se lavori con più versioni di JDK, SDKMAN! può aiutarti a utilizzare e gestire diverse versioni di JDK.
Utilizzo di container (Google Kubernetes Engine, Cloud Run, cluster GKE)
Se utilizzi i container Docker con RenovateBot o DependaBot, il bot propone periodicamente aggiornamenti per JRE e JDK. Ti consigliamo di mantenere JDK e JRE nella stessa versione.
Se aggiorni manualmente il Dockerfile, cambia la JRE con l'ultima versione e ricompila.
Utilizzo di Compute Engine
Di solito è molto specifico per l'applicazione. Ti consigliamo di utilizzare uno script di avvio. Per eseguire l'upgrade, devi aggiornare lo script.
Ambiente flessibile di App Engine
App Engine Standard
Consulta Migrazione dell'app App Engine da Java 8 a Java 11.
Utilizza una versione LTS del Java Development Kit
JDK è un insieme di strumenti per lo sviluppo di applicazioni Java. Le nuove funzionalità del linguaggio sono legate a una JDK specifica. Ti consigliamo di bloccare l'utilizzo di una JDK con supporto a lungo termine (LTS) e di eseguire l'upgrade alla versione LTS successiva quando è appropriato per la tua applicazione. Ti consigliamo di utilizzare l'ultima release secondaria della release LTS principale bloccata.
La maggior parte degli utenti vorrà mantenere sincronizzati JDK e JRE. A volte non è possibile (ad esempio quando la JDK non è più supportata) ed è necessario compilare con una JDK successiva ed eseguire su una JRE precedente.
Per farlo con Maven:
Imposta il livello di linguaggio in cui vuoi programmare e la JRE di destinazione. Aggiorna il file
pom.xml come segue (per Java 8):
xml
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
Per eseguire l'aggiornamento a Java 11, devi modificare il valore in:
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
Se utilizzi Gradle, aggiorna il file build.gradle per Java 8 con:
compileJava {
sourceCompatibility = 1.8
targetCompatibility = 1.8
}
oppure per Java 11:
compileJava {
sourceCompatibility = 11
targetCompatibility = 11
}
Tieni presente che per Java 8 e versioni precedenti, le versioni avevano un prefisso 1. (1.7 per Java
7, 1.8 per Java 8) che è stato eliminato dopo Java 8.