Ukratko

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
  1. Zašto GitHub Actions?
  2. Razumijevanje Osnovnih Koncepata GitHub Actions
  3. Postavljanje CI/CD Pipelinea: Praktični Primjer
  4. Korak 1: Kreiranje repozitorija i osnovne aplikacije
  5. Korak 2: Postavljanje CI Workflowa (Integracija i Testiranje)
  6. Korak 3: Postavljanje CD Workflowa (Deployment)
  7. Korak 4: Razmatranja za naprednije scenarije
  8. Sigurnost i Najbolje Prakse
  9. 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/workflows direktorija u vašem repozitoriju.
  • Event: Događaj koji pokreće workflow. To može biti push na određenu granu, pull_request, issue otvoren, 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) ili actions/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 svaki push na bilo koju granu i na svaki pull_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 verzije 18.
        • run: npm install: Instalira sve ovisnosti specificirane u package.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 rezultate build faze 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 na main granu. Ovo je uobičajena praksa za CD, gdje se main grana 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 je build-and-test job (iz ci.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 na develop granu) i production (npr. push na main granu nakon code reviewa i release tagova).
  • Matrice testiranja: Koristite strategy.matrix u 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_TOKEN koji ima automatske dozvole. Možete ograničiti opseg dozvola tog tokena unutar permissions bloka 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@v3 umjesto @v1 ili @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.

Izvori i dodatno čitanje

  1. GitHub Actions Documentation
  2. Heroku Deployment Action for GitHub Actions
  3. Understanding Continuous Integration and Delivery
B
Uredništvo portala

BAJT

Službeni autorski profil redakcije portala BAJT. Sadržaj priprema i provjerava uredništvo portala.