Kontinuirana integracija i kontinuirana isporuka za web aplikacije
doc. dr. sc. Vedran Miletić, vmiletic@inf.uniri.hr, vedran.miletic.net
Fakultet informatike i digitalnih tehnologija Sveučilišta u Rijeci, akademska 2021./2022. godina
Motivacija
Programer ste u timu i popravili ste bug koji vam je bio dodijeljen, odnosno izvršili ste promjene u kodu nakon kojih na vašoj (razvojnoj) verziji aplikacije pokrenutoj lokalno izgleda da sve radi kako treba.
Možete li napraviti iste promjene na (produkcijskoj) verziji aplikacije, odnosno verziji koja je dostupna korisnicima?
Pomiješani osjećaji
Izvor: Mixed Feelings (MonkeyUser, 25th November 2021)
Povezane teme
- dvanaestofaktorska aplikacija
- rječnik pojmova oblaku urođenih aplikacija
- Developer Roadmaps: Frontend, Backend i DevOps
- primjena u tvrtkama:
- Cisco, kompanija temeljena na vlasničkom softveru: What is CI/CD?
- Red Hat, kompanija temelejna na slobodnom softveru otvorenog koda: What is CI/CD? (redhat.com), What is CI/CD? (opensource.com)
Beskonačna DevOps petlja
Izvor: Continuous Delivery Best Practices: Extent and Intent
Kontinuirana integracija
Kontinuirana integracija (engl. continuous integration, kraće CI) je prema Wikipediji:
- praksa spajanja svih radnih kopija programera u zajedničku glavnu razvojnu granu nekoliko puta dnevno
- američki programer Grady Booch je 1991. godine predložio pojam CI u svojoj knjizi pod naslovom Object Oriented Design with Applications
- nije zagovarao integraciju nekoliko puta dnevno, već nekoliko puta tjedno ili mjesečno, ovisno o projektu
- agilna metodologija ekstremno programiranje (engl. extreme programming, kraće XP) pretpostavlja da se zahtjevi korisnika/kupca jako brzo mijenjaju
- usvojila je koncept CI tako da zagovara integriranje više od jednom dnevno, možda i nekoliko puta na sat
Tijek rada kontinuirane integracije (1/2)
Najjednostavnije je lokalno pokretanje testova:
- programer pokreće automatizirane jedinične testove u svojoj lokalnoj okolini
- nakon što je završio s razvojem koda
- prije spajanja svojih promjena na glavnu granu
- never break the build: glavna grana uvijek prolazi testove, može se postaviti i pokrenuti
Izvor: How to set up an efficient development workflow with Git and CI/CD
Tijek rada kontinuirane integracije (2/2)
Uz lokalno izvođenje testova, moguće je i korištenje poslužitelja za CI koji:
- izgrađuje softver: povlači zavisnosti, pretvara izvorni kod u izvršni oblik i pretvara popratni sadržaj u oblik u kojem se može iskoristiti
- izgrađuje softver i izvodi testove
- izgrađuje softver, izvodi testove i vrši isporuku, odnosno postavljanje softvera ako su testovi uspješno prošli
- kontinuirana isporuka i kontinuirano postavljanje
- primjer: CI/CD Concepts (GitLab)
Izvor slike: CI/CD pipelines (GitLab)
Implementacije CI ili CI/CD (1/2)
Platforme u oblaku:
- GitHub Actions (prezentacija CI/CD značajki)
- GitLab CI/CD (primjeri korištenja)
- Atlassian Bitbucket Pipelines
- CircleCI
- JetBrains TeamCity
- Azure DevOps Server (shematski prikaz)
- AppVeyor
- Travis CI (otvoreni kod dostupan na GitHubu)
- Cirrus CI
- Semaphore itd.
Implementacije CI ili CI/CD (2/2)
Softveri otvorenog koda za samostalno postavljanje i održavanje:
Primjeri korištenja kontinuirane integracije
- Django pokreće testove kod svake promjene na dva sustava:
- Ruby on Rails koristi GitHub Actions i Buildkite
- Discourse koristi GitHub Actions
- phpBB koristi GitHub Actions
- PHP (interpreter) koristi Cirrus CI, AppVeyor, Azure Pipelines i Travis CI
- LLVM koristi vlastitu instancu Buildbota
- (primjer van weba) ns-3 koristi GitLab CI/CD
- konfiguracija se piše u obliku YAML
Dio CI skripte za jednostavan program u Pythonu
image: python:latest
before_script:
- python -V # Print out python version for debugging
- pip install virtualenv
- virtualenv venv
- source venv/bin/activate
- pip install -r requirements.txt
test:
script:
- pip install pytest
- venv/bin/pytest
run:
script:
- python program.py
Dio CI skripte za Django
services:
- mysql:latest
cache:
paths:
- ~/.cache/pip/
migrations:
stage: build
script:
- python manage.py makemigrations
# - python3 manage.py makemigrations myapp
- python manage.py migrate
- python manage.py check
django-tests:
stage: test
script:
- echo "GRANT ALL on *.* to user;"| mysql -u root -p pass -h mysql
- python manage.py test
Dio CI skripte za jednostavan program u Node.js-u
image: node:latest
services:
- redis:latest
- postgres:latest
cache:
paths:
- node_modules/
test_async:
script:
- npm install
- node ./specs/start.js ./specs/async.spec.js
test_db:
script:
- npm install
- node ./specs/start.js ./specs/db-postgres.spec.js
Nije to za nas
Izvor: Won't Work For Us (Comic Agilé #169)
Kontinuirana isporuka (1/2)
Kontinuirana isporuka (engl. continuous delivery, kraće CD) je prema Wikipediji:
- pristup programskom inženjerstvu u kojem timovi proizvode softver u kratkim ciklusima, osiguravajući da se softver može pouzdano postaviti
- u bilo kojem trenutku
- bez dodatnog ručnog rada kod postavljanja
- cilj je izgradnja, testiranje i izdavanje softvera velikom brzinom i učestalošću
- pomaže smanjiti troškove, vrijeme i rizik isporuke promjena dopuštajući dodatna ažuriranja aplikacija u produkciji
- izravni i ponovljivi postupak postavljanja je preduvjet kontinuirane isporuke
Kontinuirana isporuka (2/2)
Izvor: Wikimedia Commons File:Continuous Delivery process diagram.svg
Cjevovod postavljanja
Izvor: deployment pipeline {turnoff.us}
Kontinuirano postavljanje
Izvor: What is a CI/CD pipeline? (Red Hat Topics, Understanding DevOps)
Kontinuirano postavljanje (engl. continuous deployment, kraće CD) je prema Wikipediji:
- pristup u programskom inženjerstvu u kojem se programska funkcionalnost isporučuje automatiziranim postavljanjem na redovitoj bazi
- slijedi nakon s kontinuirane isporuke
- u fazi kontinuirane isporuke programska se funkcionalnost smatra potencijalno prikladnom za postavljanje, ali se postavljanje ne događa
- u fazi kontinuirane isporuke očekuje se ručno postavljanje
Primjer primjene CI/CD u praksi
- Dva developera rade promjene svaki na svojoj verziji softvera. Jedan od njih zaokruži cjelinu (npr. implementacija nove značajke, popravak buga) i lokalno izvede testove koji uspješno prođu.
- Taj developer zatraži od upravitelja projekta da uvrsti njegove promjene u glavnu granu stvaranjem zahtjeva za povlačenjem promjena (engl. pull request).
- Upravitelj projekta spaja upravo dobivene promjene s promjenama koje su izveli drugi developeri i povlači ih u probnu granu.
- Po dolasku promjena u probnu granu, aktivira se CI/CD sustav koji izvodi instalaciju zavisnosti, pokreće testove, postavlja konfiguraciju i pokreće aplikaciju pa javlja rezultate svih navedenih radnji.
- Ako je CI/CD uspješno prošao, promjene se (uz ručno odobrenje ili bez njega) povlače u glavnu granu i od tamo se vrši postavljanje aplikacije.
Zaključak
- dvanaestofaktorska, odnosno oblaku urođena aplikacija može automatizirati:
- integraciju
- isporuku
- postavljanje
- velik broj CI/CD alata
- usluge u oblaku
- alati otvorenog koda za samostalno postavljanje
- DevOps CI/CD Explained in 100 Seconds (Fireship)
Author: Vedran Miletić