Issue (criticità) = attività/evento da gestire Tracking = registrare, lasciare delle tracce
Un Issue Tracking System (ITS), detto anche support ticket issue system, gestisce e mantiene una lista di criticità. E’ solitamente usata in un contesto collaborativo.
E’ simile a un bugtracker e vengono spesso usati insieme.
A cosa serve?
Un Work Item è un’attività “atomica” del progetto gestito mediante un workflow e mantenuto in un unico repository.
Un Workflow è l’insieme di stati e transizioni che un Work Item attraversa durante la sua vita. Permette di implementare il processo da seguire per completare un’attività e di definire la relazione tra work item.
Il Version Control System (VCS) gestisce il versionamento offrendo un’informazione univoca del file. Anche detto Source Code Management System (SCM).
- registrano tutte le modifiche di un insieme di file
- condivisione del codice e modifiche
- tracciamento e merge
Perché li usiamo?
Ci sono 3 diverse versioni di VCS
I VCS locali registrano solo la storia del codice e non gestiscono la condivisione. I VCS centralizzati sono come quelli locali ma in un server, offrendo la condivisione. Tuttavia quando essa cade, tutto il sistema VCS cade ed è solo possibile fare commit al master.
I VCS distribuiti è duplicato per ogni nodo. Offre diversi metodi di issue tracking e workflow che favoriscono la condivisione.
Ogni insieme di righe modificate in un singolo file è detta DIFF. Un insieme di diff che sono esplicitamente convalidate sono un COMMIT. L’ultimo commit sulla storia è HEAD.
BRANCH sono i rami in cui si trova il codice. Per integrare un branch al master, si ha un merge.
Pull Request chiede di seguire un merge al branch master. Permette di commentare.
Ci sono diverse tipologie di workflow
E’ piccolo e veloce, sviluppato in C. Usa il modello distribuito.
working directory -git add-> staging area -git commit-> repository (locale) nello staging area vengono convalidati i file prima del commit
A differenza dei diff, git fa uno snapshot di tutti i file in un dato momento a cui poi fa link.
un file può avere uno dei 3 stati
non si possono chiudere le issue via commit
git config pull.rebase false
git pull origin master > sistemo conflitti
> git merge [--no-ff] new-feature
[--no]
per bypassare al main locale quando vengono solo aggiunti file
E’ un metodo agile per la quale si producono anche poche righe di codice alla volta per rispondere subito agli obiettivi e per presentare al cliente qualcosa di funzionante per ogni sessione (sprint).
Il metodo inverso a quello agile è chiamato waterflow per la quale si ritorna al cliente solo quando si è finito tutto.
I requisiti sono trattati come elementi di una lista detta product backlog. Si basa su attività empiriche per cui si risolvono solo cose a cui si hanno le conoscenze necessarie.
Persone e iterazioni > Processi e strumenti Software funzionante > Documentazione ampia Collaborazione con il cliente > Negoziazione del contratto Risposta al cambiamento > Seguire un piano
Per ogni punto del Product Backlog ne scrivo n per lo Sprint Backlog.
Prodotto progettato, realizzato e testato durante lo sprint. Requisiti -> Progetto -> Codifica -> Test Piuttosto che fare di tutto, si fa un pezzetto del tutto alla volta
Non si cambia durante lo sprint Alla fine dello sprint c’è una fase di revisione e rischio per cui lo sprint backlog può essere chiarito e rinegoziato con il product owner.
Ruoli
Eventi
Sprint goal: obiettivo che assegnamo a uno sprint Definizione di Done: ogni gruppo assegna una definizione di done Criterio di accettazione: permette di confermare se la storia è completa e funziona come dovuto; frasi semplici condivise tra product owner e development team
La build automation è il processo di automare la creazione di una build software e i processi associati inclusa la compilazione del source code in codice binario, packaging del codice binario ed eseguire test automatizzati.
Caratteristiche CRISP
Perché usare una tool di build? Dal codice sorgente, creare un artefatto utilizzabile.
Tipi di build-automation
In questo corso useremo Apache Maven che usa artefatti.
POM (Project Object Model) Il POM è l’unità di lavoro fondamentale di Maven. E’ un file .xml che contine informazioni su progetto e dettagli di configurazione utilizzati per creare il progetto.
mvn archetype:generate "-DgroupId=com.mycompany.app" "-DartifactId=my-app" "-DarchetypeArtifactId=maven-archetype-quickstart" "-DarchetypeVersion=1.4" "-DinteractiveMode=false"
Super-POM
mvn help:effective-pom
E’ il POM di default che pulliamo alla generazione del progetto.
Plugin
specifichiamo quando vengono lanciati nel pom <execution><phase>
I plugin oltre a quelli di default vengono aggiunti in una tag <plugin>
fuori da <pluginManagement>
.
Dipendenze
Aggiungiamo la dipendenza che vogliamo usare in <dependecies><dependency>
.
mvn compile
per scaricare la dipendenza e tutte quelle transitive richieste.
mvn dependency:tree
per vedere quali dipendenze sono utilizzate.
Project Archetype è definito come un modello da cui vengono realizzate tutte le altre cose dello stesso tipo. Aiuta gli autori a creare modelli e agli utenti i mezzi per generare versioni parametrizzate del progetto.
La fase di testing e quella di sviluppo devono andare di passo a passo. Il test è un’indagine che da informazioni sulla qualità del software e del servizio messo a test.
Testing (nella definizione di International Software Testing Qualification Board): Il processo che consiste su tutte le attività del ciclo di vita, sia statiche che dinamiche, interessate con la pianificazione, preparatione ed evaluazione di prodotti software e lavori correlati per determinare che soddisfino i requisiti specificati, dimostrare che sono adatti per lo scopo e trovare difetti.
Categorie di testing
Definizione di caso di test I casi di test aiutano a ridurre l’ambiguità nei requisiti, migliorando la descrizione. Sono i testable requirements.
Processo di test
7 principi di un test
V-model
Unit testing SUT Test sul sottosistema più piccolo possibile. E’ un test white box, ovvero abbiamo accesso al codice.
Integration testing SUT Verificano che i contratti di interfaccia tra più moduli e sottinsiemi siano rispettati e se i sottoinsiemi atomici sono ben integrati. E’ white box.
System testing SUT Verificano il comportamento dell’intero sistema rispetto alle specifiche tecniche. Può essere white o black box.
Acceptance testing (UAT, User Acceptance testing) Relativo agli use cases e ai requisiti concordati con il cliente. E’ un test black box.
Vedremo quelli automatici, in specifico JUnit.
Proprietà desiderabili (ATRIP)
Automatici
Esaustivi, accurati devono verificare il comportamento del più codice possibile (>80%) ci sono plugin che calcolano la percentuale del codice esercitate dal test, la percentuale di possibili diramazioni e il numero di eccezioni
Ripetibile
Indipendente, controlla solo uno o più metodi Professionali tanto quanto il codice, le linee di test sono >= a quelle di produzione
Framework aiutano
Useremo JUnit
@BeforeClass
e @AfterClass
a livello di classe, @Before
e @Before
a livello di metodo@RunWith(<classe>)
insieme a @Suite.SuiteClasses({ ... })
Il test non viene scritto solo per passare ma anche in modo che fallisca in buon modo (CORRECT)
Test-driven Development
L’analisi statica del codice avviene senza eseguire il codice. Ci sono vari tool che ci aiutano a controllare il codice e che forniscono anche possibili soluzioni.
Teoria delle finestre rotte: se un quartiene viene mantenuto in ordine allora, chi vuole creare disordine si troverebbe fuori luogo.
Funzionalità
Plugin per analisi statica Checkstyle SpotBugs (FindBugs obsoleto) PMD, individua difetti nel codice
SonarQube, piattaforma web che aggrega tutti i plugin precedenti. Registra l’evoluzione della metriche del codice.
Le issue segnalate vengono classificate in base alla gravità (Blocker, Critical, Major, Minor, etc.)
Feedback loop Chi avvisare per feedback? Dipende dallo stage di produzione.
Engineers Product manager End users
Binary Repository
Artifact Repository lascia gestire le versioni e build: eliminarle, tenere le firme e rigenerarle.
Caratteristiche
GAV identifica univocamente un artefatto metadati (es. pom.xml)
Maven ha 2 tipi di repository
Perché usare repository interno?
DEV | OPS | |
---|---|---|
- version control - build tools - CI (continuos integration) |
artifact repository | deployment |
Build automation NON E’ continuous integration
La Continuous Integration nasce per avere un allineamento frequente degli ambienti di lavoro dei sviluppatori verso l’ambiente condiviso. Per risolvere problemi di integrazione nel caso di lunghi sviluppi individuali.
Prerequisiti
Processo
Buone pratiche versionare spesso test e build brevi correggere errori di build subito tutti devono vedere cosa succede
Le applicazioni possono essere eseguite
Github actions Le componenti chiavi sono
mvn -B install –file pom.xm -B è per evitare che chieda iterazioni
| Continuous | | | ———————- | — | | Continuous Delivery | | | Continuous Deployment | | | Continuous Integration | | | Continuous Testing | |
Stai eseguendo la Continuous Delivery quando:
C.I. si basa sulla parte DEV. L’obiettivo della C.D. è di favorire la comunicazione tra DEV e OPS. Migliorare il processo che permette di rilasciare una modifica al codice sorgente del progetto in produzione. Isolare
Aggiungere parte del CD nella build di CI.
Benefici:
Requisiti
Configuration Management è il processo di ingegneria dei sistemi per la configurare l’infrastruttura del prodotto per tutta la sua vita. ITIL l’obiettivo del CM è di fornire un modello logico dell’infrastruttura attraverso l’identificazione, il controllo, la gestione e la verifica di tutte le versioni, solitamente tramite script.
Il Configuration Management Database (CMDB) viene usato per tracciare tutti i CI e le relazioni tra loro.
Obiettivo
La gestione del nostro prodotto con Configuration Management la stiamo già facendo con l’impostazione del CI, git, test, etc. Manca però la configurazione; impostiamo un file.
Infrastructure as code Per ogni modifica, deve esserci un check-in
Configuration Models
Modello | |
---|---|
config server(config tool) -push-> asset, asset, … | - più facile da gestire - meno - ASSET è gestito in centrale |
config server(config tool) <-pull- asset(agent), asset(agent), … | - meglio ad assicurarsi che gli asset sono in sync con il config - più complesso - ASSET può registrare se stesso |
Idempotency, la proprietà per la quale, applicando molteplici volte una stessa funzione, il risultato è lo stesso della sua singola applicazione.
Living Infrastructure
Immutable Infrastructure
Parole chiave Module
All’inizio ogni applicazione viveva su un server fisico dedicato
IaaS (Infrastructure as a Service) Virtualizzazione disaccoppia l’infrastruttura con l’hardware sottostante
HyperVisor aiutano la virtualizzazione. Sono responsabili a creare ed eseguire VM isolate e a gestire Possono essere
Componenti Host, macchina fisica su cui avviene la virtualizzazione Guest, macchine che accedono all’Host
Virtualizzazione in cloud
Limiti della vistualizzazione
Container, utilizza il kernel del sistema operativo per avere differenti root file system
Namespaces forniscono un ambiente isolato. Un processo in un namespace ha accesso limitato in quel namespace. Control groups (cgroups) limitano le risorse
Sono creati a partire da un immagini. Ogni immagine contiene informazioni sul codice eseguibile e l’ambiente necessario per avviare il codice.
Container VS Virtualizzazione
Docker image è la base per costruire un container. E’ l’intera applicazione. Un’immagine è un file immutabile che rappresenta un’istantanea di un container. Sono costituite da strati di altre immagini e vengono create con l’operazione di build descritta in Dockerfile.s Possono essere condivise.
Docker registry Il registry più conosciuto è Docker hub E’ consigliato avere un trusted Registry privato dove salvare ed utilizzare le immagini certificate. Fare patching delle immagini è molto complicato: si deve entrare nell’immagine e sostituire parte di essa
Orchestratore
Docker Swarm non ha preso piede