uni-notes

Issue Tracking System (ITS)

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.

Version Control System (VCS)

Il Version Control System (VCS) gestisce il versionamento offrendo un’informazione univoca del file. Anche detto Source Code Management System (SCM).

Perché li usiamo?

Ci sono 3 diverse versioni di VCS

  1. locali, database dentro l’IDE
  2. centralizzati, in un server
  3. distribuiti Ora vengono usati solo quelli distribuiti

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.

Terminologia

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

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

SCRUM

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

Build automation

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.

Software testing

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

  1. Test planning, creare o aggiornare un test plan
  2. Test control, controllare se il piano è rispettato
  3. Test analysis, cosa testare
  4. Test design, come testare
  5. Test implementation, definizione casi di test
  6. Test execution, esecuzione
  7. Checking result, verificare che i risultati e capire se il test è superato
  8. Evalutating exit criteria, verificare se sono stati raggiunti gli exit criteria definiti nel test plan
  9. Test results reporting, segnare il progresso rispetto agli exit criteria
  10. Test closure, chiusura del processo e definizione di azioni di miglioramento

7 principi di un test

  1. Test rivelano presenza di difetti
  2. Test esautivi non esistono il rischio(risk based) e le priorità(priority based) vengono usati per concentrarsi sugli aspetti più importanti
  3. Test il prima possibile
  4. Clustering dei difetti regola del 80/20, 80% degli errori nel 20% del codice
  5. Il paradosso dei pesticidi rifare i test passati con l’evoluzione del sistema
  6. Test dipendono dal contesto
  7. Assenza di errori non è garanzia equilibrio tra costi, funzionalità e tempo

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.

Unit Testing

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

  1. configurare un ambiente di test
  2. selezionare un test
  3. analizzare i valori inaspettati
  4. un modo standard per eseguire ed esprimere un esito

Useremo JUnit

Il test non viene scritto solo per passare ma anche in modo che fallisca in buon modo (CORRECT)

Test-driven Development

  1. fase rossa, scrivere un test che fallisce
  2. fase verde, scrivere il minor codice possibile per farlo passare
  3. fase grigia, ristrutturare il codice

Analisi statica

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

Artifact Repository

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

  1. Proxy remote repository, configurare il repository interno in modo che recuperi artefatti da repository esterni. Se l’artefatto non è presente, viene consultato il repository esterno.
  2. Hosted internal repository, condivisione all’interno di una organizzazione di arterfatti di terze parti con vincoli di licenza e ha 2 tipi di artifatti
  3. release artifact
  4. snapshot artifact

Perché usare repository interno?

DEV   OPS
- version control
- build tools
- CI (continuos integration)
artifact repository deployment

Continuous Integration

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

  1. controllo se il processo di build è in esecuzione nel sistema CI
  2. aggiorno il codice locale con il codice di VCS e effettuo integrazione in locale
  3. eseguo processo di build in locale
  4. aspetto che CI esegua il processo di build
  5. se il processo di build fallisce mi fermo, sistemo e riprendo da passo 3.
  6. al suo successo, procedo alla prossima attività

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 | |

Continuous Delivery

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.

  1. Only Build Your Binaries Once garantisce di usare lo stesso artefatto per effettuare tutte le verifiche in ogni ambiente
  2. Deploy the Same Way to Every Environment
  3. Smoke-Test Your Deliveries
  4. Deploy into a Copy of Production l’ambiente dovrà essere: - la stessa configurazione di rete - lo stesso sistema operativo (versione e patch) <- - lo stesso stack applicativo (application server, versione db, etc) <- - i dati gestiti devono essere in uno stato consistente <- configuration management
  5. Each Change Should Propagate through the Pipeline Instantly
  6. If Any Part of the Pipeline Fails, Stop the Line

Benefici:

Requisiti

Configuration Management

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

  1. salta lo step di provisione ad ogni update
  2. accumula update col tempo Implicazioni:
    • idempotenza non è garantibile
    • drift di configurazione con update manuali

Immutable Infrastructure

  1. creo una nuova immagine
  2. provisione della nuova istanza con una immagine read-only Implicazioni:
    • update più lenti
    • immagini costruite offline e poi caricate

Ansible

Parole chiave Module

All’inizio ogni applicazione viveva su un server fisico dedicato

Virtualizzazione

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

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