Timski razvoj web aplikacija i upravljanje verzijama programskog koda
doc. dr. sc. Vedran Miletić, vmiletic@inf.uniri.hr, vedran.miletic.net
Fakultet informatike i digitalnih tehnologija, akademska 2021./2022. godina
Motivacija
Voditelj ste tima za razvoj aplikacija. Vaši programski inženjeri (kolokvijalno programeri, developeri) vam na redovnoj bazi šalju promjene u izvornom kodu koje su izveli i vi ih integrirate te vršite postavljanje aplikacije.
Na koji način ćete osigurati:
- da rad različitih programskih inženjera nije u konfliktu,
 - da verzija koju dobijete nakon integracije promjena radi barem jednako dobro kao trenutna, postojeća i
 - da proces postavljanja aplikacije svaki put izvedete bez pogreške?
 
Upravljanje verzijama
- Sinonimi: verzioniranje, upravljanje konfiguracijom
 - Uključuje pamćenje povijesti promjena na izvornom kodu softverskog projekta koji razvijate i njegovoj pripadnoj dokumentaciji (Wikipedia)
 
Razlozi za korištenje upravljanja verzijama
- Omogućuje povratak na prethodno stanje u slučaju potrebe pa možete odgovoriti na pitanja kao što su:
- Je li neka pogreška postojala u prethodnoj verziji?
 - Tko je napisao ovih 20-ak linija koda koje rade problem?
 - Koje su točno promjene od verzije 1.2.4 do verzije 1.2.7?
 
 - Omogućuje istovremeni rad više developera na više verzija softvera
- Primjerice, dva developera održavaju stabilnu verziju i popravljaju bugove u njoj dok pet developera razvija novu verziju
 
 - Omogućuje kontinuiranu integraciju i kontinuiranu isporuku/postavljanje
 
Povijesni pregled
- Source Code Control System (SCCS) na Unixu, 1970-te
 - Revision Control System (RCS)
 - Concurrent Versions System (CVS)
 - Subversion (SVN, moto projekta: "CVS done right")
-  
I see Subversion as being the most pointless project ever started. (...) There is no way to do CVS right.
-- Linus Torvalds, Google Tech talk on Git, 2007. (snimka)
 
 -  
 
Distribuirani pristup verzioniranju
- Kod centraliziranog pristupa sva povijest promjena je na jednom mjestu (CVS/SVN poslužitelj) i klijenti je povlače
 - Kod decentraliziranog pristupa sva povijest promjena je kod svakog sudionika u razvoju softvera i moguća je međusobna razmjena P2P (kao BitTorrent)
 - Git je de facto standard, ostali (Mercurial, BitKeeper, GNU Bazaar, Fossil itd.) su danas vrlo malo korišteni
 
Osnovni pojmovi
- Lokalni repozitorij (Git, Visual Studio Code)
- Spremanje promjena: 
commit 
 - Spremanje promjena: 
 - Udaljeni repozitorij (GitLab, GitHub); sinkronizacija s lokalnim:
- Povlačenje promjena s udaljenog repozitorija: 
pull - Guranje promjene na udaljeni repozitorij: 
push 
 - Povlačenje promjena s udaljenog repozitorija: 
 - Različiti programeri rade promjene neovisno na različitim granama pa se kasnije te grane spajaju u jednu granu koja sadrži sve promjene
- Grananje: 
branch - Spajanje grana: 
merge 
 - Grananje: 
 
Što sve verzionirati?
- Sve! (ne mora biti sve u jednom repozitoriju)
- Primjerice, Grupa za strukturu i funkciju biomolekula verzionira statičko web sjedište (repozitorij na GitHubu)
 
 - Izvorni kod
 - Testove
 - Skripte za izgradnju i punjenje baze podataka
 - Skripte i konfiguracijske datoteke za izgradnju i isporuku aplikacije
 - Dokumentaciju
 - Postavke DNS-a, postavke vatrozida
 
Što ne verzionirati?
- Datoteke koje se preuzmu ili stvore kod izgradnje softvera, primjerice:
- Node.js: direktorij 
node_modules, stvorit će ga npm kod izgradnje naredbomnpm installna temelju podataka upackage.json - PHP: direktorij 
vendor, stvorit će Composer kod izgradnje naredbomcomposer updatena temelju podataka u datotecicomposer.json 
 - Node.js: direktorij 
 - Git Large File Storage brine o velikim binarnim datotekama (slike, audiovizualne datoteke i sl.)
 
Kako verzionirati
- Redovito
 - Svako spremanje promjena čini cjelinu (npr. ako ne prolazi izgradnja softvera, popravite greške prije commita)
 - Nakon izvođenja testova
 - Inkrementalne promjene
 - Jasne poruke o promjenama u commitovima; usporedite:
- "Popravljena neka pogreška kod izvođenja"
 - "Promijenjen 
QuuxFactoryda odbije stvoriti prazne objekte kad je varijabla okolineHARDENED_DEFAULTSpostavljena na vrijednostenforce" 
 
Verzioniranje tuđeg koda
- Pod tuđim kodom podrazumijevamo biblioteke o kojima vaš softver ovisi
 - Nije vaš posao (tm)
 - Točne verzije navedene u datoteci s popisom paketa o kojima vaša aplikacija ovisi povući će npm za Node.js, Composer za PHP, pip za Python, RubyGems za Ruby, Maven za Javu, Nuget za C#, Cargo za Rust itd.
- Datoteku s popisom zavisnosti ćete verzionirati
 
 

NPM isporuka
Izvor: NPM Delivery (MonkeyUser, 4th July 2017)

Nadogradnja
Izvor: Update (MonkeyUser, 5th October 2021)
Verzioniranje konfiguracijskih datoteka
- Dvanestofaktorska aplikacija nema konfiguracijske datoteke, već koristi varijable okoline za konfiguraciju
 - Ako ih ima, verzioniraju se odvojeno od osnovne aplikacije
- npr. datoteka u formatu JSON sadrži 
"domain": "www.example.com","database-driver": "mongo","database-server-port": 5502,"file-storage-path": "/var/lib/fizz-buzz-enterprise-edition" 
 - npr. datoteka u formatu JSON sadrži 
 - Nemojte verzionirati zaporke, parove (SSH) ključeva i certifikate
 
Načini korištenja Gita u razvoju softvera
- GitLabov pregled nekoliko mogućih načina korištenja Gita
 - Atlassianov opis mogućih načina korištenja Gita:
 
 Author: Vedran Miletić