Najvažnije iz članka
- GitHub Actions pruža nativno, fleksibilno i skalabilno CI/CD rješenje integrirano u GitHub, idealno za automatizaciju razvojnog ciklusa.
- Pipeline se definira YAML datotekama u `.github/workflows` i sastoji se od workflowa, jobova, koraka i akcija, pokretanih na raznim događajima.
- Osnovni CI workflow obuhvaća kloniranje koda, postavljanje okruženja, instalaciju ovisnosti, testiranje i izgradnju aplikacije.
- CD workflow se nadovezuje na CI, koristeći GitHub Secrets za sigurno rukovanje osjetljivim podacima poput API ključeva za deployment na platforme poput Heroku.
Sadržaj članka
- Zašto GitHub Actions?
- Razumijevanje Osnovnih Koncepata GitHub Actions
- Postavljanje CI/CD Pipelinea: Praktični Primjer
- Korak 1: Kreiranje repozitorija i osnovne aplikacije
- Korak 2: Postavljanje CI Workflowa (Integracija i Testiranje)
- Korak 3: Postavljanje CD Workflowa (Deployment)
- Korak 4: Razmatranja za naprednije scenarije
- Sigurnost i Najbolje Prakse
- Zaključak
Uvod u kontinuiranu integraciju i isporuku (CI/CD)
U današnjem svijetu brzih iteracija i agilnog razvoja softvera, Continuous Integration (CI) i Continuous Delivery/Deployment (CD) nisu samo "nice-to-have" značajke, već su temeljni stupovi uspješnog inženjeringa softvera. CI/CD pipeline automatizira ključne faze razvojnog ciklusa – od integracije koda, preko testiranja, do isporuke (deploymenta) aplikacije. Cilj je smanjiti ručne pogreške, ubrzati puštanje novih značajki i osigurati stabilnost proizvoda. Dok Continuous Integration osigurava često spajanje koda u zajedničku repozitorij, automatsko testiranje i rano otkrivanje problema, Continuous Delivery nadograđuje se na to osiguravajući da je softver uvijek u stanju spremnom za izdavanje. Continuous Deployment ide korak dalje, automatizirajući izdavanje svake uspješne build verzije u produkciju bez ljudske intervencije. U ovom vodiču fokusirat ćemo se na implementaciju CI/CD-a koristeći GitHub Actions, moćan alat integriran izravno u GitHub platformu.
Zašto GitHub Actions?
GitHub Actions nudi nativno rješenje za automatizaciju, što ga čini iznimno privlačnim za timove koji već koriste GitHub za upravljanje izvornim kodom. Nema potrebe za vanjskim alatima ili kompleksnom integracijom. Njegove ključne prednosti uključuju:
- Nativna integracija: Bez dodatnih alata ili servera za postavljanje. Sve je unutar GitHub repozitorija.
- Fleksibilnost: Podržava širok spektar programskih jezika, frameworka i platformi.
- Opsežan ekosustav: Velik broj predefiniranih akcija ("actions") dostupnih na GitHub Marketplaceu, što omogućuje brzo postavljanje kompleksnih workflowa.
- Skalabilnost: Lako se skalira s vašim projektom, od malih osobnih projekata do velikih poduzeća.
- Besplatno za javne repozitorije: Značajne besplatne minute za izvršavanje workflowa, čak i za privatne repozitorije.
Razumijevanje Osnovnih Koncepata GitHub Actions
Prije nego što zaronimo u praktičnu implementaciju, važno je razumjeti ključne komponente GitHub Actions:
- Workflow: Automatizirani proces sastavljen od jednog ili više jobova. Definiraju se u YAML datotekama unutar
.github/workflowsdirektorija u vašem repozitoriju. - Event: Događaj koji pokreće workflow. To može biti
pushna određenu granu,pull_request,issueotvoren,schedule(planirano vrijeme) ili ručno (workflow_dispatch). - Job: Skup koraka koji se izvršavaju na jednom runneru. Unutar workflowa, jobovi se mogu izvoditi paralelno ili sekvencijalno (ovisno o definiciji
needs). - Step: Pojedinačna naredba unutar joba. To može biti izvršavanje shell skripte, korištenje predefinirane akcije ili pokretanje Docker kontejnera.
- Action: Predefinirana, ponovno iskoristiva jedinica posla. Može biti razvijena od strane GitHub-a, trećih strana ili vašeg tima. Primjeri uključuju
actions/checkout@v3(za kloniranje repozitorija) iliactions/setup-node@v3(za postavljanje Node.js okruženja). - Runner: Virtualni server na kojem se izvode vaši jobovi. GitHub osigurava hostane runnere (Ubuntu, Windows, macOS), ali možete koristiti i vlastite "self-hosted" runnere.
Postavljanje CI/CD Pipelinea: Praktični Primjer
Za ovaj vodič, koristit ćemo jednostavnu Node.js web aplikaciju (npr. s Express.js) kao primjer. Pretpostavljamo da aplikacija ima package.json s scripts za install, test i build.
Korak 1: Kreiranje repozitorija i osnovne aplikacije
Prvo, osigurajte da imate GitHub repozitorij s nekom osnovnom aplikacijom. Na primjer, kreirajte index.js i package.json:
index.js:
const express = require('express');
const app = express();
const port = 3000;
app.get('/', (req, res) => {
res.send('Pozdrav iz CI/CD pipelinea!');
});
app.listen(port, () => {
console.log(`Aplikacija sluša na http://localhost:${port}`);
});
package.json:
{
"name": "ci-cd-example",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"start": "node index.js",
"test": "echo \"No tests specified\" && exit 0",
"build": "echo \"No build step required for this simple app\""
},
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {
"express": "^4.18.2"
}
}
Korak 2: Postavljanje CI Workflowa (Integracija i Testiranje)
Kreirajte direktorij .github/workflows u korijenu vašeg repozitorija. Unutar njega kreirajte YAML datoteku, npr. ci.yml.
name: CI Pipeline
on: [push, pull_request]
jobs:
build-and-test:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Setup Node.js environment
uses: actions/setup-node@v3
with:
node-version: '18'
- name: Install dependencies
run: npm install
- name: Run tests
run: npm test
- name: Build application (if applicable)
run: npm run build
- name: Archive production artifacts (optional)
uses: actions/upload-artifact@v3
with:
name: dist-files
path: dist/ # Pretpostavka da "build" generira u "dist" mapu
Objašnjenje workflowa ci.yml:
name: CI Pipeline: Ime vašeg workflowa, prikazano u GitHub Actions sučelju.on: [push, pull_request]: Workflow će se pokrenuti na svakipushna bilo koju granu i na svakipull_request.jobs:: Definira skup poslova koji će se izvršiti.build-and-test:: Ime prvog i jedinog joba u ovom primjeru.runs-on: ubuntu-latest: Specificira da će se ovaj job izvršiti na najnovijoj Ubuntu virtualnoj mašini koju GitHub nudi.steps:: Niz koraka unutar joba.uses: actions/checkout@v3: Standardna akcija za kloniranje vašeg repozitorija na runnera.uses: actions/setup-node@v3: Postavlja Node.js okruženje verzije18.run: npm install: Instalira sve ovisnosti specificirane upackage.json.run: npm test: Izvršava testove. U našem primjeru je to samo placeholder, ali ovdje bi stajale stvarne naredbe za testiranje (npr.jest,mocha).run: npm run build: Pokreće proces izgradnje aplikacije. Za kompleksnije aplikacije, ovo bi stvorilo produkcijske artefakte.uses: actions/upload-artifact@v3: (Opcionalno) Sprema rezultatebuildfaze kao artefakt. Ovo je korisno ako želite koristiti te artefakte u kasnijim deployment jobovima.
Commitajte ove datoteke i pushajte na GitHub. Trebali biste vidjeti pokretanje workflowa u tabu "Actions" vašeg repozitorija.
Korak 3: Postavljanje CD Workflowa (Deployment)
Deployment strategije variraju ovisno o okruženju (AWS, Azure, Google Cloud, Heroku, vlastiti serveri). Ovdje ćemo pokazati primjer deploymenta na Heroku, koji je relativno jednostavan za postaviti uz GitHub Actions.
Kreirajte novu YAML datoteku, npr. cd.yml u .github/workflows.
Prvo, morat ćete generirati Heroku API ključ. Uđite u Heroku dashboard, idite na Account settings, skrolajte do API Key sekcije i kliknite Reveal. Kopirajte taj ključ.
Na vašem GitHub repozitoriju, idite na Settings > Secrets and variables > Actions. Kliknite New repository secret i dodajte novi secret s imenom HEROKU_API_KEY i vrijednošću vašeg Heroku API ključa.
name: CD Pipeline to Heroku
on:
push:
branches:
- main # ili master, ovisno o imenu vaše glavne grane
env:
HEROKU_APP_NAME: your-heroku-app-name # Zamijenite s imenom vaše Heroku aplikacije
jobs:
deploy:
runs-on: ubuntu-latest
needs: build-and-test # Osigurava da se deployment pokreće samo ako CI prođe
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Install dependencies
run: npm install
- name: Deploy to Heroku
uses: akhileshns/heroku-deploy@v3.12.12
with:
heroku_api_key: ${{ secrets.HEROKU_API_KEY }}
heroku_app_name: ${{ env.HEROKU_APP_NAME }}
heroku_email: your-heroku-email@example.com # Zamijenite sa svojim Heroku emailom
Objašnjenje workflowa cd.yml:
name: CD Pipeline to Heroku: Ime workflowa.on: push: branches: - main: Ovaj workflow se pokreće samo kada se kod pusha namaingranu. Ovo je uobičajena praksa za CD, gdje semaingrana smatra stabilnom i spremnom za produkciju.env:: Definira varijable okruženja koje se mogu koristiti unutar ovog workflowa.HEROKU_APP_NAME: Ime vaše Heroku aplikacije. Ovo morate zamijeniti s pravim imenom vaše aplikacije.
jobs::deploy:: Ime joba za deployment.runs-on: ubuntu-latest: Pokreće se na Ubuntu runneru.needs: build-and-test: Ključno! Ovaj job će se izvršiti samo ako jebuild-and-testjob (izci.yml) uspješno završen. Ovo osigurava da se deploya samo kod koji je prošao testove.steps::uses: actions/checkout@v3: Klonira kod.run: npm install: Instalira ovisnosti (Heroku će to obično sam raditi pri buildanju, ali dobra praksa je imati i ovdje ako se koriste specifični pre-deployment skriptovi).uses: akhileshns/heroku-deploy@v3.12.12: Koristi popularnu akciju za deployment na Heroku.with:: Parametri za Heroku deploy akciju.heroku_api_key: ${{ secrets.HEROKU_API_KEY }}: Pristupa tajnom ključu koji smo ranije definirali. Nikada nemojte hardkodirati osjetljive podatke direktno u YAML datoteku!heroku_app_name: ${{ env.HEROKU_APP_NAME }}: Koristi varijablu okruženja za ime aplikacije.heroku_email: your-heroku-email@example.com: Zamijenite sa svojim Heroku emailom.
Nakon što ste kreirali cd.yml, commitajte ga i pushajte na GitHub. Ako je sve ispravno postavljeno i ci.yml je prošao, cd.yml bi se trebao automatski pokrenuti i deployati vašu aplikaciju na Heroku.
Korak 4: Razmatranja za naprednije scenarije
- Više okruženja (Staging/Production): Možete definirati različite deployment jobove za
staging(npr. push nadevelopgranu) iproduction(npr. push namaingranu nakon code reviewa i release tagova). - Matrice testiranja: Koristite
strategy.matrixu vašem YAML-u za testiranje aplikacije na različitim verzijama jezika (npr. Node.js 16, 18, 20) ili operativnih sustava. - Notifikacije: Integrirajte notifikacije (Slack, Teams, Email) da primate obavijesti o uspjehu ili neuspjehu buildova.
- Testiranje Docker kontejnera: Ako koristite Docker, možete buildati i pushati Docker slike u registar kao dio vašeg CI/CD pipelinea.
- Korištenje GitHub Packages: Možete objavljivati pakete (npm, NuGet, Maven) direktno na GitHub Packages registar.
- Granularne dozvole: Za produkcijske sustave, pažljivo upravljajte dozvolama tajnih ključeva (secrets) i osigurajte da samo potrebne akcije imaju pristup osjetljivim informacijama.
Sigurnost i Najbolje Prakse
- Nikada ne hardkodirajte tajne ključeve: Uvijek koristite GitHub Secrets za osjetljive podatke (API ključevi, pristupne lozinke, tokeni).
- Ograničite dozvole tokena: Workflows koriste
GITHUB_TOKENkoji ima automatske dozvole. Možete ograničiti opseg dozvola tog tokena unutarpermissionsbloka u vašem YAML-u (read-all,write-packages, itd.). - Validacija ulaza: Ako vaši workflowi prihvaćaju vanjske ulaze (npr. za ručno pokretanje), osigurajte da su ti ulazi validirani kako biste spriječili injekcijske napade.
- Redovito ažurirajte akcije: Koristite najnovije stabilne verzije akcija (npr.
actions/checkout@v3umjesto@v1ili@main). To osigurava sigurnosne zakrpe i nove značajke. - Provjeravajte akcije trećih strana: Budite oprezni pri korištenju akcija trećih strana. Provjerite njihov izvorni kod ili se oslonite na popularne i dobro recenzirane akcije.
- Logiranje i nadzor: Redovito pregledavajte logove vaših workflowa kako biste identificirali probleme i usko grla.
Zaključak
GitHub Actions transformira način na koji timovi razvijaju i isporučuju softver. Omogućuje vam da automatizirate zamorne i pogreškama sklone ručne procese, oslobađajući razvojni tim da se fokusira na pisanje koda i inovacije. Kroz ovaj vodič, pokrili smo osnove postavljanja CI/CD pipelinea, od konfiguracije prvog workflowa do deploymenta aplikacije. S obzirom na njegovu fleksibilnost i moć, GitHub Actions je postao neizostavan alat u arsenalu modernog softverskog inženjera. Implementacijom ovih principa ne samo da ćete poboljšati kvalitetu i pouzdanost vašeg softvera, već ćete značajno ubrzati i procese isporuke, što je ključno u dinamičnom digitalnom svijetu.
Komentari