Tutorijal: Kontinuirana integracija i isporuka (CI/CD)

Uvod u CI/CD za DevOps inženjere

Kontinuirana integracija (CI) i Kontinuirana isporuka (CD) su ključne prakse u DevOps-u koje omogućavaju timovima da isporučuju softver brže, pouzdanije i sa većim kvalitetom. CI/CD pipeline automatizuje procese build-a, testiranja i deployment-a, smanjujući manuelni rad i rizik od grešaka. Za DevOps inženjera, razumevanje i implementacija CI/CD-a je fundamentalna veština. Ovaj tutorijal će vas provesti kroz principe CI/CD-a, ključne alate i praktične primere implementacije.

Zašto su CI/CD ključni u DevOps-u?

CI/CD donosi brojne prednosti koje su u srcu DevOps filozofije:

Kontinuirana integracija (CI)

Kontinuirana integracija je praksa u kojoj razvojni timovi često integrišu svoj kod u zajednički repozitorijum (npr. Git). Svaka integracija se automatski verifikuje build-om i automatizovanim testovima.

Principi CI-a

  1. Česte integracije: Programeri integrišu kod više puta dnevno, umesto jednom nedeljno ili mesečno.
  2. Automatizovan build: Svaka integracija pokreće automatizovan build proces koji kompajlira kod, pokreće testove i kreira artefakte.
  3. Automatizovano testiranje: Jedinični testovi, integracioni testovi i drugi automatizovani testovi se pokreću kao deo build procesa.
  4. Brza povratna informacija: Tim dobija brzu povratnu informaciju o statusu build-a i testova, omogućavajući brzo rešavanje problema.
  5. Održavanje build-a zelenim: Cilj je da build uvek bude uspešan (

zelenim), što znači da svi testovi prolaze i da nema grešaka.

Alati za CI

Praktičan primer: Jednostavan CI pipeline sa GitHub Actions

Ovaj primer pokazuje kako se može kreirati jednostavan CI pipeline za Python aplikaciju koja pokreće testove.

Kreirajte fajl .github/workflows/python-app.yml u vašem repozitorijumu:

name: Python CI

on:
  push:
    branches:
      - main
  pull_request:
    branches:
      - main

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v4
    - name: Set up Python 3.x
      uses: actions/setup-python@v5
      with:
        python-version: '3.x'
    - name: Install dependencies
      run: |
        python -m pip install --upgrade pip
        pip install -r requirements.txt
    - name: Run tests
      run: |
        pytest

Ovaj pipeline će se pokrenuti pri svakom push-u na main granu ili pri svakom pull requestu. Instaliraće Python zavisnosti iz requirements.txt i pokrenuti pytest testove.

Kontinuirana isporuka (CD)

Kontinuirana isporuka je praksa u kojoj se softver, nakon uspešne CI faze, automatski priprema za izdanje. To znači da je u svakom trenutku spreman za deployment u produkciju, iako se deployment u produkciju može pokrenuti manuelno.

Principi CD-a

  1. Automatizovan deployment: Proces deploymenta je potpuno automatizovan i može se pokrenuti pritiskom na dugme.
  2. Deployment na različita okruženja: Softver se deployuje na testna, staging i produkciona okruženja na konzistentan način.
  3. Verzije artefakata: Svaki build proizvodi verziran artefakt koji se može deployovati.
  4. Rollback mogućnost: Uvek postoji mogućnost brzog vraćanja na prethodnu stabilnu verziju u slučaju problema.

Alati za CD

Alati za CD se često preklapaju sa CI alatima, jer mnogi CI alati nude i CD funkcionalnost. Dodatno, koriste se i alati za upravljanje konfiguracijom i orkestraciju:

Deployment strategije

Praktičan primer: Jednostavan CD pipeline sa Jenkinsom i Ansible-om

Ovaj primer opisuje korake za jednostavan CD pipeline koji koristi Jenkins za orkestraciju i Ansible za deployment na udaljeni server.

Jenkinsfile (Pipeline as Code):

pipeline {
    agent any

    stages {
        stage('Build') {
            steps {
                echo 'Building the application...'
                // Ovde bi išao build komanda, npr. mvn clean install ili npm run build
                sh 'echo "Simuliram build..." > app.jar'
            }
        }
        stage('Test') {
            steps {
                echo 'Running tests...'
                // Ovde bi išli testovi, npr. pytest ili unit tests
                sh 'echo "Simuliram testove..."'
            }
        }
        stage('Deploy to Staging') {
            steps {
                echo 'Deploying to Staging environment...'
                // Pokreni Ansible playbook za staging
                sh 'ansible-playbook -i staging_inventory.ini deploy_app.yml'
            }
        }
        stage('Manual Approval for Production') {
            steps {
                input message: 'Approve deployment to Production?'
            }
        }
        stage('Deploy to Production') {
            steps {
                echo 'Deploying to Production environment...'
                // Pokreni Ansible playbook za production
                sh 'ansible-playbook -i production_inventory.ini deploy_app.yml'
            }
        }
    }
}

Ansible Playbook (deploy_app.yml):

---
- name: Deploy Web Application
  hosts: webservers
  become: yes

  tasks:
    - name: Stop web server
      systemd: name=nginx state=stopped

    - name: Copy application artifact
      copy:
        src: app.jar # Pretpostavimo da je ovo artefakt iz Jenkins builda
        dest: /var/www/html/app.jar

    - name: Start web server
      systemd: name=nginx state=started

    - name: Ensure web server is enabled and running
      systemd: name=nginx state=started enabled=yes

Ansible Inventory (staging_inventory.ini):

[webservers]
staging_web_server ansible_host=192.168.1.10

Ansible Inventory (production_inventory.ini):

[webservers]
prod_web_server_1 ansible_host=10.0.0.1
prod_web_server_2 ansible_host=10.0.0.2

Ovaj primer pokazuje kako se Jenkins pipeline može integrisati sa Ansible-om za automatizovan deployment na različita okruženja, uključujući i manuelnu potvrdu pre produkcije.

Zaključak

Kontinuirana integracija i isporuka su srž modernog DevOps-a. Automatizacijom procesa build-a, testiranja i deployment-a, timovi mogu značajno poboljšati brzinu, pouzdanost i kvalitet isporuke softvera. Kao DevOps inženjer, ovladavanje CI/CD principima i alatima je ključno za vaš uspeh i doprinos timu. Kontinuirano učenje i eksperimentisanje sa različitim alatima i strategijama će vam pomoći da postanete ekspert u ovoj oblasti.

Reference


Autor: Manus AI Datum: 27. jul 2025.