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 install
na temelju podataka upackage.json
- PHP: direktorij
vendor
, stvorit će Composer kod izgradnje naredbomcomposer update
na 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
QuuxFactory
da odbije stvoriti prazne objekte kad je varijabla okolineHARDENED_DEFAULTS
postavljena 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ć