ОНОЛ 09

CI/CD ба DevOps Үндэс

ЛЕКЦ 09: CI/CD БА DEVOPS ҮНДЭС (CI/CD & DevOps Fundamentals)

Хичээлийн зорилго: CI/CD (Continuous Integration / Continuous Delivery) ба DevOps-ийн суурь ойлголт, соёл, практик, хэрэгслүүдийг эзэмшүүлэх. GitHub Actions ашиглан Java/Spring Boot төслийн автоматжуулалтыг бодит жишээгээр суралцах.

Хамрах хүрээ: DevOps соёл, CI/CD pipeline, GitHub Actions, Docker суурь, автомат тест, код шалгалт, deploy стратеги, monitoring, Infrastructure as Code ойлголт.



ХЭСЭГ 1: ОНОЛЫН СУУРЬ (Theory & Foundations)

1.1 DevOps гэж юу вэ?

DevOps = Development (Хөгжүүлэлт) + Operations (Ашиглалт). Хөгжүүлэлт ба ашиглалтын багийг нэгтгэж, програм хангамжийг хурдан, найдвартай, байнга хүргэх соёл, практик, хэрэгслүүдийн нэгдэл.

💡 Зүйрлэл: Хуучин арга = Тогооч (Dev) хоол хийж, зөөгч (Ops) түгээнэ — бие биенээсээ мэдэхгүй. DevOps = Тогооч + Зөөгч хамтдаа ажиллаж, хоолыг хурдан, чанартай хүргэнэ.

Уламжлалт vs DevOps

ШинжУламжлалт (Waterfall/Silo)DevOps
БагDev ба Ops тусдааНэгдсэн баг
DeployСард/улиралд 1 удааӨдөрт олон удаа
Алдаа олохDeploy-ийн дарааХөгжүүлэлтийн явцад
ТестГараар, төгсгөлдАвтомат, байнга
Хариу үйлдэлУдаан (долоо хоног)Хурдан (минут, цаг)
Соёл"Энэ миний ажил биш""Бүгд хариуцна"

DevOps-ийн гол зарчмууд (CALMS)

ЗарчимАнглиТайлбар
CCultureХамтын ажиллагааны соёл
AAutomationДавталттай ажлыг автоматжуулах
LLeanХог хаягдлыг багасгах, урсгалыг сайжруулах
MMeasurementБүх зүйлийг хэмжих (deploy хугацаа, алдааны хувь)
SSharingМэдлэг, туршлага хуваалцах

1.2 CI/CD гэж юу вэ?

1.2.1 CI — Continuous Integration (Байнгын нэгтгэл)

CI = Хөгжүүлэгчид кодоо өдөр бүр (эсвэл олон удаа) үндсэн branch руу нэгтгэж, автоматаар build, тест ажиллуулах.

Хөгжүүлэгч A ──push──► Git Repository ──trigger──► CI Pipeline
                                                      │
Хөгжүүлэгч B ──push──►                               ▼
                                               ┌─────────────┐
                                               │  Build       │
                                               │  Unit Test   │
                                               │  Code Quality│
                                               │  Report      │
                                               └─────────────┘

CI-ийн ашиг тус:

  • Нэгтгэлийн алдааг ЭРАТ олох (Integration Hell-аас зайлсхийх)
  • Автомат тестээр кодын чанарыг баталгаажуулах
  • "Миний компьютерт ажилладаг" асуудлыг шийдэх
  • Хөгжүүлэгчид итгэлтэй, хурдан ажиллах

1.2.2 CD — Continuous Delivery / Deployment

Continuous Delivery = CI + Автомат build → Staging орчинд бэлэн болгох (Deploy гараар)

Continuous Deployment = CI + Автомат build → Production руу АВТОМАТААР deploy

┌──────────────────── CI ────────────────────┐  ┌── CD (Delivery) ──┐  ┌── CD (Deploy) ──┐
│ Code → Build → Unit Test → Integration Test│→ │ Staging → QA Test │→ │ Production      │
└────────────────────────────────────────────┘  └───────────────────┘  └─────────────────┘
         Автомат                                    Автомат              Гараар / Автомат
НэрТайлбарDeploy
Continuous IntegrationBuild + Test автомат-
Continuous Delivery+ Staging бэлэнГараар approve
Continuous Deployment+ Production автоматБүрэн автомат

1.3 CI/CD Pipeline

Pipeline = Код push-лахаас production deploy хүртэлх автоматжуулсан алхмуудын дараалал.

Үндсэн Pipeline алхмууд:

┌─────────┐   ┌─────────┐   ┌──────────┐   ┌──────────┐   ┌──────────┐   ┌──────────┐
│  Source  │──►│  Build  │──►│  Test    │──►│ Analysis │──►│ Package  │──►│  Deploy  │
│  (Git)  │   │(Compile)│   │(JUnit)   │   │(Sonar)   │   │(Docker)  │   │(Server)  │
└─────────┘   └─────────┘   └──────────┘   └──────────┘   └──────────┘   └──────────┘
   Push          mvn            mvn           sonar         docker         kubectl
   trigger      compile        test          scan          build          apply
АлхамЗорилгоХэрэгсэл
SourceКод өөрчлөлт (push, PR)Git, GitHub
BuildКод compile, dependency татахMaven, Gradle
TestUnit test, integration testJUnit, Mockito
AnalysisКод чанар, аюулгүй байдал шалгахSonarQube, Checkstyle
PackageArtifact үүсгэх (JAR, Docker image)Maven, Docker
DeployСервер рүү суулгахKubernetes, AWS, Netlify

1.4 GitHub Actions

GitHub Actions гэж юу вэ?

GitHub Actions = GitHub-д суулгасан CI/CD платформ. .github/workflows/ хавтасд YAML файлаар pipeline тодорхойлно.

Суурь ойлголтууд:

НэрТайлбарЖишээ
WorkflowБүрэн pipeline.github/workflows/ci.yml
Event/TriggerЮу болоход ажиллахpush, pull_request
JobБие даасан ажлын нэгжbuild, test, deploy
StepJob дотор нэг алхамmvn test, docker build
RunnerPipeline ажиллах серверubuntu-latest, macos-latest
ActionДахин ашиглагдах алхамactions/checkout@v4

Жишээ: Java/Spring Boot CI Workflow

# .github/workflows/ci.yml
name: Java CI Pipeline

on:
  push:
    branches: [ main, develop ]
  pull_request:
    branches: [ main ]

jobs:
  build-and-test:
    runs-on: ubuntu-latest

    steps:
      # 1. Код татах
      - name: Checkout code
        uses: actions/checkout@v4

      # 2. Java тохируулах
      - name: Set up JDK 17
        uses: actions/setup-java@v4
        with:
          java-version: '17'
          distribution: 'temurin'

      # 3. Maven кэш (хурдасгах)
      - name: Cache Maven packages
        uses: actions/cache@v4
        with:
          path: ~/.m2/repository
          key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}

      # 4. Build + Test
      - name: Build and Test
        run: mvn clean verify

      # 5. Тестийн тайлан
      - name: Upload test results
        if: always()
        uses: actions/upload-artifact@v4
        with:
          name: test-results
          path: target/surefire-reports/

Workflow ажиллах дараалал:

Developer ─push→ GitHub ─trigger→ Workflow
                                    │
                            ┌───────▼───────┐
                            │ ubuntu-latest  │ (Runner)
                            ├────────────────┤
                            │ 1. Checkout    │
                            │ 2. Setup JDK   │
                            │ 3. Cache Maven │
                            │ 4. mvn verify  │  ← Build + Test
                            │ 5. Upload      │
                            └───────┬────────┘
                                    │
                              ✅ Pass / ❌ Fail

1.5 Docker суурь

Docker гэж юу вэ?

Docker = Програмыг бүх dependency-тэй нь container (тусгаарлагдсан орчин) дотор ажиллуулах хэрэгсэл.

💡 Зүйрлэл: Чингэлэг тээвэр шиг — Юу ч чингэлэг дотор байна, ямар ч хөлөгт ачигдана. Docker container = Ямар ч серверт ажиллана.

VM vs Container

ШинжVirtual MachineContainer (Docker)
ХэмжээGB (бүтэн OS)MB (зөвхөн app + dependency)
Эхлэх хурдМинутСекунд
НөөцИх (CPU, RAM)Бага
ТусгаарлалтБүрэн (OS түвшин)Процесс түвшин
ЗориулалтБүтэн орчин хэрэгтэйМикросервис, CI/CD

Dockerfile жишээ (Spring Boot)

# Base image
FROM eclipse-temurin:17-jre-alpine

# Ажлын хавтас
WORKDIR /app

# JAR файл хуулах
COPY target/student-api-0.0.1-SNAPSHOT.jar app.jar

# Port нээх
EXPOSE 8080

# Ажиллуулах
ENTRYPOINT ["java", "-jar", "app.jar"]

Docker командууд:

# Image бүтээх
docker build -t student-api:1.0 .

# Container ажиллуулах
docker run -d -p 8080:8080 --name student-api student-api:1.0

# Ажиллаж буй container харах
docker ps

# Лог харах
docker logs student-api

# Container зогсоох
docker stop student-api

# Image жагсаалт
docker images

Docker Compose (Олон container)

# docker-compose.yml
version: '3.8'

services:
  app:
    build: .
    ports:
      - "8080:8080"
    environment:
      - SPRING_DATASOURCE_URL=jdbc:postgresql://db:5432/studentdb
    depends_on:
      - db

  db:
    image: postgres:15-alpine
    ports:
      - "5432:5432"
    environment:
      - POSTGRES_DB=studentdb
      - POSTGRES_USER=admin
      - POSTGRES_PASSWORD=secret
    volumes:
      - postgres_data:/var/lib/postgresql/data

volumes:
  postgres_data:
# Бүгдийг ажиллуулах
docker-compose up -d

# Зогсоох
docker-compose down

1.6 Автомат тест Pipeline-д

Тестийн пирамид:

        ▲
       ╱ ╲        E2E Tests (Бага тоо, удаан)
      ╱   ╲       Selenium, Playwright
     ╱─────╲
    ╱       ╲     Integration Tests (Дунд)
   ╱         ╲    @SpringBootTest, TestContainers
  ╱───────────╲
 ╱             ╲  Unit Tests (Олон тоо, хурдан)
╱               ╲ JUnit, Mockito
────────────────── 
ТүвшинТооХурдCI-д
Unit TestОлон (80%)Маш хурданБүх push-д
Integration TestДунд (15%)ДундPR merge-д
E2E TestБага (5%)УдаанDeploy-ийн өмнө

CI Pipeline дахь тест:

jobs:
  unit-test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-java@v4
        with:
          java-version: '17'
          distribution: 'temurin'
      - name: Run Unit Tests
        run: mvn test -Dtest="*UnitTest"

  integration-test:
    needs: unit-test
    runs-on: ubuntu-latest
    services:
      postgres:
        image: postgres:15
        env:
          POSTGRES_DB: testdb
          POSTGRES_USER: test
          POSTGRES_PASSWORD: test
        ports:
          - 5432:5432
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-java@v4
        with:
          java-version: '17'
          distribution: 'temurin'
      - name: Run Integration Tests
        run: mvn verify -Dtest="*IntegrationTest"

1.7 Код чанарын шалгалт (Code Quality)

Pipeline дахь код шалгалт:

ХэрэгсэлЗорилгоШалгах зүйл
CheckstyleКодын форматНэрлэлт, indent, Javadoc
SpotBugsBug олохNull pointer, resource leak
SonarQubeБүрэн шинжилгээBug, vulnerability, code smell, coverage
OWASPАюулгүй байдалDependency-ийн vulnerability
JaCoCoТест хамрах хүрээLine coverage, branch coverage

JaCoCo (Test Coverage) тохиргоо:

<!-- pom.xml -->
<plugin>
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    <version>0.8.11</version>
    <executions>
        <execution>
            <goals>
                <goal>prepare-agent</goal>
            </goals>
        </execution>
        <execution>
            <id>report</id>
            <phase>verify</phase>
            <goals>
                <goal>report</goal>
            </goals>
        </execution>
        <execution>
            <id>check</id>
            <goals>
                <goal>check</goal>
            </goals>
            <configuration>
                <rules>
                    <rule>
                        <limits>
                            <limit>
                                <counter>LINE</counter>
                                <value>COVEREDRATIO</value>
                                <minimum>0.80</minimum>
                            </limit>
                        </limits>
                    </rule>
                </rules>
            </configuration>
        </execution>
    </executions>
</plugin>

1.8 Deploy стратегиуд

1.8.1 Үндсэн стратегиуд:

СтратегиТайлбарЭрсдэл
Big BangХуучныг зогсоож, шинийг суулгахӨндөр (downtime)
RollingСерверүүдийг нэг нэгээр шинэчлэхДунд
Blue-Green2 орчин: Blue (хуучин), Green (шинэ) → ШилжүүлэхБага
Canary5% хэрэглэгчид шинэ → Амжилттай бол 100%Маш бага

Blue-Green Deploy:

     Хэрэглэгчид
         │
    ┌────▼────┐
    │  Load   │
    │ Balancer│
    └────┬────┘
         │
    ┌────┴────┐
    ▼         ▼
┌───────┐ ┌───────┐
│ Blue  │ │ Green │
│ v1.0  │ │ v1.1  │  ← Шинэ хувилбар
│(Одоо) │ │(Шинэ) │
└───────┘ └───────┘

1. Green-д v1.1 deploy
2. Test Green
3. Load Balancer → Green руу шилжүүлэх
4. Blue = Нөөц (rollback хэрэгтэй бол)

Canary Deploy:

Хэрэглэгчид (100%)
    │
    ├── 95% ──► v1.0 (Хуучин)
    │
    └── 5%  ──► v1.1 (Шинэ) ← Canary
                  │
            Мониторинг
            ✅ OK → 25% → 50% → 100%
            ❌ Fail → Rollback

1.9 Infrastructure as Code (IaC)

IaC гэж юу вэ?

IaC = Дэд бүтцийг (сервер, сүлжээ, DB) кодоор тодорхойлж, хувилбарлаж, автоматаар үүсгэх.

ШинжГараарIaC
ХурдУдаан (консол дээр дарах)Хурдан (код ажиллуулах)
ДавтагдахХүн бүр өөрөөрИжил код = Ижил үр дүн
ХувилбарЮу өөрчилснийг мэдэхгүйGit-ээр хувилбарлана
БаримтБаримтгүйКод = Баримт

Хэрэгслүүд:

ХэрэгсэлЗорилгоЖишээ
TerraformCloud дэд бүтэцAWS EC2, RDS, VPC
AnsibleСерверийн тохиргооJava суулгах, тохиргоо
DockerПрограмын орчинContainer image
KubernetesContainer зохион байгуулалтPod, Service, Deployment
HelmK8s package managerChart ашиглан deploy

Terraform жишээ (AWS):

# main.tf — AWS EC2 instance
resource "aws_instance" "app_server" {
  ami           = "ami-0c55b159cbfafe1f0"
  instance_type = "t2.micro"

  tags = {
    Name        = "student-api"
    Environment = "production"
  }
}

resource "aws_db_instance" "database" {
  engine         = "postgres"
  engine_version = "15"
  instance_class = "db.t3.micro"
  db_name        = "studentdb"
  username       = "admin"
  password       = var.db_password
}

1.10 Monitoring ба Observability

Яагаад мониторинг хэрэгтэй вэ?

Deploy хийсний дараа: Ажиллаж байна уу? Алдаа гарч байна уу? Удаан байна уу?

3 тулгуур (Three Pillars of Observability):

ТулгуурАнглиТайлбарХэрэгсэл
ЛогLogsЮу болсон? Текст бичлэгELK Stack, Loki
МетрикMetricsХэмжигдэхүүн (CPU, Memory, Request/sec)Prometheus, Grafana
TraceTracesХүсэлт ямар замаар явсан?Jaeger, Zipkin

Лог түвшнүүд:

ТүвшинХэрэглээЖишээ
ERRORНоцтой алдааDB холбогдохгүй, NullPointerException
WARNАнхааруулгаКэш дүүрсэн, retry хийж байна
INFOЧухал үйл явдалХэрэглэгч нэвтэрсэн, захиалга үүссэн
DEBUGДэлгэрэнгүй debugSQL query, request/response body
TRACEМаш дэлгэрэнгүйMethod орох/гарах

Spring Boot Actuator:

# application.yml
management:
  endpoints:
    web:
      exposure:
        include: health, info, metrics, prometheus
  endpoint:
    health:
      show-details: always
# Health check
curl http://localhost:8080/actuator/health
# {"status":"UP","components":{"db":{"status":"UP"},"diskSpace":{"status":"UP"}}}

# Metrics
curl http://localhost:8080/actuator/metrics/jvm.memory.used

1.11 Git Branching Strategy (CI/CD-д)

GitFlow vs Trunk-Based:

ШинжGitFlowTrunk-Based
Branchmain, develop, feature, release, hotfixmain + short-lived feature
MergeОлон удаа, урт branchӨдөр бүр main руу
CI/CDНарийн, удаанХурдан, энгийн
ТохиромжтойТом баг, release scheduleCI/CD, DevOps, жижиг баг

Trunk-Based Development:

main ──●──●──●──●──●──●──●──●──●──  (Байнга deploy)
        ╲    ╱  ╲  ╱    ╲    ╱
feature  ●──●    ●●      ●──●
branches  (1-2 өдөр)   (Богино)

Pull Request + CI:

1. Feature branch үүсгэх:    git checkout -b feature/add-enrollment
2. Код бичих, commit хийх:    git commit -m "feat: add enrollment API"
3. Push + PR үүсгэх:          git push origin feature/add-enrollment
4. CI Pipeline ажиллана:       ✅ Build + Test + Quality
5. Code Review:                Багийн гишүүн approve
6. Merge to main:             PR merge
7. CD Pipeline ажиллана:       Deploy to staging/production

1.12 Орчны удирдлага (Environment Management)

Орчнууд:

ОрчинЗорилгоDeploy
LocalХөгжүүлэгчийн компьютерГараар
DevХамтын хөгжүүлэлт, туршилтPush бүрт
StagingProduction-тэй ижил орчин, QA тестPR merge
ProductionБодит хэрэглэгчидApprove-ийн дараа

Тохиргооны удирдлага:

# application.yml (Default)
spring:
  datasource:
    url: jdbc:h2:mem:testdb

---
# application-dev.yml
spring:
  datasource:
    url: jdbc:postgresql://dev-db:5432/devdb

---
# application-staging.yml
spring:
  datasource:
    url: jdbc:postgresql://staging-db:5432/stagingdb

---
# application-prod.yml
spring:
  datasource:
    url: jdbc:postgresql://prod-db:5432/proddb
# Орчин сонгох
java -jar app.jar --spring.profiles.active=prod

Secrets удирдлага:

# GitHub Actions secrets ашиглах
- name: Deploy to Production
  env:
    DB_PASSWORD: ${{ secrets.DB_PASSWORD }}
    API_KEY: ${{ secrets.API_KEY }}
  run: |
    echo "Deploying with secure credentials..."

⚠️ ХЭЗЭЭ Ч: Нууц мэдээлэл (password, API key, token) кодонд hardcode хийхгүй! GitHub Secrets, Vault, AWS Secrets Manager ашиглах.


1.13 CI/CD шилдэг туршлагууд (Best Practices)

#ЗарчимТайлбар
1Commit бүрт CIАлдааг ЭРТ олох
2Тест бичихТестгүй CI = Хоосон CI
3Pipeline хурдан10 минутаас бага (Cache, parallel)
4Main branch = DeployableMain ҮРГЭЛЖ deploy-д бэлэн
5Feature FlagДуусаагүй feature → Flag-аар нуух
6Rollback бэлэнХуучин хувилбар руу хурдан буцах
7МониторингDeploy-ийн дараа ШУУД хянах
8Secrets хамгаалахPassword кодонд БАЙХГҮЙ
9IaC ашиглахДэд бүтцийг кодоор
10Increment deployЖижиг, байнгын өөрчлөлт
11Code ReviewPR merge-ийн өмнө review
12Бүх орчин ижилDev ≈ Staging ≈ Production


ХЭСЭГ 2: ТҮЛХҮҮР ҮГ БА МЭРГЭЖЛИЙН НЭР ТОМЬЁО (Keywords & Glossary)

#Англи нэр томьёоМонгол утгаДэлгэрэнгүй тайлбар
1DevOpsDevOpsDevelopment + Operations — Хөгжүүлэлт ба ашиглалтын нэгдэл.
2CI (Continuous Integration)Байнгын нэгтгэлКод push бүрт автомат build + test.
3CD (Continuous Delivery)Байнгын хүргэлтCI + Staging бэлэн, deploy гараар.
4CD (Continuous Deployment)Байнгын суулгалтCI + Production руу автомат deploy.
5PipelineДамжлагаКод → Build → Test → Deploy автомат дараалал.
6WorkflowАжлын урсгалGitHub Actions-ийн бүрэн pipeline (YAML).
7JobАжилPipeline-ийн бие даасан ажлын нэгж.
8StepАлхамJob дотор нэг үйлдэл.
9RunnerАжиллуулагчPipeline ажиллах сервер (ubuntu-latest).
10Trigger / EventГох / Үйл явдалPipeline эхлүүлэх нөхцөл (push, PR).
11ArtifactБүтээгдэхүүнBuild-ийн үр дүн (JAR, Docker image).
12DockerDockerПрограмыг container-д ажиллуулах хэрэгсэл.
13ContainerКонтейнерТусгаарлагдсан, хөнгөн ажиллах орчин.
14ImageДүрсContainer-ийн загвар (template).
15DockerfileDockerfileDocker image бүтээх зааварчилгаа.
16Docker ComposeDocker ComposeОлон container-ийг хамтад нь удирдах.
17Kubernetes (K8s)KubernetesContainer зохион байгуулалтын платформ.
18IaCДэд бүтэц кодоорInfrastructure as Code — Terraform, Ansible.
19TerraformTerraformCloud дэд бүтцийг кодоор тодорхойлох.
20MonitoringХяналтСистемийн төлөв, гүйцэтгэлийг хянах.
21LoggingЛог бичихСистемийн үйл явдлыг текстээр бүртгэх.
22MetricsХэмжигдэхүүнCPU, Memory, Request/sec зэрэг тоон утгууд.
23TracingМөрдөлтХүсэлтийн замыг дагаж мөрдөх.
24Blue-Green DeployХөх-Ногоон суулгалт2 орчин солих → Downtime-гүй deploy.
25Canary DeployКанар суулгалтБага хувьд шинэ хувилбар → Аажмаар нэмэгдүүлэх.
26Rolling DeployШатлал суулгалтСерверүүдийг нэг нэгээр шинэчлэх.
27RollbackБуцаахАлдаатай deploy-г хуучин хувилбар руу буцаах.
28Feature FlagБоломжийн тугалгаШинэ feature-ийг тохиргоогоор нуух/харуулах.
29SonarQubeSonarQubeКодын чанарын шинжилгээний хэрэгсэл.
30JaCoCoJaCoCoJava тест хамрах хүрээ (coverage) хэрэгсэл.
31Code CoverageТест хамралтТестээр хамрагдсан кодын хувь.
32StagingStaging орчинProduction-тэй ижил тест орчин.
33ProductionProduction орчинБодит хэрэглэгчдэд зориулсан орчин.
34Health CheckЭрүүл мэндийн шалгалтСистем хэвийн ажиллаж буй эсэхийг шалгах.
35ActuatorActuatorSpring Boot-ийн мониторинг endpoint-ууд.
36SecretНууц мэдээлэлPassword, API key, token — кодонд хадгалдаггүй.
37Trunk-Based DevҮндсэн салааны хөгжүүлэлтMain branch руу байнга merge хийх.
38Pull Request (PR)Татах хүсэлтКод merge хийхийн өмнөх review хүсэлт.
39YAMLYAMLYAML Ain't Markup Language — Тохиргооны формат.
40ObservabilityАжиглах чадварLogs + Metrics + Traces = Систем ойлгох.