Skip to main content Link Menu Expand (external link) Document Search Copy Copied

Build automation

Una volta definiti i bounded context e l’architettura del progetto, si è proseguito andando a definirene la struttura e l’organizzazione. È stata predisposta un’organizzazione di base su GitHub ed è stata chiamata SmartGreenhouse-22-23. All’interno di questa sono stati predisposti quattro repository principali:

  • ArduinoSensor, che si occupa del sotto-progetto relativo all’implementazione del sotto-dominio sistema di automazione;
  • Server, che si occupa della parte backend del sistema, rappresentando quindi il sotto-dominio greenhouse core;
  • ClientDesktop, che si occupa di implementare il client desktop, facente parte del sotto-dominio client;
  • ClientMobile, che si occupa di implementare il client mobile, facente parte anch’esso del sotto-dominio client.

Tutti i repository, ad eccezione di ArduinoSensor, sono stati strutturati utilizzando il build tool Gradle, il quale è stato pensato per funzionare principalmente su linguaggi Java like.

Grazie a Gradle è stato possibile gestire in modo semplice ed efficace la build automation e quindi le dipendenze ed i plugin, di ogni progetto, ed eventualmente sotto-progetto, anche grazie all’utilizzo del file di configurazione libs.versions.toml.

Struttura multi-progetto

Come detto nella sezione relativa all’design, si è pensato di realizzare il sistema di backend adottando un’architettura a micro-servizi. Per riuscire a realizzare questo tipo di architettura si è scelto di adottare la struttura multi-progetto messa a disposizione da gradle, che fosse il più possibile aderente all’analisi DDD effettuata. Pertanto all’interno del root project, e repository Server, sono stati definiti i seguenti sotto-progetti:

  • brightnessService, il quale rappresenta il micro-servizio relativo alla storicizzazione e il reperimento dei dati del sensore di luminosità;
  • clientCommunicationGateway, il cui compito è quello di rappresentare il micro-servizio incaricato di gestire la comunicazione con i client;
  • common, rappresenta una modulo che racchiude gli elementi comuni relativi ai parametri di una pianta;
  • greenhouseCommunicationGateway, il cui compito è quello di rappresentare il micro-servizio incaricato di gestire la comunicazione con il sistema di automazione;
  • greenhouseService, il quale rappresenta il micro-servizio incaricato della storicizzazione e il reperimento delle informazioni relative alla serra, tra cui la pianta coltivata al suo interno, i range ottimali per i suoi parametri vitali e la modalità attuale di gestione: manuale o automatica. Questo servizio si occupa, inoltre, di analizzare i diversi dati rilevati dai sensori, in modo da individuare eventuali situazioni di allarme e in tal caso stabilire l’operazione correttiva da intraprendere;
  • humidityService, il quale rappresenta il micro-servizio relativo alla storicizzazione e il reperimento dei dati del sensore dell’umidità ambientale;
  • operationService, il quale rappresenta il micro-servizio relativo all’esecuzione, storicizzazione e il reperimento dei dati riguardanti le operazioni eseguite all’interno della serra;
  • soilMoistureService, il quale rappresenta il micro-servizio relativo alla storicizzazione e il reperimento dei dati del sensore dell’umidità del suolo;
  • temperatureService, il quale rappresenta il micro-servizio relativo alla storicizzazione e il reperimento dei dati del sensore della temperatura ambientale;

Task personalizzati

Per ogni progetto e sottoprogetto sono stati creati dei task personalizzati, inseriti all’interno dei relativi file build.gradle.kts. Per eseguire i task basterà eseguire il seguente comando ./gradlew nomeTask, sostituendo nomeTask con il nome del task presente nel progetto.

In particolare per ogni progetto sono stati creati:

  • un task test che a partire dalla root del progetto consentirà di lanciare i test di ogni sottoprogetto. Inoltre, aggiungendo al comando il parametro --parallel tutti i task di test dei sottoprogetti verranno lanciati in parallelo, permettendo di effettuare un test dell’intero progetto molto più velocemente.

  • un task shadowJar, il quale permette di generare il jar per il progetto ed ogni sotto-progetto.

  • un task Jacoco, il quale permette di generare il report della coverage per il sottoprogetto e al fine di aggregare i diversi report, il task JacocoAggregatedReport.