Скалирање и оптимизација ЦИ/ЦД

Implementacija CI/CD tokova posla u razvoju aplikacija postaje sve raširenija. Međutim, istovremeno, skaliranje i optimizacija CI/CD-a predstavljaju značajan izazov.

U ovom tekstu ćemo detaljno razmotriti prirodu ovog izazova i istražiti konkretne načine kako možemo efikasno skalirati i optimizovati CI/CD. Zato nastavite da čitate!

Danas se razvoj aplikacija najčešće odvija u timovima koji broje nekoliko programera. Svaki pojedinac ili tim ima svoju specifičnu ulogu u projektu, napredujući u svom delu posla.

Kada se projekat privodi kraju, često se suočavamo sa mnoštvom delova koda koje treba objediniti. U zavisnosti od metoda rada svakog člana tima, značajno vreme može biti izgubljeno na upravljanje ovom integracijom.

CI/CD, odnosno kontinuirana integracija i kontinuirana isporuka/implementacija, predstavlja rešenje za ovaj problem. Osigurava da se ažuriranja objavljuju bez nepotrebnih zastoja i konflikata. Hajde da detaljnije razumemo ovaj proces.

Kontinuirana integracija

CI ili Continuous Integration objedinjuje procese koji imaju za cilj kontinuirano objavljivanje promena koda i dodataka u zajedničku granu projekta. Ovo omogućava testiranje koda i vršenje poboljšanja u realnom vremenu. Glavni cilj je testirati svaki element kreiranjem odgovarajućih testova.

Ova kontinuirana praksa omogućava izbegavanje provere svega odjednom na kraju, kao i rada na previše elemenata istovremeno. Izvođenje unit testova je veoma korisno za postizanje ovog cilja. Na taj način je lakše otkriti greške, osiguravajući da se kod dobro kompajlira i da ne stvara regresije.

Kontinuirana isporuka

Kontinuirana isporuka ili CD objedinjuje kontinuiranu integraciju i testiranje, omogućavajući da se sve spakuje u kontejnere i postavi u produkciju. Drugim rečima, prikuplja ove kodove i obavljena testiranja i, kroz automatizaciju, prebacuje ih u produkciju.

Iako može zahtevati ljudsku intervenciju, ovaj proces postaje automatizovan tako što se sve što je urađeno „pušta u etar“ na integrisan i kompletan način. Konkretno, uz kontinuiranu distribuciju, naša aplikacija je razvijena tako da se može pustiti u produkciju u bilo kom trenutku.

Kontinuirana implementacija

Iako su koncepti kontinuirane isporuke i kontinuirane implementacije slični, postoje suštinske razlike. Iako im je cilj isti, odnosno uvođenje aplikacije u produkciju, sredstva za postizanje istog se razlikuju. Ključna razlika između kontinuirane isporuke i kontinuirane implementacije je u procesu puštanja.

Kontinuirana implementacija omogućava direktnu primenu svake modifikacije koja prođe sve faze našeg procesa. Dok je u kontinuiranoj isporuci, neophodan korak ljudske validacije da bi se implementacija desila.

Skaliranje CI/CD

Kada se broj mikrousluga poveća, skaliranje CI/CD-a postaje gotovo neizbežno. Povećan broj mikrousluga rezultira različitim cevovodima povezanim sa jednim Git repozitorijumom, što povećava opterećenje CI servera i smanjuje performanse.

Da biste efikasno skalirali CI/CD, neophodno je kreirati standardizovan i automatizovan razvojni cevovod za sve timove. Na taj način se osigurava kvalitet pojedinačnih isporuka programera i timskih isporuka. Ovo takođe olakšava upravljanje samim cevovodom.

Skaliranje se postiže definisanjem CI procesa za izvršavanje unit testova i validacijom kvaliteta isporučenog koda.

Nakon toga sledi CD proces za pravljenje slika i njihovo postavljanje u okruženja na kontinuiran način. Konačno, definiše se proces za pravljenje slika i njihovo primenjivanje u produkcionom okruženju.

Koraci za skaliranje CI/CD

Prvi korak je usklađivanje cevovoda sa arhitektama, uključujući vođe timova. To obuhvata mapiranje Git grana u okruženja (razvoj -> razvoj i master -> [homologacija i produkcija]). Zatim se pokreće CI zadatak pri svakom zahtevu za povlačenje (pull request) i CD zadatak pri svakoj promeni u mapiranim granama.

Može se kreirati detaljan tok poslova za CI i CD koje je potrebno pratiti.

Tok poslova CI se razvija u 7 koraka:

  • Pregled izvorne i odredišne grane Zahteva za povlačenje;
  • Provera da li spajanje nema konflikte koji zahtevaju ručno rešavanje;
  • Pokretanje unit testova;
  • Kreiranje paketa da bi se proverio integritet i da je kod kompajliran;
  • Aktiviranje provere kvaliteta koda;
  • Povećanje i upisivanje verzije projekta u izvornu granu;
  • Obaveštavanje Git spremišta Zahteva za povlačenje o uspehu ili neuspehu putem Webhook ili REST API poziva (Git Repozitorijum).

Tok CD posla prati sledeću putanju:

  • Odabrana filijala se odjavljuje.
  • Artifakt se kreira korišćenjem specifičnog alata za izradu projekta na kome se radi.
  • Nakon što artifakt stigne, bibliotečki projekti se šalju u Nexus za skladištenje artifakata, čime je tok završen.

Sprovode se sledeće radnje:

Korak 1: Docker slika se kreira za generisani artifakt, primenjujući verziju artifakta na Docker sliku.

Korak 2: Slika se otprema u Docker registar.

Korak 3: Implementacija se vrši putem predstavljanja slike preko Kubernetes-a.

Za aplikacione projekte koji se nalaze u okruženju za odobrenje/proizvodnju, prate se koraci 1 i 2 navedeni iznad, a zatim sledeće:

  • Primena se vrši putem uvođenja slike preko Kubernetes-a u okruženju za odobrenje;
  • Posao uzima pauzu da sačeka odobrenje za proizvodnju;
  • Ako se odobri, slika koja se odobrava se promoviše za proizvodnju;
  • U suprotnom, vraća se slika u odobrenje.

CI/CD Optimizacija

CI/CD značajno poboljšava razvojni ciklus aplikacije, rešavajući problem koji nastaje integracijom novog koda i povećanjem učestalosti isporuke.

Sledi kako možete dodatno optimizovati upotrebu CI/CD-a:

Dajte prioritet popravljanju neispravne verzije

Kada dođe do problema sa gradnjom, njeno popravljanje treba da bude prioritet tima. Ako se verzija ne može popraviti u roku od nekoliko minuta, tim treba da odluči da li da ukloni kod ili da onesposobi problematičnu funkciju.

Cilj popravljanja neispravne verzije je da se obezbedi da će uvek postojati funkcionalan kod koji se može objaviti.

Manja, češća raspoređivanja

Generalno, stabilnost aplikacije je ugrožena svakom implementacijom. Zbog toga se često dešava da se raspoređivanja razmaknu. Problem ovakvog pristupa je što se nagomilava previše promena. Jedna od tih promena bi mogla da izazove problem, što bi nas primoralo da vratimo i ostale koje su bile ispravne.

Primenite strategiju „davitelja“ i razbijte kompleksne promene na manje i jednostavnije delove. Ukoliko se implementacija vrši češće i u malim serijama, rizik od problema pri implementaciji se značajno smanjuje.

Automatizujte QA testove za smanjenje rizika

Verovatno smo se svi našli u situaciji „radi na mojoj lokalnoj mašini“, jer se lokalna razvojna okruženja često razlikuju. Može postojati mnogo razlika između vašeg lokalnog okruženja i onoga u kome će aplikacija raditi u produkciji. Možete da optimizujete CI/CD tako što ćete automatizovati zadatke obezbeđenja kvaliteta (QA), kao što je testiranje pretraživača. Na ovaj način smanjujete rizik da greška dođe do aktivne aplikacije.

Verujte automatizovanim testovima

Da bi potvrdio da li je kod koji je programer integrisao ispravan, CI se oslanja na automatizovan i pouzdan test paket. Ukoliko je potrebno da prevedete kod, prvi test je da li se on kompajlira. Nakon toga možete dodati onoliko testova koliko smatrate da je kritično.

Koliko testova treba uključiti? Da biste to utvrdili, zapamtite da je cilj CI da pruži povratnu informaciju što je brže moguće. Ako programer mora da čeka sat vremena da dobije povratne informacije, to neće funkcionisati. Uvek će postojati stvari koje će nedostajati, ali kada uočite grešku u produkciji, kreirajte test i uključite ga u CI ciklus.

Uvek vodite računa o bezbednosti

Razmislite o bezbednosti CI/CD alata dok ih integrišete u postojeće konfiguracije ili okruženja. CI/CD zahteva da se svi alati za testiranje bezbednosti pozivaju programski i da se njihovi rezultati agregiraju na jednom mestu. Potražite alate koji imaju API-je za automatske revizije šifrovanja.

Prednosti skaliranja i optimizacije CI/CD-a

Pored povećanja efikasnosti razvojnih timova, skaliranje i optimizacija CI/CD-a imaju i druge važne prednosti, od kojih su neke:

Smanjeni troškovi

Sati razvoja se obično naplaćuju, ali šta je sa vremenom utrošenim na ručno postavljanje koda ili fajlova? Automatizacija velikih delova vašeg toka će uštedeti vreme za rad koji se naplaćuje, što svi cene. Automatsko testiranje vam takođe omogućava da ranije identifikujete greške, umesto da ih pronađete u QA ili produkciji, ili još gore, da ih klijent pronađe. Više ispravljenih grešaka za isto vreme predstavlja veliku prednost.

Isporuka sa manje grešaka i manjim rizikom

Greške se otkrivaju mnogo ranije u procesu razvoja tako što se češće objavljuju manje promene. Kada implementirate automatizovane testove u svim fazama razvoja, ne rizikujete da prenesete neispravan kod u sledeću fazu. Takođe je lakše vratiti manje promene kada je to potrebno.

Brže reagovanje na tržišne uslove

Uslovi na tržištu se konstantno menjaju. Pretpostavimo da otkrijete da novi proizvod gubi prihod ili da više kupaca pristupa vašoj web lokaciji sa pametnih telefona nego sa laptopa. U tom slučaju, mnogo je lakše napraviti brzu promenu ukoliko ste optimizovali kontinuiranu isporuku.

Samopouzdanje

Ako ste optimizovali CI/CD, što znači da imate robustan testni paket, vaše samopouzdanje da nećete poslati grešku značajno raste. Ukoliko ste transparentni u svom procesu i edukujete ostatak svog tima i klijente, povećava se i njihovo poverenje u vas kao razvojni tim.

Završne reči

CI/CD čini vaše integracije i isporuke bržim. Međutim, važno je da se proces skalira i optimizuje kako bi se izbegla kontraproduktivnost zbog povećane složenosti.

Možete pogledati i neke od najboljih CI alata.