SlideShare a Scribd company logo
1 of 49
Download to read offline
Git - Continuous Integration - Docker
la terna dello sviluppo moderno
Gerardo Di Iorio
@arete
Chi Sono
Gerardo Di Iorio
Programmatore presso
Organizzatore DevDay AV
Linux dal 1992 ( potevo utilizzare UNIX su x86)
Cosa è Git
Git è un software di controllo versione distribuito utilizzabile da interfaccia a riga di
comando, creato da Linus Torvalds nel 2005.
Fonte Wikipedia
Per controllo di versione intendiamo un software che ci permette di mantenere diverse versioni di uno
stesso progetto, in modo da facilitare il suo sviluppo.
● Sviluppo Distribuito
● Gestione di progetti con moltissimi file
● Merge complessi
● Gestione delle branch semplici
● Veloce
● Robusto
● ….. lo usano tutti!
Importanza di un VCS
“Il controllo versione ingegneristico si è sviluppato dai processi formali basati sui disegni cartacei. Le modifiche a questi documenti sono
identificate incrementando un numero o un codice associato ad essi, denominato "numero di versione", "etichetta di versione", o
semplicemente "versione", e sono etichettate con il nome della persona che ha apportato la modifica. Una semplice forma di controllo
versione, per esempio, assegna il numero 1 alla prima versione di un progetto. Quando viene apportata la prima modifica, il numero
identificativo di versione passa a 2 e così via.” fonte wikipedia
Importanza di un VCS
● Il codice funziona, provo ad aggiungere questa modifica
● Ho sempre lo zip di ieri
● Ho l’undo
● Commento queste due linee ??
● Potrei fare anche migliorare quest’altra funzione….
● Bug risolto da un collega
● Quale modifiche devo mantenere ?
● Non Funziona piu’ nulla !!!!
● Particolarmente urgentissimo !!
NO Problem!
● Ho il controllo delle modifiche
● Ho la storia di tutte le mie modifiche
● Posso ripristinare lo stato di ogni singola modifica
● Branch di sviluppo
● Posso collaborare con altre persone
Installare Git
https://git-scm.com/
➔ Windows (32/64 bit)
➔ Linux (repo distro)
➔ OSX
CLI/GUI
● Gitk,giggle,ungit,gitg
● GitExtensions(Windows)
● Gitkraken(Mac,Windows)
Controllo dei Sorgenti
Centralizzato
Centralized Version Control Systems - CVCS
CVS,Subversion Perfoce
Unico repository con tutte le
informazioni e la storia del progetto.
Localmente si ha solo uno snapshot
della versione (sincronizzata)
Localmente si ha tutta la
storia del
progetto(repository)
Decentralizzato
Distribuited Version Control Systems - DVCS
Git, Mercurial, Bazzars,Darcs
Locale
VCS
RCS,Cartelle,Patch
Il progetto viene gestito con copie
locali del progetto,in modo da avere
uno storico dello sviluppo.
Storia di GIT
● Sviluppo del kernel (1991-2005) Patch e File Compressi
● Uso di BitKeeper (2002)
● Reverse Engineering (Telnet BitKeeper Port ->help)
● Linus Torvalds inizia lo sviluppo di Git
Caratteristiche
● Velocità
● Design semplice
● Ottimo supporto allo sviluppo non-lineare (migliaia di rami paralleli)
● Completamente distribuito
● Capacità di gestire, in modo efficiente (velocità e dimensione dei dati), progetti grandi come il kernel Linux
Funzionamento di GIT
● Git tiene traccia solo dei file che gli indichiamo
esplicitamente
● Un file può essere untracked o unmodified
● Applichiamo le modifiche che vogliamo aggiungere
● Spostiamo il file nella staging area
● Quando si crea un commit vengono salvate tutte le
modifiche presenti nella staging area
● Continuiamo le nostre modifiche
● Tutto ciò viene svolto in locale
git init
Inizializza un repository Git in locale
● Creare una directory
● >git init (inizializza il repository nella directory corrente)
● >git init <folder> (inizializza il repository nella directory <folder>)
>git config --global user.email “Gerardo Di Iorio”
>git config --global user.email “arete74@gmail.com”
git status
Stato del repository
● Branch corrente (default master)
● Stato del repo “avanti” o “indietro” rispetto al branch remoto
● I file modificati non ancora nella staging area
● I file nuovi non ancora tracciati I file tracciati ma rimossi o rinominati
>git status
git add
Aggiunge i file nella staging area
● Serve per spostare le modifiche nella staging area
● Per re a tracciare file non tracciati
● Va fatto con i file che volete siano compresi nel prossimo commit
● Se è una cartella, aggiunge i file ricorsivamente
>git add <file1> <file2> ...<filen>
git add
Aggiunge i file nella staging area
● >git add -a – aggiunge tutte le modifiche sui file già tracciati
● >git add -A – come sopra ma aggiunge anche i file non ancora tracciati
● git add non aggiunge le modifiche correnti alla staging area!
.gitignore
File con elenco di file che vogliamo esplicitamente ignorare nel repository
● Il file accetta sia nomi completi che globbing
● Supporta la negazione *.o (escludi tutti i file che finiscono con .o) !main.o
(...ma non main.o)
Best Pactrick
● Non includere i file che sono generati dal processo di build
● Utilizzare template da https://gitignore.io
git commit
>git commit
● Crea un commit con le modifiche nella staging area
● Di default apre un editor di testo per permettere di digitare il messaggio di
commit
● E’ possibile aggiungere il messaggio come parametro direttamente dalla cli
>git commit -m”Initial Commit”
● Linux kernel >git commit -s
Best practice
● i messaggi di commit devono avere un senso “Versione quasi stabile” ←Nope.
● I commit in Git sono velocissimi, non si pagano
● Evitare MegaCommit “Riscritta tutta la funzione A e aggiunta funzione B e migliorata
funzione C”
● Facilità successiva nell’individuare bug
Commit
Struttura del commit
● Ogni commit è identificato univocamente e630e1fafacccdb8008555b63724058c6c5e8918
● Ha id l’ID è generato facendo un hash (SHA1) di un po’ di “roba”
● In genere (date le proprietà degli hash) possiamo utilizzare i primi 6/8
caratteri del commit, per identificare uno specifico commit
● Puo’ avere 1 o 2 genitori (solo il primo commit non ha nessun genitore)
● I commit possono essere “taggati”, versioni,etc
Assegna il nome all’ultimo commit
>git tag <nome>
assegna il nome al commit specificato
>git tag <nome> <commit>
Crea un tag annotato, vengono riportate anche le info relative a chi ha creato il tag
>git tag -a <nome> <commit>
Comandi
● git rm – rimuove un file nel repository
● git rm --cached – rimuove il file dal tree ma non lo elimina
● git mv – sposta un file del repository
● git log – mostra la history dei commit
● git show <commit> – mostra uno specifico commit
● git diff – mostra il diff tra la staging area e quello lo stato corrente
● git diff --staged – mostra il diff tra l’ultimo commit e la staging area
● git reset – toglie tutto dalla staging area (le modifiche restano)
● git reset --hard <commit> – riporta tutti i file nello stato del commit
● git blame <file> – visualizza le modifiche riga per riga con il commit e autore
● git checkout <commit> -- <file1> <file2> … <fileN> riporta il singolo/i file alla
stato del commit
● git stash crea un salvataggio temporaneo dei file nella stage area
Demo
Collaboriamo
Rami di sviluppo parallelo
● Ramo di produzione
● Ramo/i di personale di sviluppo
● Ramo/i personale di un altro sviluppatore
Git Flow
git branch
Quando creare una branch ?
● branch per il ramo stabile
● un branch per il ramo di sviluppo
● per introdurre nuove funzionalità, per la localizzazione
● particolarmente urgentissimo
git branch Mostra tutte le branch locali
git branch -r Mostra tutte le branch remote
git branch <branch> crea una branch
git branch -D <branch> cancella la branch
git merge
Quando si effettua un merge di due branch possiamo trovare due possibili casi:
1. Fast Foward
2. 3-Way Merge
git merge fast-forward
Nel caso in cui non sia stato fatto nessun
nuovo commit sul branch master da quando
è stato creato il branch develop.
git checkout master
git merge develop
Non viene creato un nuovo commit per il
merge. Nei merge fast forward non ci
possono essere conflitti
git merge 3-way (comando)
Git risale il grafo fino a trovare un parente
comune (B).Quindi, dopo aver svolto il diff
tra il parente e i 2 nodi coinvolti nel merge,
svolge il cosiddetto 3-way merge.
● Se i due commit hanno introdotto la stessa modifica nella
stessa sezione, la modifica viene introdotta
● Se i due commit hanno introdotto una modifica in una
sezione e l’altro non ha modificate quella sezione, la
modifica viene introdotta
● Se tutti e due hanno modificato in modo diverso la stessa
sezione, si viene creato un conflitto
● Risolti i conflitti, viene creato un commit di merge, e’
speciale perchè ha due puntatori ai predecessori commit
git rebase
git rebase
Eseguiamo un rebase di feature su master
git checkout feature; git rebase master
Partendo dall’ultimo commit di master tenta di applicare, un commit alla volta,
tutti i commit che sono sul ramo feature.Si possono ottenere piu conflitti, per
commit.
Riscrive la storia della branch!!!!!
git rebase -i
Esegue un rebase interattivo
git rebase -i master
Viene aperto un editor, in cui vengono mostrati tutti i commit che devono essere
applicati.Per ogni singolo commit e’ possibile specificare l’azione che deve
compiere:
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
# These lines can be re-ordered; they are executed from top to bottom.
Conflitti
Durante un merge o un rebase potrebbero esserci dei conflitti
I conflitti vengono segnalati con questa sintassi:
<<<<<<< HEAD <-Modifiche relative al branch corrente
…….
=======
……
….
>>>>>>> <commit-id> -Modifiche relative al commit del branch remoto
Conflitti
I conflitti possono essere risolti anche “a mano” con un editor di testo
Esistono però dei tool visuali
meld,kdiff3,...
git mergetool avvia il vostro tool di risoluzione conflitti
Dopo aver risolto i conflitti, potete continuare con il vostro merge/rebase
git flow
Hosting Git repository
Per condividere il nostro repository con altre persone
abbiamo bisogno di un hosting
Github - free solo per repository pubblici
Gitlab - free per repository pubblici e privati, self hosting
Bitbucket - free per repository pubblici e privati
gitea - self hosting, solo un exe
https://git.wiki.kernel.org/index.php/GitHosting lista completa
Potete condividere il vostro branch via patch (linux kernel)
git format-patch [BASE_BRANCH_NAME]:
$ git format-patch master
0001-<commit message>.patch
$ git send-email --to <your mail> ~/patches/*.patch
$ git apply 0001-<commit message>.patch
git remote
I repository remoti possono essere sincronizzati:
local file system,ssh,https,git
git remote add <nome> <url>
git remote add origin https://github.com/git/git.git
git remote add originssh git@github.com:git/git.git
git remote show Mostra la lista dei repo remoti
git push,fetch,pull
Sincronizziamo i repo remoti
git fetch origin Sincronizza il repo remoto con il locale, scarica solo le branch
e commit remoti...non viene modificata la branch locale
git pull origin Effettua il fetch, e cerca anche di fare il merge.
git push origin test:test Sincronizza la branch locale con la branc remoto.
Se la branch remota non esiste la crea
git push origin -f test:test Effettua il push forzata, nel caso che la storia del
branch remota sia differente
git cherry-pick
cherry-pick <commit> applica i cambiamenti
introdotti da un commit in altro branch
● Bug fix da altre branch
● Singole Implementazioni
● Test di una nuova api
● …..
git non solo codice
etckeeper
● e’ una collezione di script bash che consentono di tenere sotto controllo tramite un sistema di revisione distribuito
directory /etc/
● Dobbiamo ricordarci che è fondamentale mantenere per ogni file, oltre i permessi anche il proprietario ed il gruppo
nonche tutta la struttura di directory comprese quelle vuote.
git-lfs
● estensione per gestire grandi file, presenti su non sul repository locale,ma su cloud esterni,github,gilab,aws etc
Backup di filesystem
● bup
Gestione dei documenti per presentazioni scientifiche…
latex,tex….
Backup
Come effettuo il backup di un repo git ?
git bundle create /backup/repo --all
Rispristino
git clone /backup/repo myrepo
Creare un repository bare
git clone --bare myrepo /backup/my-repo.git
Demo
Hook
Hooks Locali
● pre-commit
● post-commit
● post-checkout
● pre-push
Hooks Remoti
● pre-receive
● post-receive
● update
● post-update
CI : Continuos Integration
è una pratica che si applica in contesti in cui lo sviluppo del software avviene attraverso un sistema di versioning. Consiste
nell'allineamento frequente (ovvero "molte volte al giorno") dagli ambienti di lavoro degli sviluppatori verso l'ambiente
condiviso (wikipedia)
● Travis CI
● Circle Ci
● TeamCity
● Drone.io
Effettua la build per ogni push
Effettua test per la build
Effettua il deploy in ambienti di produzione
Certezza che tutto l’ambiente e build sia replicabile
“Ma sul mio computer compila….”
Demo
Pipeline
Personal
PC
Git locale
GIT
Hosting
CI
Spazio
Web
Docker
Docker automatizza il deployment
(consegna o rilascio al cliente, con
relativa installazione e messa in
funzione o esercizio, di una
applicazione o di un sistema software
tipicamente all'interno di un sistema
informatico aziendale) di applicazioni
all'interno di container software,
fornendo un'astrazione aggiuntiva
grazie alla virtualizzazione a livello di
sistema operativo.
Docker
Vantaggi
● Gestione semplificata (non devo
gestire una VM)
● Prototipazione veloce e semplice
(docker hub)
● Sviluppo semplificato
● Isolamento
● Controllo di versione (ho bisogno
di mysql 5.4.x, php 6.2.1,etc)
● oltre 10000 immagini su Docker
Hub
docker run -d -p 80:80 --name
my-apache-php-app -v
"$PWD":/var/www/html php:7.0-apache
Docker
Docker Compose
Risorse
Repository di esempio
Sito web devdayci.newshell.it
https://github.com/arete/devdayci.newshell.it
Sito web devday.newshell.it
https://github.com/arete/devday.newshell.it
Fine
Don't ask to ask, just ask
@gdiiorio
@arete

More Related Content

What's hot

Docker Compose | Docker Compose Tutorial | Docker Tutorial For Beginners | De...
Docker Compose | Docker Compose Tutorial | Docker Tutorial For Beginners | De...Docker Compose | Docker Compose Tutorial | Docker Tutorial For Beginners | De...
Docker Compose | Docker Compose Tutorial | Docker Tutorial For Beginners | De...Simplilearn
 
Containerd + buildkit breakout
Containerd + buildkit breakoutContainerd + buildkit breakout
Containerd + buildkit breakoutDocker, Inc.
 
Introduction to Docker - IndiaOpsUG
Introduction to Docker - IndiaOpsUGIntroduction to Docker - IndiaOpsUG
Introduction to Docker - IndiaOpsUGAjeet Singh Raina
 
Building images efficiently and securely on Kubernetes with BuildKit
Building images efficiently and securely on Kubernetes with BuildKitBuilding images efficiently and securely on Kubernetes with BuildKit
Building images efficiently and securely on Kubernetes with BuildKitNTT Software Innovation Center
 
Docker introduction (1)
Docker introduction (1)Docker introduction (1)
Docker introduction (1)Gourav Varma
 
[KubeConEU] Building images efficiently and securely on Kubernetes with BuildKit
[KubeConEU] Building images efficiently and securely on Kubernetes with BuildKit[KubeConEU] Building images efficiently and securely on Kubernetes with BuildKit
[KubeConEU] Building images efficiently and securely on Kubernetes with BuildKitAkihiro Suda
 
Intro to Docker November 2013
Intro to Docker November 2013Intro to Docker November 2013
Intro to Docker November 2013Docker, Inc.
 
Docker introduction
Docker introductionDocker introduction
Docker introductionPhuc Nguyen
 
Running Android on the Raspberry Pi: Android Pie meets Raspberry Pi
Running Android on the Raspberry Pi: Android Pie meets Raspberry PiRunning Android on the Raspberry Pi: Android Pie meets Raspberry Pi
Running Android on the Raspberry Pi: Android Pie meets Raspberry PiChris Simmonds
 
Docker Introduction
Docker IntroductionDocker Introduction
Docker IntroductionPeng Xiao
 

What's hot (20)

Docker Compose | Docker Compose Tutorial | Docker Tutorial For Beginners | De...
Docker Compose | Docker Compose Tutorial | Docker Tutorial For Beginners | De...Docker Compose | Docker Compose Tutorial | Docker Tutorial For Beginners | De...
Docker Compose | Docker Compose Tutorial | Docker Tutorial For Beginners | De...
 
Docker by Example - Basics
Docker by Example - Basics Docker by Example - Basics
Docker by Example - Basics
 
Containerd + buildkit breakout
Containerd + buildkit breakoutContainerd + buildkit breakout
Containerd + buildkit breakout
 
Introduction to Docker - IndiaOpsUG
Introduction to Docker - IndiaOpsUGIntroduction to Docker - IndiaOpsUG
Introduction to Docker - IndiaOpsUG
 
Building images efficiently and securely on Kubernetes with BuildKit
Building images efficiently and securely on Kubernetes with BuildKitBuilding images efficiently and securely on Kubernetes with BuildKit
Building images efficiently and securely on Kubernetes with BuildKit
 
Docker introduction (1)
Docker introduction (1)Docker introduction (1)
Docker introduction (1)
 
Multi Stage Docker Build
Multi Stage Docker Build Multi Stage Docker Build
Multi Stage Docker Build
 
Docker
DockerDocker
Docker
 
Docker
DockerDocker
Docker
 
Docker presentation
Docker presentationDocker presentation
Docker presentation
 
Introduction To Docker
Introduction To  DockerIntroduction To  Docker
Introduction To Docker
 
Dockerfile
Dockerfile Dockerfile
Dockerfile
 
[KubeConEU] Building images efficiently and securely on Kubernetes with BuildKit
[KubeConEU] Building images efficiently and securely on Kubernetes with BuildKit[KubeConEU] Building images efficiently and securely on Kubernetes with BuildKit
[KubeConEU] Building images efficiently and securely on Kubernetes with BuildKit
 
Docker Container Introduction
Docker Container IntroductionDocker Container Introduction
Docker Container Introduction
 
Intro to Docker November 2013
Intro to Docker November 2013Intro to Docker November 2013
Intro to Docker November 2013
 
Docker Compose Explained
Docker Compose ExplainedDocker Compose Explained
Docker Compose Explained
 
Docker introduction
Docker introductionDocker introduction
Docker introduction
 
Running Android on the Raspberry Pi: Android Pie meets Raspberry Pi
Running Android on the Raspberry Pi: Android Pie meets Raspberry PiRunning Android on the Raspberry Pi: Android Pie meets Raspberry Pi
Running Android on the Raspberry Pi: Android Pie meets Raspberry Pi
 
Docker Introduction
Docker IntroductionDocker Introduction
Docker Introduction
 
Docker Introduction
Docker IntroductionDocker Introduction
Docker Introduction
 

Similar to Git/Continuous Integration/Docker: la terna dello sviluppo moderno.

Similar to Git/Continuous Integration/Docker: la terna dello sviluppo moderno. (20)

Git e GitHub
Git e GitHubGit e GitHub
Git e GitHub
 
Introduzione a Git (ITA - 2017)
Introduzione a Git (ITA - 2017)Introduzione a Git (ITA - 2017)
Introduzione a Git (ITA - 2017)
 
Controllo di versione e Git
Controllo di versione e GitControllo di versione e Git
Controllo di versione e Git
 
GitSlides
GitSlidesGitSlides
GitSlides
 
Introduzione a Git
Introduzione a GitIntroduzione a Git
Introduzione a Git
 
Emerasoft Git quickstart
Emerasoft Git quickstartEmerasoft Git quickstart
Emerasoft Git quickstart
 
Introduzione a git
Introduzione a gitIntroduzione a git
Introduzione a git
 
Git
GitGit
Git
 
GITT (part 1 of 2)
GITT (part 1 of 2)GITT (part 1 of 2)
GITT (part 1 of 2)
 
Revisionare, tracciare, collaborare. Version control con git
Revisionare, tracciare, collaborare. Version control con gitRevisionare, tracciare, collaborare. Version control con git
Revisionare, tracciare, collaborare. Version control con git
 
Git
GitGit
Git
 
Git Flow - Un modello di branching che funziona
Git Flow - Un modello di branching che funzionaGit Flow - Un modello di branching che funziona
Git Flow - Un modello di branching che funziona
 
Introduzione a Git
Introduzione a GitIntroduzione a Git
Introduzione a Git
 
Git – lo stupido gestore di contenuti
Git – lo stupido gestore di contenutiGit – lo stupido gestore di contenuti
Git – lo stupido gestore di contenuti
 
Git best practices
Git best practicesGit best practices
Git best practices
 
Development process
Development processDevelopment process
Development process
 
Git: un'introduzione pratica
Git: un'introduzione praticaGit: un'introduzione pratica
Git: un'introduzione pratica
 
Git gestione comoda del repository
Git   gestione comoda del repositoryGit   gestione comoda del repository
Git gestione comoda del repository
 
NuIEEE - Workshop de Git
NuIEEE - Workshop de GitNuIEEE - Workshop de Git
NuIEEE - Workshop de Git
 
Git for dummies
Git for dummiesGit for dummies
Git for dummies
 

More from Gerardo Di Iorio

Caratterizzazione di un rivelatore a piatti resistivi (RPC)
Caratterizzazione di un rivelatore a piatti resistivi (RPC)Caratterizzazione di un rivelatore a piatti resistivi (RPC)
Caratterizzazione di un rivelatore a piatti resistivi (RPC)Gerardo Di Iorio
 
Scan Back and Vertex Analysis
Scan Back and Vertex AnalysisScan Back and Vertex Analysis
Scan Back and Vertex AnalysisGerardo Di Iorio
 
Ricostruzione di interazioni di pioni nelle Emulsion Cloud Chamber di OPERA
Ricostruzione di interazioni di pioni nelle Emulsion Cloud Chamber di OPERARicostruzione di interazioni di pioni nelle Emulsion Cloud Chamber di OPERA
Ricostruzione di interazioni di pioni nelle Emulsion Cloud Chamber di OPERAGerardo Di Iorio
 

More from Gerardo Di Iorio (7)

Docker & DevOps
Docker  & DevOpsDocker  & DevOps
Docker & DevOps
 
Caratterizzazione di un rivelatore a piatti resistivi (RPC)
Caratterizzazione di un rivelatore a piatti resistivi (RPC)Caratterizzazione di un rivelatore a piatti resistivi (RPC)
Caratterizzazione di un rivelatore a piatti resistivi (RPC)
 
Scan Back and Vertex Analysis
Scan Back and Vertex AnalysisScan Back and Vertex Analysis
Scan Back and Vertex Analysis
 
Ricostruzione di interazioni di pioni nelle Emulsion Cloud Chamber di OPERA
Ricostruzione di interazioni di pioni nelle Emulsion Cloud Chamber di OPERARicostruzione di interazioni di pioni nelle Emulsion Cloud Chamber di OPERA
Ricostruzione di interazioni di pioni nelle Emulsion Cloud Chamber di OPERA
 
Think open IoT
Think open IoTThink open IoT
Think open IoT
 
Privacy e sicurezza
Privacy e sicurezzaPrivacy e sicurezza
Privacy e sicurezza
 
Cubie board
Cubie boardCubie board
Cubie board
 

Git/Continuous Integration/Docker: la terna dello sviluppo moderno.

  • 1. Git - Continuous Integration - Docker la terna dello sviluppo moderno Gerardo Di Iorio @arete
  • 2. Chi Sono Gerardo Di Iorio Programmatore presso Organizzatore DevDay AV Linux dal 1992 ( potevo utilizzare UNIX su x86)
  • 3. Cosa è Git Git è un software di controllo versione distribuito utilizzabile da interfaccia a riga di comando, creato da Linus Torvalds nel 2005. Fonte Wikipedia Per controllo di versione intendiamo un software che ci permette di mantenere diverse versioni di uno stesso progetto, in modo da facilitare il suo sviluppo. ● Sviluppo Distribuito ● Gestione di progetti con moltissimi file ● Merge complessi ● Gestione delle branch semplici ● Veloce ● Robusto ● ….. lo usano tutti!
  • 4. Importanza di un VCS “Il controllo versione ingegneristico si è sviluppato dai processi formali basati sui disegni cartacei. Le modifiche a questi documenti sono identificate incrementando un numero o un codice associato ad essi, denominato "numero di versione", "etichetta di versione", o semplicemente "versione", e sono etichettate con il nome della persona che ha apportato la modifica. Una semplice forma di controllo versione, per esempio, assegna il numero 1 alla prima versione di un progetto. Quando viene apportata la prima modifica, il numero identificativo di versione passa a 2 e così via.” fonte wikipedia
  • 5. Importanza di un VCS ● Il codice funziona, provo ad aggiungere questa modifica ● Ho sempre lo zip di ieri ● Ho l’undo ● Commento queste due linee ?? ● Potrei fare anche migliorare quest’altra funzione…. ● Bug risolto da un collega ● Quale modifiche devo mantenere ? ● Non Funziona piu’ nulla !!!! ● Particolarmente urgentissimo !!
  • 6. NO Problem! ● Ho il controllo delle modifiche ● Ho la storia di tutte le mie modifiche ● Posso ripristinare lo stato di ogni singola modifica ● Branch di sviluppo ● Posso collaborare con altre persone
  • 7. Installare Git https://git-scm.com/ ➔ Windows (32/64 bit) ➔ Linux (repo distro) ➔ OSX CLI/GUI ● Gitk,giggle,ungit,gitg ● GitExtensions(Windows) ● Gitkraken(Mac,Windows)
  • 8. Controllo dei Sorgenti Centralizzato Centralized Version Control Systems - CVCS CVS,Subversion Perfoce Unico repository con tutte le informazioni e la storia del progetto. Localmente si ha solo uno snapshot della versione (sincronizzata) Localmente si ha tutta la storia del progetto(repository) Decentralizzato Distribuited Version Control Systems - DVCS Git, Mercurial, Bazzars,Darcs Locale VCS RCS,Cartelle,Patch Il progetto viene gestito con copie locali del progetto,in modo da avere uno storico dello sviluppo.
  • 9. Storia di GIT ● Sviluppo del kernel (1991-2005) Patch e File Compressi ● Uso di BitKeeper (2002) ● Reverse Engineering (Telnet BitKeeper Port ->help) ● Linus Torvalds inizia lo sviluppo di Git Caratteristiche ● Velocità ● Design semplice ● Ottimo supporto allo sviluppo non-lineare (migliaia di rami paralleli) ● Completamente distribuito ● Capacità di gestire, in modo efficiente (velocità e dimensione dei dati), progetti grandi come il kernel Linux
  • 10. Funzionamento di GIT ● Git tiene traccia solo dei file che gli indichiamo esplicitamente ● Un file può essere untracked o unmodified ● Applichiamo le modifiche che vogliamo aggiungere ● Spostiamo il file nella staging area ● Quando si crea un commit vengono salvate tutte le modifiche presenti nella staging area ● Continuiamo le nostre modifiche ● Tutto ciò viene svolto in locale
  • 11. git init Inizializza un repository Git in locale ● Creare una directory ● >git init (inizializza il repository nella directory corrente) ● >git init <folder> (inizializza il repository nella directory <folder>) >git config --global user.email “Gerardo Di Iorio” >git config --global user.email “arete74@gmail.com”
  • 12. git status Stato del repository ● Branch corrente (default master) ● Stato del repo “avanti” o “indietro” rispetto al branch remoto ● I file modificati non ancora nella staging area ● I file nuovi non ancora tracciati I file tracciati ma rimossi o rinominati >git status
  • 13. git add Aggiunge i file nella staging area ● Serve per spostare le modifiche nella staging area ● Per re a tracciare file non tracciati ● Va fatto con i file che volete siano compresi nel prossimo commit ● Se è una cartella, aggiunge i file ricorsivamente >git add <file1> <file2> ...<filen>
  • 14. git add Aggiunge i file nella staging area ● >git add -a – aggiunge tutte le modifiche sui file già tracciati ● >git add -A – come sopra ma aggiunge anche i file non ancora tracciati ● git add non aggiunge le modifiche correnti alla staging area!
  • 15. .gitignore File con elenco di file che vogliamo esplicitamente ignorare nel repository ● Il file accetta sia nomi completi che globbing ● Supporta la negazione *.o (escludi tutti i file che finiscono con .o) !main.o (...ma non main.o) Best Pactrick ● Non includere i file che sono generati dal processo di build ● Utilizzare template da https://gitignore.io
  • 16. git commit >git commit ● Crea un commit con le modifiche nella staging area ● Di default apre un editor di testo per permettere di digitare il messaggio di commit ● E’ possibile aggiungere il messaggio come parametro direttamente dalla cli >git commit -m”Initial Commit” ● Linux kernel >git commit -s Best practice ● i messaggi di commit devono avere un senso “Versione quasi stabile” ←Nope. ● I commit in Git sono velocissimi, non si pagano ● Evitare MegaCommit “Riscritta tutta la funzione A e aggiunta funzione B e migliorata funzione C” ● Facilità successiva nell’individuare bug
  • 17. Commit Struttura del commit ● Ogni commit è identificato univocamente e630e1fafacccdb8008555b63724058c6c5e8918 ● Ha id l’ID è generato facendo un hash (SHA1) di un po’ di “roba” ● In genere (date le proprietà degli hash) possiamo utilizzare i primi 6/8 caratteri del commit, per identificare uno specifico commit ● Puo’ avere 1 o 2 genitori (solo il primo commit non ha nessun genitore) ● I commit possono essere “taggati”, versioni,etc Assegna il nome all’ultimo commit >git tag <nome> assegna il nome al commit specificato >git tag <nome> <commit> Crea un tag annotato, vengono riportate anche le info relative a chi ha creato il tag >git tag -a <nome> <commit>
  • 18. Comandi ● git rm – rimuove un file nel repository ● git rm --cached – rimuove il file dal tree ma non lo elimina ● git mv – sposta un file del repository ● git log – mostra la history dei commit ● git show <commit> – mostra uno specifico commit ● git diff – mostra il diff tra la staging area e quello lo stato corrente ● git diff --staged – mostra il diff tra l’ultimo commit e la staging area ● git reset – toglie tutto dalla staging area (le modifiche restano) ● git reset --hard <commit> – riporta tutti i file nello stato del commit ● git blame <file> – visualizza le modifiche riga per riga con il commit e autore ● git checkout <commit> -- <file1> <file2> … <fileN> riporta il singolo/i file alla stato del commit ● git stash crea un salvataggio temporaneo dei file nella stage area
  • 19. Demo
  • 20. Collaboriamo Rami di sviluppo parallelo ● Ramo di produzione ● Ramo/i di personale di sviluppo ● Ramo/i personale di un altro sviluppatore
  • 22. git branch Quando creare una branch ? ● branch per il ramo stabile ● un branch per il ramo di sviluppo ● per introdurre nuove funzionalità, per la localizzazione ● particolarmente urgentissimo git branch Mostra tutte le branch locali git branch -r Mostra tutte le branch remote git branch <branch> crea una branch git branch -D <branch> cancella la branch
  • 23. git merge Quando si effettua un merge di due branch possiamo trovare due possibili casi: 1. Fast Foward 2. 3-Way Merge
  • 24. git merge fast-forward Nel caso in cui non sia stato fatto nessun nuovo commit sul branch master da quando è stato creato il branch develop. git checkout master git merge develop Non viene creato un nuovo commit per il merge. Nei merge fast forward non ci possono essere conflitti
  • 25. git merge 3-way (comando) Git risale il grafo fino a trovare un parente comune (B).Quindi, dopo aver svolto il diff tra il parente e i 2 nodi coinvolti nel merge, svolge il cosiddetto 3-way merge. ● Se i due commit hanno introdotto la stessa modifica nella stessa sezione, la modifica viene introdotta ● Se i due commit hanno introdotto una modifica in una sezione e l’altro non ha modificate quella sezione, la modifica viene introdotta ● Se tutti e due hanno modificato in modo diverso la stessa sezione, si viene creato un conflitto ● Risolti i conflitti, viene creato un commit di merge, e’ speciale perchè ha due puntatori ai predecessori commit
  • 27. git rebase Eseguiamo un rebase di feature su master git checkout feature; git rebase master Partendo dall’ultimo commit di master tenta di applicare, un commit alla volta, tutti i commit che sono sul ramo feature.Si possono ottenere piu conflitti, per commit. Riscrive la storia della branch!!!!!
  • 28. git rebase -i Esegue un rebase interattivo git rebase -i master Viene aperto un editor, in cui vengono mostrati tutti i commit che devono essere applicati.Per ogni singolo commit e’ possibile specificare l’azione che deve compiere: # Commands: # p, pick = use commit # r, reword = use commit, but edit the commit message # e, edit = use commit, but stop for amending # s, squash = use commit, but meld into previous commit # f, fixup = like "squash", but discard this commit's log message # x, exec = run command (the rest of the line) using shell # These lines can be re-ordered; they are executed from top to bottom.
  • 29. Conflitti Durante un merge o un rebase potrebbero esserci dei conflitti I conflitti vengono segnalati con questa sintassi: <<<<<<< HEAD <-Modifiche relative al branch corrente ……. ======= …… …. >>>>>>> <commit-id> -Modifiche relative al commit del branch remoto
  • 30. Conflitti I conflitti possono essere risolti anche “a mano” con un editor di testo Esistono però dei tool visuali meld,kdiff3,... git mergetool avvia il vostro tool di risoluzione conflitti Dopo aver risolto i conflitti, potete continuare con il vostro merge/rebase
  • 32. Hosting Git repository Per condividere il nostro repository con altre persone abbiamo bisogno di un hosting Github - free solo per repository pubblici Gitlab - free per repository pubblici e privati, self hosting Bitbucket - free per repository pubblici e privati gitea - self hosting, solo un exe https://git.wiki.kernel.org/index.php/GitHosting lista completa Potete condividere il vostro branch via patch (linux kernel) git format-patch [BASE_BRANCH_NAME]: $ git format-patch master 0001-<commit message>.patch $ git send-email --to <your mail> ~/patches/*.patch $ git apply 0001-<commit message>.patch
  • 33. git remote I repository remoti possono essere sincronizzati: local file system,ssh,https,git git remote add <nome> <url> git remote add origin https://github.com/git/git.git git remote add originssh git@github.com:git/git.git git remote show Mostra la lista dei repo remoti
  • 34. git push,fetch,pull Sincronizziamo i repo remoti git fetch origin Sincronizza il repo remoto con il locale, scarica solo le branch e commit remoti...non viene modificata la branch locale git pull origin Effettua il fetch, e cerca anche di fare il merge. git push origin test:test Sincronizza la branch locale con la branc remoto. Se la branch remota non esiste la crea git push origin -f test:test Effettua il push forzata, nel caso che la storia del branch remota sia differente
  • 35. git cherry-pick cherry-pick <commit> applica i cambiamenti introdotti da un commit in altro branch ● Bug fix da altre branch ● Singole Implementazioni ● Test di una nuova api ● …..
  • 36. git non solo codice etckeeper ● e’ una collezione di script bash che consentono di tenere sotto controllo tramite un sistema di revisione distribuito directory /etc/ ● Dobbiamo ricordarci che è fondamentale mantenere per ogni file, oltre i permessi anche il proprietario ed il gruppo nonche tutta la struttura di directory comprese quelle vuote. git-lfs ● estensione per gestire grandi file, presenti su non sul repository locale,ma su cloud esterni,github,gilab,aws etc Backup di filesystem ● bup Gestione dei documenti per presentazioni scientifiche… latex,tex….
  • 37. Backup Come effettuo il backup di un repo git ? git bundle create /backup/repo --all Rispristino git clone /backup/repo myrepo Creare un repository bare git clone --bare myrepo /backup/my-repo.git
  • 38. Demo
  • 39. Hook Hooks Locali ● pre-commit ● post-commit ● post-checkout ● pre-push Hooks Remoti ● pre-receive ● post-receive ● update ● post-update
  • 40. CI : Continuos Integration è una pratica che si applica in contesti in cui lo sviluppo del software avviene attraverso un sistema di versioning. Consiste nell'allineamento frequente (ovvero "molte volte al giorno") dagli ambienti di lavoro degli sviluppatori verso l'ambiente condiviso (wikipedia) ● Travis CI ● Circle Ci ● TeamCity ● Drone.io Effettua la build per ogni push Effettua test per la build Effettua il deploy in ambienti di produzione Certezza che tutto l’ambiente e build sia replicabile “Ma sul mio computer compila….”
  • 41. Demo
  • 43. Docker Docker automatizza il deployment (consegna o rilascio al cliente, con relativa installazione e messa in funzione o esercizio, di una applicazione o di un sistema software tipicamente all'interno di un sistema informatico aziendale) di applicazioni all'interno di container software, fornendo un'astrazione aggiuntiva grazie alla virtualizzazione a livello di sistema operativo.
  • 44. Docker Vantaggi ● Gestione semplificata (non devo gestire una VM) ● Prototipazione veloce e semplice (docker hub) ● Sviluppo semplificato ● Isolamento ● Controllo di versione (ho bisogno di mysql 5.4.x, php 6.2.1,etc) ● oltre 10000 immagini su Docker Hub docker run -d -p 80:80 --name my-apache-php-app -v "$PWD":/var/www/html php:7.0-apache
  • 47.
  • 48. Risorse Repository di esempio Sito web devdayci.newshell.it https://github.com/arete/devdayci.newshell.it Sito web devday.newshell.it https://github.com/arete/devday.newshell.it
  • 49. Fine Don't ask to ask, just ask @gdiiorio @arete