Skip to content

Commit 7955639

Browse files
docs: add workflows description and tools
1 parent 9d48fdd commit 7955639

File tree

3 files changed

+71
-1
lines changed

3 files changed

+71
-1
lines changed

docs/03-devops/continuousIntegration.md

Lines changed: 71 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,83 @@ has_children: false
1010

1111
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.
1212

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*.
1414

1515
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.
1616

17+
## Application layer
18+
1719
Il primo *workflow* è stato sviluppato a supporto dei microservizi dell'*Application layer* ed è illustrato in <a href="#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*.
1829

1930
<div align="center">
2031
<img id="microserviceWorkflow" src="imgs/microserviceWorkflow.png" alt="Microservice Workflow">
2132
</div>
2233

34+
## Centralina di zona
35+
36+
Il secondo *workflow* è stato sviluppato a supporto della Centralina di zona - Arduino Mega 2560 - ed è illustrato in <a href="#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+
<div align="center">
45+
<img id="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 <a href="#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+
<div align="center">
64+
<img id="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*.
6.84 KB
Loading
8.39 KB
Loading

0 commit comments

Comments
 (0)