You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: docs/03-devops/continuousIntegration.md
+71-1Lines changed: 71 additions & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -10,13 +10,83 @@ has_children: false
10
10
11
11
Una delle pratiche fondamentali del *DevOps* è la *Continuous Integration*. Essa ha l'obiettivo di integrare continuamente il codice con la linea principale di sviluppo in modo da individuare tempestivamente i problemi di integrazione e migliorare la qualità del software consentendo un processo di sviluppo più rapido ed affidabile.
12
12
13
-
Di seguito verranno presentati i *workflows* di *Continuous Integration* progettati mediante l'utilizzo di *GitHub Actions*. Successivamente verranno invece descritte maggiormente in dettaglio le *GitHub Actions* sviluppate dal team.
13
+
Di seguito verranno presentati i *workflows* di *Continuous Integration* progettati mediante l'utilizzo di *GitHub Actions*. Successivamente verranno invece descritte maggiormente in dettaglio le *GitHub Actions* sviluppate dal team ed infine verrà offerta una panoramica sugli strumenti utilizzati per l'*Automatic Dependency Update*.
14
14
15
15
Sono stati progettati quattro *workflows* principali: uno valido per i microservizi dell'*Application layer*, uno per la gestione della *Centralina di zona*, uno per la validazione dei modelli dei *Digital Twins* ed infine uno per la *verifica* e il *deploy* dell'*Azure Function* sviluppata.
16
16
17
+
## Application layer
18
+
17
19
Il primo *workflow* è stato sviluppato a supporto dei microservizi dell'*Application layer* ed è illustrato in <ahref="#microserviceWorkflow">Figura 1</a>.
20
+
Il *workflow* viene eseguito ogniqualvolta viene effettuato un *push* o una *pull request*.
21
+
I *job* che vengono eseguiti sono i seguenti:
22
+
23
+
1.*validation*: per prima cosa viene validato il *wrapper* di *Gradle* al fine di verificare che esso sia un *wrapper* valido e riconosciuto e non parte di un qualche attacco di *supply chain*.
24
+
2.*build*: dopo che il *job**validation* è passato, viene eseguita la *build* del microservizio. Essa consiste nell'esecuzione dei test e dei controlli di qualità del codice su tutte le combinazioni di diversi sistemi operativi e diverse versioni del linguaggio utilizzato al fine di assicurare il corretto funzionamento sulle piattaforme d'interesse.
25
+
Infine viene caricata la coverage, calcolata tramite *JaCoCo* come anticipato, sul tool cloud-based *[Codecov](https://about.codecov.io/)*.
26
+
3.*release-and-delivery*: dopo che la *build* viene completata con successo, se il *workflow* ha accesso ai segreti (quindi solo nel caso di *push* sulla *repository* originale) viene eseguita la *release* su *GitHub Release* e il *delivery* su *GitHub Packages* del microservizio stesso. Questo viene effettuato sfruttando la *GitHub Action***release-and-delivery-action** sviluppata dal team e descritta in seguito.
27
+
4.*documentation-deploy*: ogniqualvolta viene rilasciata una nuova versione del software viene eseguito il *job documentation-deploy* il quale si occupa del *deploy* della documentazione scritta per il microservizio. In particolare, si utilizza una *GitHub Action* sviluppata dal team, **documentation-ghp-action**, descritta in seguito.
28
+
5.*success*: esso è un *job* di *utility* progettato per verificare che tutti i *job* del *workflow* siano stati eseguiti con successo. Esso viene utilizzato ad esempio nelle politiche di *Branch protection* impostate e da *tools* come *Mergify*.
Il secondo *workflow* è stato sviluppato a supporto della Centralina di zona - Arduino Mega 2560 - ed è illustrato in <ahref="#roomControlUnitWorkflow">Figura 2</a>.
37
+
Il *workflow* viene eseguito ogniqualvolta viene effettuato un *push* o una *pull request*.
38
+
I *job* che vengono eseguiti sono i seguenti:
39
+
40
+
1.*build*: per prima cosa viene verificata la corretta *compilazione* del progetto *Arduino*.
41
+
2.*release*: dopo che il *job* di *build* è stato completato con successo, se il *workflow* ha accesso ai segreti (quindi solo nel caso di *push* sulla *repository* originale), viene eseguita la *release* su *GitHub Release*. Per semplicità, in questo caso si è sfruttato direttamente il bot *[Semantic Release](https://github.com/semantic-release/semantic-release)*.
42
+
3.*success*: esso è un *job* di *utility* progettato per verificare che tutti i *job* del *workflow* siano stati eseguiti con successo. Esso viene utilizzato ad esempio nelle politiche di *Branch protection* impostate e da *tools* come *Mergify*.
43
+
44
+
<divalign="center">
45
+
<imgid="roomControlUnitWorkflow"src="imgs/roomControlUnitWorkflow.png"alt="Room Control Unit Workflow">
46
+
</div>
47
+
48
+
## Digital Twins
49
+
50
+
Il terzo *workflow* è stato sviluppato a supporto dei modelli *Digital Twins* modellati tramite il linguaggio *Digital Twins Definition Language* (*DTDL*).
51
+
In questo *workflow* è presente un singolo *job* - *validate* -, eseguito ogniqualvolta viene eseguito il *push* o una *pull request*, il quale, tramite l'ausilio della *GitHub Action***dtdl-validator-action**, sviluppata dal team, verifica la validità dei modelli *DTDL* sviluppati.
52
+
53
+
## Azure Function
54
+
55
+
Il quarto *workflow* è stato sviluppato a supporto della *Azure Function* appartenente al *Digital Twins layer* ed è illustrato in <ahref="#azureFunctionWorkflow">Figura 3</a>.
56
+
Il *workflow* viene eseguito ogniqualvolta viene effettuato un *push* o una *pull request*.
57
+
I *job* che vengono eseguiti sono i seguenti:
58
+
59
+
1.*build-and-deploy*: per prima cosa viene effettuata la *build* della funzione e, se ha successo e se il *workflow* ha accesso ai segreti (quindi solo nel caso di *push* sulla *repository* originale) viene eseguito il *deploy* di essa sul servizio *Azure Function*.
60
+
2.*release*: dopo che il *job* di *build-and-deploy* è stato completato con successo, se il *workflow* ha accesso ai segreti (quindi solo nel caso di *push* sulla *repository* originale), viene eseguita la *release* su *GitHub Release*. Per semplicità, in questo caso si è sfruttato direttamente il bot *[Semantic Release](https://github.com/semantic-release/semantic-release)*.
61
+
3.*success*: esso è un *job* di *utility* progettato per verificare che tutti i *job* del *workflow* siano stati eseguiti con successo. Esso viene utilizzato ad esempio nelle politiche di *Branch protection* impostate e da *tools* come *Mergify*.
62
+
63
+
<divalign="center">
64
+
<imgid="azureFunctionWorkflow"src="imgs/azureFunctionWorkflow.png"alt="Azure Function Workflow">
65
+
</div>
66
+
67
+
## Approfondimento sulle GitHub Actions sviluppate
68
+
69
+
### release-and-delivery-action
70
+
71
+
La *GitHub Action*[`release-and-delivery-action`](https://github.com/SmartOperatingBlock/release-and-delivery-action) è stata sviluppata con lo scopo di agevolare la gestione del processo di release e di delivery di un progetto. Dapprima, l'azione si occupa di effettuare la *release* attraverso l'esecuzione dei comandi definiti in input, successivamente, se la release è stata effettuata, costruisce l'*immagine Docker* con la stessa versione della *release* appena effettuata. Infine ne effettua il delivery su un *Container Registry* fornito in input. Al fine di permettere un utilizzo generico è possibile escludere il processo di *release* ed effettuare solamente la costruzione e il *delivery* dell'*immagine* del container o viceversa.
72
+
73
+
### documentation-ghp-action
74
+
75
+
La *GitHub Action*[`documentation-ghp-action`](https://github.com/SmartOperatingBlock/documentation-ghp-action) è stata sviluppata con lo scopo di agevolare la generazione e la pubblicazione della documentazione dei microservizi. In particolare, vengono messi a disposizione per l'utilizzatore tre tipi di documentazione:
76
+
77
+
-*Documentazione del codice sorgente*: per quanto riguarda la documentazione del codice sorgente, al fine di supportare qualsiasi linguaggio e qualsiasi *documentation engine,* i comandi di generazione vengono specificati in input da parte dell'utilizzatore.
78
+
-*Documentazione delle API REST*: per quanto riguarda la documentazione delle *API REST* si richiede l'adozione della specifica [*OpenAPI*](https://swagger.io/resources/open-api/). In particolare viene richiesto all'utilizzatore di fornire in input il *path* del file in formato *yaml* contenente la documentazione.
79
+
-*Documentazione degli eventi*: per quanto riguarda la documentazione degli eventi si richiede l'adozione della specifica [*AsyncAPI*](https://www.asyncapi.com/). In particolare viene richiesto all'utilizzatore di fornire in input il *path* del file in formato *yaml* contenente la documentazione.
80
+
81
+
Le documentazioni generate vengono pubblicate su un sito web associato alla *repository* tramite il servizio di hosting *GitHub Pages*. Al fine di permettere un utilizzo generico è possibile selezionare quali documentazioni generare.
82
+
83
+
### dtdl-validator-action
84
+
85
+
La *GitHub Action*[`dtdl-validator-action`](https://github.com/SmartOperatingBlock/dtdl-validator-action) è stata sviluppata con lo scopo di permettere la validazione dei modelli dei Digital Twins scritti in *DTDL*. In particolare, essa sfrutta il validatore [*DTDL Validator*](https://github.com/Azure-Samples/DTDL-Validator) sviluppato da *Microsoft*, adattandolo ad un utilizzo in pipeline di Continuous Integration.
86
+
87
+
## Automatic Dependency Update
88
+
89
+
Al fine di automatizzare l'aggiornamento delle dipendenze dei software sviluppati sono stati utilizzati i seguenti bot:
90
+
91
+
-[*Renovate*](https://www.mend.io/renovate/): configurato per creare una *pull request* su un branch ad-hoc ogniqualvolta è presente una nuova versione di una dipendenza utilizzata nel progetto. Al fine di permettere il *DRY* delle configurazioni è stata creata una *repository*[`renovate-config`](https://github.com/AndreaGiulianelli/renovate-config) contenente tutte le configurazioni utilizzate.
92
+
-[*Mergify*](https://mergify.com/): utilizzato per velocizzare ed automatizzare i merge delle *pull request* nel branch di sviluppo principale. Come *merging strategy* è stato impiegato il *rebase*.
0 commit comments