Make: Alat za olakšavanje rutinskih zadataka u programiranju

Autor: Ante Crnogorac, Devōt, Tech Lead

Koji je tajni zakleti neprijatelj svakog developera? Dosada!

Ante Crnogorac

Govorimo o malo drugačijem tipu dosade od klasične, obične dosade. Iako imaš tonu posla i ne bi ti trebalo biti dosadno – radiš dosadne stvari, na poslu stagniraš i općenito gubiš hrpetinu energije na repetitivne gluposti ili “reinventing the wheel”.

Iz dana u dan ista je priča, setupiraj projekt, napravi CRUD-ić, onboardaj novog developera i satima mu pomaži setupirati projekt, pokreni sve code quality i testing alate prije commitanja, piši dokumentaciju, pa opet postavi projekt, ali na Macu, i tako ukrug.

Količina vremena koja se izgubi na te zadatke je nevjerojatna, posebno ako se, kao ja, zainatite i samo jedan jedini tjedan zabilježite koliko ste vremena na to potrošili. Pomnožite to s brojem tjedana i brojem kolega u timu i dobijete godišnju količinu sati (čitaj: mjeri se u tjednima) koja je nepovratno izgubljena, a često je i teško naplativa klijentima.

Make(file) kao odgovor na dosadu

Što je Make?

Nećemo puno pametovati. Naš AI prijatelj kaže ovako: “The Linux make command is a commonly used utility by sysadmins and developers. The command assists in the compilation process and is a must-have tool for building large applications. This utility cuts out repetition and speeds up compilation, saving time.”

Ovo zvuči točno kao ono što nam treba, zar ne? Krenimo setupirati taj mistični tool.

Kako ga instalirati?

Make dolazi u paketu s bilo kojim Mac ili Linux operativnim sustavom. Unesite make u konzoli da provjerimo da sve radi. Kod Windowsa je malo složenije – instalirate Chocolatey (Windows ekvivalent brew-a ili apt-a), a Make se instalira s jednim brzim choco install make.

Makefile na prosječnom projektu

1. Setup Makefile-a

Nakon što smo instalirali Make na OS, idemo napraviti setup na projektu. U projektnom folderu zviznete touch Makefile i to je manje-više to. Nakon toga je cilj Makefile napuniti korisnim naredbama.

2. Ali, prvo dokumentacija!

Note: OBAVEZNO je koristiti tabove umjesto razmaka za indentaciju naredbi. Makefile ne voli razmake (osim unutar navodnika!). Simbol @ nam služi da se komanda ispred koje se stavlja “-” ne ispisuje u konzoli kao output.

Nitko ne želi po kodu tražiti što naredbe rade – dokumentacija je najvažnija. Po defaultu, “make” prikaže dokumentaciju ako se pokrene bez argumenata. Inicijalno je prazan, pa prikaže grešku “No Targets”. Idemo mu dodati naredbu, dokumentirati što radi. Dodajemo blok “default” kao u snippetu, s hrpom “echo” naredbi kako bismo na ekranu prikazali što točno imamo od naredbi u ovom Makefile-u.

Kreirajmo Makefile sa sljedećim sadržajem:

Ako sad u konzoli upišemo:

Dočekat će nas lijepi ekrančić u ovom stilu:

3. Definiranje naredbi

Sada kada smo napisali dokumentaciju i naveli da imamo tri komande – tests, cs i md, red je da definiramo što svaka od njih radi. Stoga dodajemo na dno Makefile-a sljedeći snippet:

Ovaj dio koda će Makefileu definirati što se događa kada bilo koji od tih “named blokova” dodamo kao prvi argument. Make u tom slučaju samo izvršava komande tim redoslijedom.

4. Slijedno izvršavanje više naredbi (tzv. chaining)

S obzirom na to da se radi o DevOps/Developer alatu, iz gornjeg primjera vidimo kako sada imamo jednostavan način za pokretanje tri alata – Code Style Checker, Mess Detector i PHPUnita koji vrti functional testove.

Ipak, prije nego što sve stavimo u produkciju, moramo pokrenuti 3 (slovima: TRI) komande. Nitko nema vremena za to – možemo mi to i bolje.

Upoznajmo Make command chaining – vrlo jednostavan način gdje svoje build procese možete redom nanizati i tako automatizirati brojne stvari. Na primjer, definirat ćemo master komandu quality koja će biti zaslužna za pokretanje svih code quality i testing alata, pri čemu su u našem slučaju sva tri već definirana. Pa krenimo s dokumentacijom – dodajemo dodatnu liniju u default blok:

Pa definirajmo samu “quality” komandu na sljedeći način:

Kada nakon toga pokrenemo make quality – odvrtjet će se sve akcije definirane u samoj “quality” komandi, a iza nje nanizati i sve navedene desno od dvotočke.

Što je sa shell commandama?

Kombiniranje shell commandi i Makefile-a radi odlično – jednostavno ih dodajte kao naredbe unutar Makefile komandi. Na primjer, možete to učiniti ovako:

make launch izbildati će Docker containere, pokrenuti ih i pokrenuti shell commandu /scripts/launch.sh, a u njoj pak možemo imati jednu, pet ili čak pedeset drugih shell komandi koje se možda moraju izvršiti unutar Docker containera.

6. Pretvorimo Makefile output u umjetnost – farbanjem outputa 🙂

Prvo, mali šalabahter:

Zatim, u revijalnom tonu, nova komanda colors: u dokumentaciju (dodate sami) i nova definicija komande na sljedeći način, koristeći tput setaf za boju slova i tput setab za boju pozadine:

Istina, nije neka elegancija poput korištenja <html> tagova, no i nije potrebno, iskustvo pokazuje da je dovoljno samo bojom istaknuti opisne naslove pojedinačnih komandi. Kada stvorimo komandu koja ih slijedno izvršava, izgledat će super-profesionalno.

Make u praksi

Jednostavniji README.md

Svi smo radili na jednom ili više projekata gdje potrošimo prvih tri dana onboardinga na postavljanje projekta, čitajući upute za postavljanje iz README.md koje Pero i Mirko nisu ažurirali od pretprošlog Božića, pa pola toga ne radi. Osim toga, tu su i problemi jer upute podrazumijevaju lokalno instalirani nginx i MySQL i slično.

Sve to me prije nekoliko godina potaknulo da svaki projekt na kojem radim organiziram tako da sadržaj dokumentacije u README.md za setup projekta izgleda otprilike ovako:

Ovo omogućava da se developera vodi za ručicu i pita za vrijednosti svih access keyeva, GitHub tokena i passworda, a na kraju mu izbaci i mini upute o tome koji URL otvoriti i gdje se što nalazi.

Takav pristup se u praksi pokazao kao nekih 2-3 sata posla po projektu, plus 1-2 sata dodatno za ažuriranje Makefilea kroz SDLC jednog projekta. Ukupno zaokruženo, to je maksimalno 6 sati truda – a rezultat je ušteda – nebrojenih desetaka sati na setupu, pokretanju različitih komandi i povlačenja senior kolega za rukave.

Kako to Devōt radi?

Za kraj, jedan primjer kako Devōt koristi Makefile na jednom svojem projektu, nazovimo ga “Top Secret”. Prikazujemo samo komandu make install:

Ukratko opisano, komanda uz lijepo formatirani i obojeni output u konzoli:

  • Pokreće naredbe koje kreiraju vašu lokalnu konfiguraciju
  • Pokreće dockeriziranu aplikaciju
  • Traži od vas da unesete sve passworde, URL-ove i secret keyeve
  • Downloada vendor libraryje
  • Odrađuje build process
  • Pokreće migracije na bazi i napuni ju podacima
  • Objašnjava vam što trebate dodati u /etc/hosts file
  • Prikazuje URL-ove različitih verzija API dokumentacije

I sve to na način gdje manje iskusni kolege mogu pogledati naredbu i iz priloženih komentara shvatiti većinu koraka samog procesa postavljanja.

Ideje za dalje

Make je superkoristan alat i postoje još mnoge opcije, mogućnosti i trikovi kojima si možete olakšati život. Međutim, navest ćemo samo nekoliko korisnih komandi koje često koristimo, dok ostatak prepuštamo vama (ipak se vi bavite inženjeringom 🙂 )

wipe: – Resetira projekt na tvorničke postavke

db-backup: – Kreira database dump (na ispravan način!)

nginx-logs: – Taila s followom logove na nginx containeru

quality: – Pokreće sve dostupne alate za provjeru kvalitete koda, standarde i analizu

fixtures: – Natoči sve potrebne inicijalne podatke u bazu podataka

urls: – Prikazuje URL-ove projekta (Frontend, Backend, vanjski servisi itd.)

docs: – Regenerira svu dokumentaciju

cache-reset: – Briše sav cache aplikacije

Kako ne biste nepovratno gubili vrijeme, Make je odličan alat koji optimizira i automatizira mnoge “dosadne” zadatke. Ako imate dodatnih pitanja o tome kako mi u Devōtu štedimo vrijeme ili želite saznati više o našim metodama, slobodno nam se javite.