ЛЕКЦ 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 = Систем ойлгох.


ХЭСЭГ 3: ЛАБОРАТОРИ БА ПРАКТИК ЗААВАР (Labs & Step-by-Step Guide)

3.1 Лабораторийн зорилго

Энэ лабораторид та:

  1. GitHub Actions ашиглан Java/Spring Boot CI pipeline үүсгэх
  2. Автомат тест, код чанарын шалгалт нэмэх
  3. Docker image бүтээх pipeline нэмэх
  4. Multi-environment deploy тохируулах

Хэл: Java 17+ / Spring Boot 3.x | CI/CD: GitHub Actions | Container: Docker


3.2 Лаб 1: GitHub Actions CI Pipeline үүсгэх

Алхам 1: Хавтасын бүтэц

student-api/
├── .github/
│   └── workflows/
│       └── ci.yml          ← CI Pipeline
├── src/
│   ├── main/java/...
│   └── test/java/...
├── Dockerfile               ← Docker image
├── docker-compose.yml       ← Олон container
├── pom.xml
└── README.md

Алхам 2: CI Workflow файл үүсгэх

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

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

env:
  JAVA_VERSION: '17'

jobs:
  # ────────────────────────────────────────
  # Job 1: Build + Unit Test
  # ────────────────────────────────────────
  build:
    name: Build & Unit Test
    runs-on: ubuntu-latest

    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Set up JDK ${{ env.JAVA_VERSION }}
        uses: actions/setup-java@v4
        with:
          java-version: ${{ env.JAVA_VERSION }}
          distribution: 'temurin'

      - name: Cache Maven dependencies
        uses: actions/cache@v4
        with:
          path: ~/.m2/repository
          key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
          restore-keys: |
            ${{ runner.os }}-maven-

      - name: Build and Run Unit Tests
        run: mvn clean verify -DskipITs

      - name: Upload Test Results
        if: always()
        uses: actions/upload-artifact@v4
        with:
          name: test-results
          path: target/surefire-reports/

      - name: Upload JAR Artifact
        uses: actions/upload-artifact@v4
        with:
          name: app-jar
          path: target/*.jar

Алхам 3: Push хийж Pipeline ажиллуулах

# 1. Хавтас үүсгэх
mkdir -p .github/workflows

# 2. ci.yml файл нэмэх (дээрх агуулга)

# 3. Commit + Push
git add .github/workflows/ci.yml
git commit -m "ci: add GitHub Actions CI pipeline"
git push origin main

# 4. GitHub → Actions tab → Pipeline ажиллаж буйг харах

3.3 Лаб 2: Тест + Code Coverage нэмэх

Алхам 1: JaCoCo нэмэх (pom.xml)

<!-- pom.xml дотор plugins хэсэгт -->
<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>
    </executions>
</plugin>

Алхам 2: CI Pipeline-д Coverage нэмэх

# ci.yml-д нэмэх (build job-ийн steps дотор)
      - name: Generate Code Coverage Report
        run: mvn jacoco:report

      - name: Upload Coverage Report
        uses: actions/upload-artifact@v4
        with:
          name: coverage-report
          path: target/site/jacoco/

      - name: Check Coverage Threshold
        run: |
          COVERAGE=$(grep -oP 'Total.*?(\d+)%' target/site/jacoco/index.html | grep -oP '\d+' | head -1)
          echo "Code Coverage: ${COVERAGE}%"
          if [ "$COVERAGE" -lt 70 ]; then
            echo "❌ Coverage ${COVERAGE}% is below 70% threshold!"
            exit 1
          fi
          echo "✅ Coverage ${COVERAGE}% meets threshold"

3.4 Лаб 3: Docker Image бүтээх Pipeline

Алхам 1: Dockerfile үүсгэх

# Dockerfile
# Multi-stage build — Жижиг image
FROM eclipse-temurin:17-jdk-alpine AS builder
WORKDIR /app
COPY pom.xml .
COPY src ./src
RUN apk add --no-cache maven && mvn clean package -DskipTests

FROM eclipse-temurin:17-jre-alpine
WORKDIR /app
COPY --from=builder /app/target/*.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]

Алхам 2: Docker Build Pipeline нэмэх

# .github/workflows/ci.yml дотор шинэ job нэмэх
  docker:
    name: Build Docker Image
    needs: build
    runs-on: ubuntu-latest
    if: github.ref == 'refs/heads/main'

    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3

      - name: Login to Docker Hub
        uses: docker/login-action@v3
        with:
          username: ${{ secrets.DOCKER_USERNAME }}
          password: ${{ secrets.DOCKER_PASSWORD }}

      - name: Build and Push Docker Image
        uses: docker/build-push-action@v5
        with:
          context: .
          push: true
          tags: |
            ${{ secrets.DOCKER_USERNAME }}/student-api:latest
            ${{ secrets.DOCKER_USERNAME }}/student-api:${{ github.sha }}
          cache-from: type=gha
          cache-to: type=gha,mode=max

Алхам 3: Docker Compose (Локал тест)

# docker-compose.yml
version: '3.8'

services:
  app:
    build: .
    ports:
      - "8080:8080"
    environment:
      SPRING_PROFILES_ACTIVE: dev
      SPRING_DATASOURCE_URL: jdbc:postgresql://db:5432/studentdb
      SPRING_DATASOURCE_USERNAME: admin
      SPRING_DATASOURCE_PASSWORD: secret
    depends_on:
      db:
        condition: service_healthy

  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
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U admin -d studentdb"]
      interval: 5s
      timeout: 5s
      retries: 5

volumes:
  postgres_data:
# Ажиллуулах
docker-compose up -d

# Шалгах
curl http://localhost:8080/actuator/health

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

3.5 Лаб 4: Multi-Environment Deploy Pipeline

Бүрэн CI/CD Workflow

# .github/workflows/deploy.yml
name: Deploy Pipeline

on:
  push:
    branches: [ main ]

jobs:
  # ──── 1. Build + Test ────
  build:
    name: Build & Test
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-java@v4
        with:
          java-version: '17'
          distribution: 'temurin'
      - name: Build & Test
        run: mvn clean verify
      - uses: actions/upload-artifact@v4
        with:
          name: app-jar
          path: target/*.jar

  # ──── 2. Docker Build ────
  docker:
    name: Docker Build & Push
    needs: build
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: docker/setup-buildx-action@v3
      - uses: docker/login-action@v3
        with:
          username: ${{ secrets.DOCKER_USERNAME }}
          password: ${{ secrets.DOCKER_PASSWORD }}
      - uses: docker/build-push-action@v5
        with:
          context: .
          push: true
          tags: ${{ secrets.DOCKER_USERNAME }}/student-api:${{ github.sha }}

  # ──── 3. Deploy to Staging ────
  deploy-staging:
    name: Deploy to Staging
    needs: docker
    runs-on: ubuntu-latest
    environment: staging
    steps:
      - name: Deploy to Staging Server
        run: |
          echo "Deploying to Staging..."
          echo "Image: student-api:${{ github.sha }}"
          # kubectl set image deployment/student-api \
          #   student-api=${{ secrets.DOCKER_USERNAME }}/student-api:${{ github.sha }} \
          #   --namespace=staging

  # ──── 4. Deploy to Production (Manual Approval) ────
  deploy-production:
    name: Deploy to Production
    needs: deploy-staging
    runs-on: ubuntu-latest
    environment: production
    steps:
      - name: Deploy to Production Server
        run: |
          echo "Deploying to Production..."
          echo "Image: student-api:${{ github.sha }}"
          # kubectl set image deployment/student-api \
          #   student-api=${{ secrets.DOCKER_USERNAME }}/student-api:${{ github.sha }} \
          #   --namespace=production

Pipeline визуал:

Push to main
    │
    ▼
┌──────────┐    ┌──────────┐    ┌──────────────┐    ┌──────────────────┐
│  Build   │───►│  Docker  │───►│   Staging    │───►│   Production     │
│  & Test  │    │  Build   │    │   Deploy     │    │   Deploy         │
│  (auto)  │    │  (auto)  │    │   (auto)     │    │   (manual ✋)    │
└──────────┘    └──────────┘    └──────────────┘    └──────────────────┘
   mvn verify    docker push     kubectl apply       Approve → Deploy


ХЭСЭГ 4: ШАЛГАЛТЫН АСУУЛТ (Knowledge Check — 100 тест)

Тест 1

DevOps гэж юу вэ?

  • A) Зөвхөн хэрэгсэл
  • B) Development + Operations — Хөгжүүлэлт ба ашиглалтыг нэгтгэсэн соёл, практик, хэрэгслүүдийн нэгдэл
  • C) Зөвхөн deploy хийх
  • D) Зөвхөн тест бичих

Зөв хариулт: B

Тайлбар: DevOps = Соёл (Culture) + Автоматжуулалт (Automation) + Хамтын ажиллагаа. Dev ба Ops нэг баг болж, програмыг хурдан, найдвартай хүргэнэ.

Тест 2

CI (Continuous Integration) гэж юу вэ?

  • A) Зөвхөн deploy хийх
  • B) Код push бүрт автоматаар BUILD + TEST ажиллуулж, алдааг ЭРТ олох
  • C) Зөвхөн код бичих
  • D) Гараар тест хийх

Зөв хариулт: B

Тайлбар: CI = Хөгжүүлэгчид кодоо өдөр бүр main руу нэгтгэж, автоматаар build, test ажиллуулна. Integration Hell-аас зайлсхийнэ.

Тест 3

Continuous Delivery ба Continuous Deployment-ийн ялгаа юу вэ?

  • A) Ялгаагүй
  • B) Delivery = Staging бэлэн (deploy ГАРААР), Deployment = Production руу АВТОМАТ deploy
  • C) Delivery = Автомат, Deployment = Гараар
  • D) Хоёулаа гараар

Зөв хариулт: B

Тайлбар: Continuous Delivery = Staging хүртэл автомат, production deploy гараар approve. Continuous Deployment = Бүх зүйл автомат, production хүртэл.

Тест 4

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

  • A) Нэг алхамт процесс
  • B) Код push-лахаас deploy хүртэлх АВТОМАТЖУУЛСАН алхмуудын дараалал
  • C) Зөвхөн тест
  • D) Зөвхөн build

Зөв хариулт: B

Тайлбар: Pipeline = Source → Build → Test → Analysis → Package → Deploy. Алхам бүр автоматаар дараалж ажиллана. Нэг алхам амжилтгүй = Зогсоно.

Тест 5

GitHub Actions юу вэ?

  • A) Код editor
  • B) GitHub-д суулгасан CI/CD ПЛАТФОРМ — YAML файлаар pipeline тодорхойлно
  • C) Зөвхөн Git client
  • D) Database

Зөв хариулт: B

Тайлбар: GitHub Actions = .github/workflows/ci.yml файлд pipeline бичнэ. push, PR зэрэг event-д автоматаар ажиллана. Үнэгүй (public repo).

Тест 6

GitHub Actions-д Workflow гэж юу вэ?

  • A) Нэг алхам
  • B) YAML файлаар тодорхойлогдсон БҮРЭН pipeline — Job-уудаас бүрдэнэ
  • C) Зөвхөн тест
  • D) Зөвхөн deploy

Зөв хариулт: B

Тайлбар: Workflow = .github/workflows/ci.yml. on: = Trigger. jobs: = Ажлууд. steps: = Алхмууд. Нэг repository олон workflow-тэй байж болно.

Тест 7

GitHub Actions-д on: push юу хийдэг вэ?

  • A) Гараар ажиллуулах
  • B) Код PUSH хийхэд pipeline-г автоматаар ЭХЛҮҮЛЭХ
  • C) PR үүсгэх
  • D) Issue үүсгэх

Зөв хариулт: B

Тайлбар: on: push: branches: [main] = main branch руу push хийх бүрт workflow ажиллана. on: pull_request = PR үүсгэхэд.

Тест 8

GitHub Actions-д Job гэж юу вэ?

  • A) Нэг Step
  • B) Pipeline-ийн БИЕ ДААСАН ажлын нэгж — Тусдаа runner дээр ажиллана
  • C) YAML файл
  • D) Git branch

Зөв хариулт: B

Тайлбар: Job = build, test, deploy. needs: build = build амжилттай дараа test ажиллана. Job-ууд зэрэгцээ (parallel) эсвэл дараалсан (sequential) ажиллана.

Тест 9

runs-on: ubuntu-latest юу хийдэг вэ?

  • A) Windows ашиглах
  • B) Ubuntu Linux сервер дээр pipeline АЖИЛЛУУЛАХ
  • C) macOS ашиглах
  • D) Локал компьютерт

Зөв хариулт: B

Тайлбар: Runner = Pipeline ажиллах виртуал сервер. ubuntu-latest, windows-latest, macos-latest. GitHub-аас үнэгүй олгодог (public repo).

Тест 10

actions/checkout@v4 юу хийдэг вэ?

  • A) Java тохируулах
  • B) Git repository-ийн КОДЫГ runner дээр ТАТАХ
  • C) Docker build хийх
  • D) Deploy хийх

Зөв хариулт: B

Тайлбар: Checkout = Код татах. Runner хоосон → checkout → Код ирнэ → Build, test хийх боломжтой. Бараг бүх workflow-ийн ЭХНИЙ алхам.

Тест 11

actions/cache@v4 юу хийдэг вэ?

  • A) Код устгах
  • B) Maven dependency-г КЭШЛЭЖ, дараагийн pipeline-г ХУРДАСГАХ
  • C) Тест ажиллуулах
  • D) Deploy хийх

Зөв хариулт: B

Тайлбар: Cache = ~/.m2/repository хадгалж, дахин татахгүй. Pipeline 5 мин → 2 мин. key: hashFiles('**/pom.xml') = pom.xml өөрчлөгдвөл шинэ кэш.

Тест 12

Docker гэж юу вэ?

  • A) Virtual Machine
  • B) Програмыг бүх dependency-тэй нь CONTAINER дотор тусгаарлаж ажиллуулах хэрэгсэл
  • C) Програмчлалын хэл
  • D) Database

Зөв хариулт: B

Тайлбар: Docker = "Миний компьютерт ажилладаг" → "Хаа ч ажилладаг". Container = Хөнгөн, хурдан (VM-ээс 10x жижиг, секундэд эхэлнэ).

Тест 13

Docker Container ба Virtual Machine-ийн гол ялгаа юу вэ?

  • A) Ялгаагүй
  • B) Container = Хөнгөн (MB, секундэд эхэлнэ), VM = Хүнд (GB, минутад эхэлнэ)
  • C) Container = Удаан
  • D) VM = Хөнгөн

Зөв хариулт: B

Тайлбар: VM = Бүтэн OS (Windows/Linux) виртуалчилна. Container = Зөвхөн app + dependency, Host OS-ийн kernel-ийг хуваалцана. Container = Маш хөнгөн.

Тест 14

Dockerfile юу вэ?

  • A) Docker-ийн тохиргоо файл
  • B) Docker IMAGE бүтээх ЗААВАРЧИЛГАА — FROM, COPY, RUN, ENTRYPOINT
  • C) Docker container
  • D) Docker network

Зөв хариулт: B

Тайлбар: Dockerfile = Жор. FROM eclipse-temurin:17 = Суурь. COPY target/*.jar app.jar = Файл хуулах. ENTRYPOINT ["java", "-jar", "app.jar"] = Ажиллуулах.

Тест 15

docker build -t student-api:1.0 . юу хийдэг вэ?

  • A) Container ажиллуулах
  • B) Dockerfile-аас Docker IMAGE бүтээх, student-api:1.0 нэр өгөх
  • C) Container устгах
  • D) Image устгах

Зөв хариулт: B

Тайлбар: docker build = Dockerfile → Image. -t = Tag (нэр:хувилбар). . = Одоогийн хавтас (build context). Image = Container-ийн загвар.

Тест 16

docker run -d -p 8080:8080 student-api:1.0 юу хийдэг вэ?

  • A) Image бүтээх
  • B) Image-аас CONTAINER үүсгэж, дэвсгэрт (background) АЖИЛЛУУЛАХ, port 8080 нээх
  • C) Container устгах
  • D) Лог харах

Зөв хариулт: B

Тайлбар: run = Container үүсгэх + ажиллуулах. -d = Detached (background). -p 8080:8080 = Host:Container port mapping. Container дотор 8080 → Гаднаас 8080.

Тест 17

Docker Compose юу хийдэг вэ?

  • A) Нэг container ажиллуулах
  • B) ОЛОН container-ийг (app + DB) НЭГЭН ЗЭРЭГ тодорхойлж, удирдах
  • C) Image бүтээх
  • D) Тест ажиллуулах

Зөв хариулт: B

Тайлбар: docker-compose.yml = app + postgres + redis бүгдийг нэг файлд. docker-compose up -d = Бүгдийг ажиллуулах. docker-compose down = Бүгдийг зогсоох.

Тест 18

Multi-stage Docker build юу хийдэг вэ?

  • A) Нэг stage
  • B) Build stage (JDK + Maven) ба Run stage (JRE) салгаж, ЖИЖИГ image бүтээх
  • C) Олон container ажиллуулах
  • D) Тест ажиллуулах

Зөв хариулт: B

Тайлбар: Stage 1: JDK + Maven → Build (500MB). Stage 2: Зөвхөн JRE + JAR (150MB). Эцсийн image жижиг → Хурдан татах, аюулгүй (build tools байхгүй).

Тест 19

Blue-Green Deploy стратеги юу вэ?

  • A) Бүгдийг зогсоож шинэчлэх
  • B) 2 ижил орчин (Blue=хуучин, Green=шинэ) → Load balancer ШИЛЖҮҮЛЭХ → Downtime-гүй
  • C) Серверүүдийг нэг нэгээр
  • D) 5% хэрэглэгчид

Зөв хариулт: B

Тайлбар: Blue = Одоогийн v1.0. Green = Шинэ v1.1 deploy + test. OK бол traffic Green руу. Алдаатай бол Blue руу хурдан буцах (rollback).

Тест 20

Canary Deploy стратеги юу вэ?

  • A) Бүгдийг шинэчлэх
  • B) БАГА ХУВИЙН хэрэглэгчид (5%) шинэ хувилбар → Мониторинг → Аажмаар 100%
  • C) 2 орчин солих
  • D) Серверүүдийг нэг нэгээр

Зөв хариулт: B

Тайлбар: Canary = Нүүрсний уурхайн канар шувуу (аюулыг эрт анзаарах). 5% → OK → 25% → 50% → 100%. Алдаа → Зөвхөн 5%-д нөлөөлнө → Rollback.

Тест 21

Rollback гэж юу вэ?

  • A) Шинэ хувилбар deploy
  • B) Алдаатай deploy-г ХУУЧИН хувилбар руу БУЦААХ
  • C) Тест ажиллуулах
  • D) Код бичих

Зөв хариулт: B

Тайлбар: v1.1 deploy → Алдаа → v1.0 руу буцах = Rollback. Blue-Green: Traffic буцаах. Docker: Хуучин image tag ашиглах. Rollback БЭЛЭН байх = Чухал.

Тест 22

Feature Flag гэж юу вэ?

  • A) Git branch
  • B) Шинэ feature-ийг ТОХИРГООГООР нуух/харуулах — Код deploy хийсэн ч feature идэвхгүй
  • C) Тестийн тугалга
  • D) Deploy стратеги

Зөв хариулт: B

Тайлбар: if (featureFlags.isEnabled("new-enrollment")) → true = Шинэ feature. false = Хуучин. Deploy хийсэн ч feature ХААЛТТАЙ → Эрсдэл багатай. LaunchDarkly, Unleash.

Тест 23

IaC (Infrastructure as Code) гэж юу вэ?

  • A) Гараар сервер тохируулах
  • B) Дэд бүтцийг КОДООР тодорхойлж, хувилбарлаж, автоматаар үүсгэх
  • C) Зөвхөн Docker
  • D) Зөвхөн тест

Зөв хариулт: B

Тайлбар: IaC = Terraform, Ansible. main.tfterraform apply = AWS EC2, RDS автоматаар үүснэ. Git-ээр хувилбарлана. Давтагдах, алдаа бага.

Тест 24

Terraform юу хийдэг вэ?

  • A) Тест бичих
  • B) Cloud ДЭД БҮТЦИЙГ (AWS EC2, RDS, VPC) КОДООР тодорхойлж, үүсгэх
  • C) Код compile хийх
  • D) Docker ажиллуулах

Зөв хариулт: B

Тайлбар: resource "aws_instance" "app" { instance_type = "t2.micro" }terraform apply = AWS-д сервер автоматаар үүснэ. terraform destroy = Устгах.

Тест 25

Kubernetes (K8s) юу хийдэг вэ?

  • A) Docker image бүтээх
  • B) Docker CONTAINER-уудыг зохион байгуулах — автомат scaling, self-healing, deploy
  • C) Код бичих
  • D) Тест ажиллуулах

Зөв хариулт: B

Тайлбар: K8s = Container orchestration. Pod = Container wrapper. Service = Network. Deployment = Replica, rolling update. Container 3 → 10 автомат scale.

Тест 26

Monitoring (Хяналт) яагаад хэрэгтэй вэ?

  • A) Шаардлагагүй
  • B) Deploy-ийн дараа систем ХЭВИЙН АЖИЛЛАЖ БУЙГ шалгах — Алдаа, удаашрал ЭРТ олох
  • C) Зөвхөн код бичих
  • D) Зөвхөн тест

Зөв хариулт: B

Тайлбар: Deploy = Ажлын эхлэл, төгсгөл биш. Мониторинг = CPU 90%?, Алдаа 5%?, Response 5 секунд? → Alert → Хурдан засварлах.

Тест 27

Observability-ийн 3 тулгуур юу вэ?

  • A) Code, Test, Deploy
  • B) Logs, Metrics, Traces — Систем дотроос юу болж буйг ойлгох
  • C) Build, Test, Deploy
  • D) Dev, Staging, Prod

Зөв хариулт: B

Тайлбар: Logs = Юу болсон (текст). Metrics = Хэмжигдэхүүн (CPU, RAM, request/sec). Traces = Хүсэлт ямар замаар явсан. 3 тулгуур = Бүрэн ойлголт.

Тест 28

Spring Boot Actuator юу хийдэг вэ?

  • A) Тест бичих
  • B) Програмын ЭРҮҮЛ МЭНД, МЕТРИК, INFO endpoint-уудаар мониторинг хийх
  • C) Код compile хийх
  • D) Docker ажиллуулах

Зөв хариулт: B

Тайлбар: /actuator/health = UP/DOWN. /actuator/metrics = JVM, HTTP хэмжигдэхүүн. /actuator/prometheus = Prometheus-д метрик өгөх. Production-д чухал.

Тест 29

/actuator/health endpoint юу буцаадаг вэ?

  • A) Бүх метрик
  • B) Програм ХЭВИЙН ажиллаж буй эсэх — {"status":"UP"} эсвэл {"status":"DOWN"}
  • C) Лог
  • D) Код

Зөв хариулт: B

Тайлбар: Health check = Load balancer, K8s энэ endpoint-г шалгаж, DOWN бол traffic зогсоож, container дахин эхлүүлнэ. Automated recovery.

Тест 30

YAML формат CI/CD-д яагаад ашигладаг вэ?

  • A) Зөвхөн JSON ашиглана
  • B) Уншихад ХЯЛБАР, бүтэцтэй тохиргооны формат — Indent-ээр hierarchy илэрхийлнэ
  • C) XML-ээс хурдан
  • D) Зөвхөн Docker-д

Зөв хариулт: B

Тайлбар: YAML = Human-readable. GitHub Actions, Docker Compose, Kubernetes бүгд YAML. Indent = Бүтэц (2 space). key: value, - item (list).

Тест 31

needs: build (GitHub Actions) юу хийдэг вэ?

  • A) Build устгах
  • B) Энэ job build job АМЖИЛТТАЙ дуусмагц ажиллана — Дарааллыг тодорхойлох
  • C) Build-г алгасах
  • D) Build-г давтах

Зөв хариулт: B

Тайлбар: needs: build = Dependency. Build амжилтгүй → Энэ job АЖИЛЛАХГҮЙ. Build амжилттай → Энэ job эхэлнэ. Pipeline-ийн дараалал.

Тест 32

if: always() (GitHub Actions) юу хийдэг вэ?

  • A) Хэзээ ч ажиллахгүй
  • B) Өмнөх алхам АМЖИЛТГҮЙ байсан ч энэ алхам ҮРГЭЛЖ ажиллана
  • C) Зөвхөн амжилттай үед
  • D) Зөвхөн алдаатай үед

Зөв хариулт: B

Тайлбар: if: always() = Тест тайлан upload хийх. Тест fail байсан ч тайланг хадгална. if: failure() = Зөвхөн алдаатай үед (notification илгээх).

Тест 33

Staging орчин юу вэ?

  • A) Хөгжүүлэгчийн компьютер
  • B) Production-тэй ИЖИЛ орчин — Deploy-ийн өмнө QA тест хийх
  • C) Бодит хэрэглэгчдэд
  • D) Зөвхөн Unit test

Зөв хариулт: B

Тайлбар: Staging = Production-ийн "хуулбар". Ижил OS, DB, тохиргоо. Production-д deploy хийхийн өмнө staging-д тест. Staging OK → Production deploy.

Тест 34

GitHub Secrets юу хийдэг вэ?

  • A) Код хадгалах
  • B) Password, API key, token зэрэг НУУЦ мэдээллийг аюулгүй хадгалж, pipeline-д ашиглах
  • C) Тест ажиллуулах
  • D) Branch үүсгэх

Зөв хариулт: B

Тайлбар: ${{ secrets.DB_PASSWORD }} = Кодонд харагдахгүй, лог-д харагдахгүй. Settings → Secrets → Нэмэх. ХЭЗЭЭ Ч password кодонд hardcode хийхгүй!

Тест 35

Code Coverage гэж юу вэ?

  • A) Кодын мөрийн тоо
  • B) Тестээр ХАМРАГДСАН кодын ХУВЬ — JaCoCo-аар хэмжинэ
  • C) Алдааны тоо
  • D) Deploy-ийн тоо

Зөв хариулт: B

Тайлбар: Coverage 80% = Кодын 80% тестээр шалгагдсан. JaCoCo = Java coverage tool. Line coverage, branch coverage. Зөвлөмж: 70-80%+ хүрэх.

Тест 36

SonarQube юу хийдэг вэ?

  • A) Deploy хийх
  • B) Кодын чанарыг БҮРЭН шинжлэх — Bug, vulnerability, code smell, coverage
  • C) Docker ажиллуулах
  • D) Git удирдах

Зөв хариулт: B

Тайлбар: SonarQube = Статик шинжилгээ. Bug = Алдаатай код. Vulnerability = Аюулгүй байдлын сул тал. Code Smell = Муу дизайн. Pipeline-д нэмж автоматаар шалгана.

Тест 37

Тестийн пирамидын суурь юу вэ?

  • A) E2E тест
  • B) UNIT TEST — Олон тоо, маш хурдан, CI бүрт ажиллана
  • C) Integration тест
  • D) Manual тест

Зөв хариулт: B

Тайлбар: Пирамид: Unit (80%) → Integration (15%) → E2E (5%). Unit = Хурдан, олон. E2E = Удаан, бага. CI-д unit test ЗААВАЛ, integration test PR merge-д.

Тест 38

mvn clean verify юу хийдэг вэ?

  • A) Зөвхөн compile
  • B) Хуучин build ЦЭВЭРЛЭЖ, compile, test, package хийж, бүрэн ШАЛГАХ
  • C) Зөвхөн тест
  • D) Зөвхөн deploy

Зөв хариулт: B

Тайлбар: clean = target/ устгах. verify = compile → test → package → integration-test → verify. Бүрэн CI check. Тест fail → Build fail.

Тест 39

docker-compose up -d юу хийдэг вэ?

  • A) Нэг container
  • B) docker-compose.yml-д тодорхойлсон БҮХ service-ийг ДЭВСГЭРТ ажиллуулах
  • C) Container устгах
  • D) Image бүтээх

Зөв хариулт: B

Тайлбар: up = Бүх service эхлүүлэх. -d = Detached (background). app + db + redis бүгд нэг командаар. docker-compose down = Бүгдийг зогсоох.

Тест 40

EXPOSE 8080 (Dockerfile) юу хийдэг вэ?

  • A) Port нээх
  • B) Container-ийн 8080 PORT-г БАРИМТЖУУЛАХ (documentation) — Бодит port нээхгүй
  • C) Firewall тохируулах
  • D) App ажиллуулах

Зөв хариулт: B

Тайлбар: EXPOSE = Зөвхөн баримт (documentation). Бодит port нээхэд docker run -p 8080:8080 шаардлагатай. -p = Port mapping хийнэ.

Тест 41

CALMS загварын "A" юу вэ?

  • A) Architecture
  • B) AUTOMATION — Давталттай ажлыг автоматжуулах
  • C) Agile
  • D) API

Зөв хариулт: B

Тайлбар: CALMS = Culture, Automation, Lean, Measurement, Sharing. Automation = Build, test, deploy автомат → Хүний алдаа бага, хурд их.

Тест 42

"Integration Hell" гэж юу вэ?

  • A) Хурдан нэгтгэл
  • B) Удаан хугацаанд тусдаа ажилласан кодыг нэгтгэхэд ОЛОН ЗӨРЧИЛДӨЛ үүсэх
  • C) CI pipeline
  • D) Deploy стратеги

Зөв хариулт: B

Тайлбар: 2 долоо хоног тусдаа ажилласан 5 хөгжүүлэгчийн кодыг merge хийхэд → 100+ conflict. CI = Өдөр бүр merge → Зөрчилдөл бага, жижиг.

Тест 43

environment: production (GitHub Actions) юу хийдэг вэ?

  • A) Тест ажиллуулах
  • B) Production ОРЧИНД deploy хийхийн өмнө MANUAL APPROVAL шаардах (тохируулсан бол)
  • C) Код бичих
  • D) Docker ажиллуулах

Зөв хариулт: B

Тайлбар: GitHub Settings → Environments → production → Required reviewers. Deploy job ажиллахын өмнө хэн нэгэн approve хийх шаардлагатай. Аюулгүй deploy.

Тест 44

${{ github.sha }} юу вэ?

  • A) Branch нэр
  • B) Git COMMIT-ийн давтагдашгүй HASH — Docker image tag болгон ашиглана
  • C) Хэрэглэгчийн нэр
  • D) Repository нэр

Зөв хариулт: B

Тайлбар: github.sha = a1b2c3d4... (commit hash). Docker tag: student-api:a1b2c3d4 = Яг аль commit-аас бүтсэнийг мэднэ. Traceability.

Тест 45

Trunk-Based Development гэж юу вэ?

  • A) Олон branch удаан ашиглах
  • B) Main branch руу БАЙНГА (өдөр бүр) merge хийж, БОГИНО feature branch ашиглах
  • C) Branch ашиглахгүй
  • D) Зөвхөн release branch

Зөв хариулт: B

Тайлбар: Trunk-Based = Main ҮРГЭЛЖ deployable. Feature branch 1-2 хоног. Өдөр бүр merge. CI/CD-д хамгийн тохиромжтой. GitFlow = Нарийн, удаан.

Тест 46

spring.profiles.active=prod юу хийдэг вэ?

  • A) Тест ажиллуулах
  • B) application-prod.yml ТОХИРГООГ ашиглах — Production орчны тохиргоо
  • C) Код compile хийх
  • D) Docker ажиллуулах

Зөв хариулт: B

Тайлбар: Profile = Орчин бүрт тусдаа тохиргоо. application-dev.yml = H2 DB. application-prod.yml = PostgreSQL. --spring.profiles.active=prod = prod тохиргоо идэвхжинэ.

Тест 47

Linting гэж юу вэ?

  • A) Тест бичих
  • B) Кодын ФОРМАТ, СТИЛИЙГ автоматаар шалгах — Checkstyle, ESLint
  • C) Deploy хийх
  • D) Docker ажиллуулах

Зөв хариулт: B

Тайлбар: Linting = Кодын стандартын шалгалт. Indent, нэрлэлт, хоосон мөр. CI pipeline-д нэмж, стандартын зөрчил → Build fail.

Тест 48

actions/upload-artifact@v4 юу хийдэг вэ?

  • A) Код upload хийх
  • B) Pipeline-ийн БҮТЭЭГДЭХҮҮНИЙГ (JAR, test report) GitHub-д ХАДГАЛАХ
  • C) Docker push хийх
  • D) Deploy хийх

Зөв хариулт: B

Тайлбар: Artifact = Build-ийн үр дүн. JAR файл, test report, coverage report. GitHub Actions → Artifacts хэсэгт татаж авах боломжтой.

Тест 49

depends_on (Docker Compose) юу хийдэг вэ?

  • A) Container устгах
  • B) Container ЭХЛЭХ ДАРААЛЛЫГ тодорхойлох — app нь db-ээс ХОЙНО эхэлнэ
  • C) Port нээх
  • D) Image бүтээх

Зөв хариулт: B

Тайлбар: depends_on: db = DB container эхэлсний дараа app эхэлнэ. condition: service_healthy = DB БЭЛЭН болмогц (healthcheck OK).

Тест 50

volumes (Docker Compose) юу хийдэг вэ?

  • A) Container устгах
  • B) Өгөгдлийг container УСТСАН Ч ХАДГАЛАХ — Persistent storage
  • C) Port нээх
  • D) Лог харах

Зөв хариулт: B

Тайлбар: volumes: postgres_data:/var/lib/postgresql/data = DB өгөгдөл volume-д хадгалагдана. Container устгаж, дахин үүсгэсэн ч өгөгдөл хэвээрээ.

Тест 51

GitFlow-ийн develop branch юу вэ?

  • A) Production branch
  • B) Хөгжүүлэлтийн ҮНДСЭН branch — Feature branch-ууд эндээс салж, энд нэгтгэгдэнэ
  • C) Hotfix branch
  • D) Release branch

Зөв хариулт: B

Тайлбар: GitFlow: main (production) + develop (хөгжүүлэлт). Feature → develop → release → main. Trunk-Based-ээс нарийн, том баг, release schedule-д тохиромжтой.

Тест 52

docker logs student-api юу хийдэг вэ?

  • A) Container устгах
  • B) student-api container-ийн ЛОГУУДЫГ харуулах
  • C) Image бүтээх
  • D) Port нээх

Зөв хариулт: B

Тайлбар: docker logs = Container-ийн stdout, stderr. -f = Follow (шинэ лог гарахыг дагах). --tail 100 = Сүүлийн 100 мөр. Debug хийхэд чухал.

Тест 53

docker ps юу хийдэг вэ?

  • A) Image жагсаалт
  • B) Ажиллаж буй CONTAINER-уудын жагсаалт харуулах
  • C) Volume жагсаалт
  • D) Network жагсаалт

Зөв хариулт: B

Тайлбар: docker ps = Ажиллаж буй container-ууд. docker ps -a = Бүх container (зогссон ч). Container ID, Name, Status, Port.

Тест 54

Prometheus юу хийдэг вэ?

  • A) Лог цуглуулах
  • B) МЕТРИК цуглуулж, хадгалж, query хийх — Time series database
  • C) Trace хийх
  • D) Deploy хийх

Зөв хариулт: B

Тайлбар: Prometheus = /actuator/prometheus endpoint-оос метрик татна. CPU, Memory, HTTP request count, response time. PromQL = Query хэл. Grafana-тай хамт ашиглана.

Тест 55

Grafana юу хийдэг вэ?

  • A) Метрик цуглуулах
  • B) Метрик, лог, trace-ийг ВИЗУАЛ DASHBOARD-аар харуулах
  • C) Deploy хийх
  • D) Тест бичих

Зөв хариулт: B

Тайлбар: Grafana = Prometheus-ийн метрикийг graph, chart-аар харуулна. Alert тохируулах. CPU > 80% → Slack notification. Бодит цагийн мониторинг.

Тест 56

healthcheck (Docker Compose) юу хийдэг вэ?

  • A) Container устгах
  • B) Container ХЭВИЙН АЖИЛЛАЖ БУЙГ тогтмол ШАЛГАХ
  • C) Port нээх
  • D) Volume нэмэх

Зөв хариулт: B

Тайлбар: healthcheck: test: ["CMD", "pg_isready"] = PostgreSQL бэлэн эсэхийг шалгана. depends_on: condition: service_healthy = Бэлэн болмогц app эхлүүлнэ.

Тест 57

ENTRYPOINT vs CMD (Dockerfile)-ийн ялгаа юу вэ?

  • A) Ялгаагүй
  • B) ENTRYPOINT = Container-ийн ҮНДСЭН команд (override хийхэд хэцүү), CMD = Default параметр (override хялбар)
  • C) CMD = Үндсэн
  • D) ENTRYPOINT = Параметр

Зөв хариулт: B

Тайлбар: ENTRYPOINT ["java", "-jar", "app.jar"] = Үргэлж java ажиллана. CMD ["--server.port=8080"] = Default port, override хийж болно. ENTRYPOINT + CMD = Хамтдаа.

Тест 58

CI pipeline яагаад 10 минутаас БАГА байх ёстой вэ?

  • A) Чухал биш
  • B) Хөгжүүлэгчид ХУРДАН хариу авч, БҮТЭЭМЖТЭЙ ажиллах — Удаан pipeline = Хүлээлт, саатал
  • C) Зөвхөн Docker-д
  • D) Зөвхөн тестэд

Зөв хариулт: B

Тайлбар: 10 мин+ pipeline = Хөгжүүлэгч өөр ажил руу шилжинэ → Контекст алдагдана. Cache, parallel job, skip unnecessary tests = Хурдасгах. Зорилго: < 5 мин.

Тест 59

matrix strategy (GitHub Actions) юу хийдэг вэ?

  • A) Нэг тохиргоо
  • B) ОЛОН тохиргоогоор (Java 11, 17, 21) ЗЭРЭГ тест ажиллуулах
  • C) Нэг job
  • D) Нэг runner

Зөв хариулт: B

Тайлбар: matrix: java: [11, 17, 21] = 3 Java хувилбараар зэрэг тест. 3 runner зэрэг ажиллана. Олон OS, олон хувилбар шалгахад тохиромжтой.

Тест 60

Semantic Versioning (SemVer) юу вэ?

  • A) Дурын дугаар
  • B) MAJOR.MINOR.PATCH — v1.2.3 (Breaking.Feature.Fix) хувилбарлалтын стандарт
  • C) Зөвхөн нэг тоо
  • D) Огноо

Зөв хариулт: B

Тайлбар: v1.2.3 = MAJOR (1, эвдрэх өөрчлөлт), MINOR (2, шинэ feature), PATCH (3, bug fix). v1.2.3 → v1.2.4 = Fix. v1.3.0 = Feature. v2.0.0 = Breaking.

Тест 61

docker stop vs docker kill-ийн ялгаа юу вэ?

  • A) Ялгаагүй
  • B) stop = SIGTERM (ЗӨӨЛӨН зогсоох, цэвэрлэх), kill = SIGKILL (ШУУД зогсоох)
  • C) stop = Хурдан
  • D) kill = Удаан

Зөв хариулт: B

Тайлбар: docker stop = Graceful shutdown (10 сек хүлээнэ). App нь connection хаах, файл хадгалах боломжтой. docker kill = Шууд. Production-д stop ашиглах.

Тест 62

.dockerignore файл юу хийдэг вэ?

  • A) Docker устгах
  • B) Docker build хийхэд ШААРДЛАГАГҮЙ файлыг АЛГАСАХ — Image жижигрүүлэх
  • C) Container устгах
  • D) Image устгах

Зөв хариулт: B

Тайлбар: .dockerignore = .gitignore шиг. .git, target/, node_modules/, *.md алгасах → Build context жижиг → Build хурдан, image жижиг.

Тест 63

environment variables (Docker) юу хийдэг вэ?

  • A) Code бичих
  • B) Container-д ТОХИРГОО дамжуулах — DB URL, password зэрэг ОРЧНООС хамааралтай утгууд
  • C) Port нээх
  • D) Volume нэмэх

Зөв хариулт: B

Тайлбар: environment: SPRING_DATASOURCE_URL=jdbc:postgresql://db:5432/mydb = Container дотор ENV variable болж, Spring Boot автоматаар ашиглана. 12-Factor App зарчим.

Тест 64

Helm (K8s) юу хийдэг вэ?

  • A) Docker image бүтээх
  • B) Kubernetes YAML manifest-уудыг TEMPLATE болгож, package хэлбэрээр удирдах
  • C) Тест бичих
  • D) CI pipeline үүсгэх

Зөв хариулт: B

Тайлбар: Helm = K8s-ийн "package manager". Chart = Template + Values. helm install student-api ./chart = Deployment, Service, ConfigMap бүгдийг нэг командаар.

Тест 65

Shift-Left Testing гэж юу вэ?

  • A) Тестийг ХОЙШЛУУЛАХ
  • B) Тестийг хөгжүүлэлтийн ЭХЭН шатанд (ЗҮҮН тийш) шилжүүлж, алдааг ЭРТ олох
  • C) Зөвхөн E2E тест
  • D) Зөвхөн manual тест

Зөв хариулт: B

Тайлбар: Уламжлалт: Код бичих → ... → Тест (хамгийн сүүлд). Shift-Left: Тест ЭХНЭЭС → CI-д unit test, linting, security scan. Алдааг эрт олох = Засах зардал бага.

Тест 66

DORA metrics юу вэ?

  • A) Кодын метрик
  • B) DevOps-ийн ГҮЙЦЭТГЭЛИЙГ хэмжих 4 метрик — Deploy давтамж, Lead time, MTTR, Change failure rate
  • C) Тестийн метрик
  • D) DB метрик

Зөв хариулт: B

Тайлбар: DORA = DevOps Research and Assessment. 1) Deploy давтамж (өдөрт хэд). 2) Lead time (commit → production). 3) MTTR (алдаа засах хурд). 4) Change failure rate (алдаатай deploy-ийн хувь).

Тест 67

12-Factor App юу вэ?

  • A) 12 хэлээр бичих
  • B) Cloud-native програмын 12 ЗАРЧИМ — Config орчноос, backing service URL-ээр, stateless зэрэг
  • C) 12 тест бичих
  • D) 12 deploy хийх

Зөв хариулт: B

Тайлбар: 12-Factor: Codebase, Dependencies, Config, Backing services, Build-release-run, Processes (stateless), Port binding, Concurrency, Disposability, Dev/prod parity, Logs, Admin. Cloud, Docker, K8s-д чухал.

Тест 68

GitOps гэж юу вэ?

  • A) Зөвхөн Git ашиглах
  • B) Git repository-г SINGLE SOURCE OF TRUTH болгож, дэд бүтэц ба deploy-г Git-ээр удирдах
  • C) Зөвхөн code review
  • D) Зөвхөн branching

Зөв хариулт: B

Тайлбар: GitOps = Git push → ArgoCD/FluxCD → K8s автомат sync. Git repo = Desired state. K8s = Actual state. Ялгаатай бол → Автомат шинэчлэнэ. Declarative + Automated.

Тест 69

Rolling Deploy стратеги юу вэ?

  • A) Бүгдийг зогсоож шинэчлэх
  • B) Серверүүдийг НЭГ НЭГЭЭР шинэчлэх — Зарим нь хуучин, зарим нь шинэ
  • C) 2 орчин солих
  • D) 5% хэрэглэгчид

Зөв хариулт: B

Тайлбар: Rolling = Сервер 1 шинэчлэх → OK → Сервер 2 → ... → Бүгд шинэ. K8s default стратеги. Downtime бага, гэхдээ rollback удаан (бүгдийг буцаах).

Тест 70

docker images юу хийдэг вэ?

  • A) Container жагсаалт
  • B) Локал хадгалагдсан Docker IMAGE-уудын ЖАГСААЛТ харуулах
  • C) Volume жагсаалт
  • D) Network жагсаалт

Зөв хариулт: B

Тайлбар: docker images = Repository, Tag, Image ID, Size. docker rmi image_id = Image устгах. docker image prune = Ашиглагдаагүй image цэвэрлэх.

Тест 71

Docker Hub юу вэ?

  • A) Git repository
  • B) Docker IMAGE-уудын НИЙТИЙН REGISTRY — Image push/pull хийх
  • C) CI platform
  • D) IDE

Зөв хариулт: B

Тайлбар: Docker Hub = Docker image-ийн "GitHub". docker push myapp:1.0 = Upload. docker pull postgres:15 = Download. Public + Private repo.

Тест 72

FROM eclipse-temurin:17-jre-alpine юу хийдэг вэ?

  • A) App ажиллуулах
  • B) Жижиг Alpine Linux + Java 17 JRE СУУРЬ IMAGE ашиглах
  • C) Maven суулгах
  • D) Тест ажиллуулах

Зөв хариулт: B

Тайлбар: alpine = Маш жижиг Linux (~5MB). jre = Зөвхөн Java ажиллуулах (jdk-гүй → жижиг). Production image: jre-alpine = ~100MB (jdk = ~400MB).

Тест 73

COPY --from=builder (multi-stage) юу хийдэг вэ?

  • A) Бүх файл хуулах
  • B) ӨМНӨХ stage (builder)-аас зөвхөн ШААРДЛАГАТАЙ файлыг (JAR) хуулах
  • C) Git-ээс хуулах
  • D) Network-ээс хуулах

Зөв хариулт: B

Тайлбар: COPY --from=builder /app/target/*.jar app.jar = builder stage-д бүтсэн JAR-г л хуулна. Maven, src, .git зэрэг → Хуулахгүй → Эцсийн image жижиг.

Тест 74

CI pipeline-д services (GitHub Actions) юу хийдэг вэ?

  • A) App deploy хийх
  • B) Тест ажиллуулахад шаардлагатай ГАДНЫ SERVICE (PostgreSQL, Redis) container-аар нэмэх
  • C) Код compile хийх
  • D) Image бүтээх

Зөв хариулт: B

Тайлбар: services: postgres: image: postgres:15 = Integration test-д PostgreSQL container runner дээр ажиллана. Тест бодит DB-тэй ажиллана.

Тест 75

concurrency (GitHub Actions) юу хийдэг вэ?

  • A) Job нэмэх
  • B) Ижил workflow-ийн ЗЭРЭГ ажиллах тоог хязгаарлаж, хуучнийг ЦУЦЛАХ
  • C) Runner нэмэх
  • D) Step нэмэх

Зөв хариулт: B

Тайлбар: concurrency: group: deploy, cancel-in-progress: true = Шинэ push хийвэл хуучин pipeline цуцлагдана. Нөөц хэмнэх, шаардлагагүй build-аас зайлсхийх.

Тест 76

timeout-minutes (GitHub Actions) юу хийдэг вэ?

  • A) Job хурдасгах
  • B) Job-ийн ХАМГИЙН ИХ ажиллах хугацааг тогтоож, хэтэрвэл ЗОГСООХ
  • C) Step нэмэх
  • D) Runner нэмэх

Зөв хариулт: B

Тайлбар: timeout-minutes: 15 = 15 минутаас удвал job fail болно. Гацсан pipeline-ийг автоматаар зогсоох. Default: 360 мин (6 цаг).

Тест 77

Conventional Commits юу вэ?

  • A) Дурын commit message
  • B) feat:, fix:, ci: зэрэг СТАНДАРТ prefix ашиглан commit message бичих
  • C) Зөвхөн нэг үг
  • D) Зөвхөн тоо

Зөв хариулт: B

Тайлбар: feat: add enrollment API = Шинэ feature. fix: resolve N+1 query = Bug fix. ci: add Docker build step = CI өөрчлөлт. Changelog автоматаар үүсгэхэд ашиглана.

Тест 78

MTTR (Mean Time To Recovery) юу вэ?

  • A) Deploy хугацаа
  • B) Алдаа гарснаас ЗАСВАРЛАХ хүртэлх ДУНДАЖ ХУГАЦАА
  • C) Build хугацаа
  • D) Test хугацаа

Зөв хариулт: B

Тайлбар: MTTR = DORA metric. Алдаа → Олох → Засах → Deploy = MTTR. Бага MTTR = Сайн DevOps. Мониторинг + Rollback бэлэн = MTTR бууруулна.

Тест 79

docker exec -it container_name bash юу хийдэг вэ?

  • A) Container устгах
  • B) Ажиллаж буй container ДОТОР shell нээж, командууд ажиллуулах
  • C) Image бүтээх
  • D) Container эхлүүлэх

Зөв хариулт: B

Тайлбар: docker exec = Container дотор нэмэлт процесс ажиллуулах. -it = Interactive terminal. Debug хийх, лог шалгах, DB-д холбогдоход ашиглана.

Тест 80

docker network юу хийдэг вэ?

  • A) Container устгах
  • B) Container хоорондын СҮЛЖЭЭ тодорхойлж, ХОЛБОХ
  • C) Image бүтээх
  • D) Volume нэмэх

Зөв хариулт: B

Тайлбар: Docker Compose = Автоматаар network үүсгэнэ. app → db:5432 гэж дуудна (container нэрээр). Network тусгаарлалт = Аюулгүй.

Тест 81

cache-from: type=gha (Docker build) юу хийдэг вэ?

  • A) Container устгах
  • B) GitHub Actions-ийн КЭШ ашиглаж Docker build ХУРДАСГАХ
  • C) Image устгах
  • D) Volume нэмэх

Зөв хариулт: B

Тайлбар: Docker layer кэш = Өөрчлөгдөөгүй layer дахин build хийхгүй. gha = GitHub Actions cache backend. Build 5 мин → 1 мин.

Тест 82

Smoke Test гэж юу вэ?

  • A) Бүрэн тест
  • B) Deploy-ийн дараа СИСТЕМИЙН ҮНДСЭН функц ажиллаж буйг ХУРДАН шалгах
  • C) Unit тест
  • D) Load тест

Зөв хариулт: B

Тайлбар: Smoke Test = "Утаа гарч байна уу?" Health check, login, нүүр хуудас ачаалагдаж буй эсэх. Deploy-ийн дараа 30 секундэд шалгана.

Тест 83

Immutable Infrastructure гэж юу вэ?

  • A) Серверийг засварлах
  • B) Серверийг ХЭЗЭЭ Ч өөрчлөхгүй — Шинэ хувилбар = Шинэ сервер/container ҮҮСГЭХ
  • C) Зөвхөн Docker
  • D) Зөвхөн K8s

Зөв хариулт: B

Тайлбар: Mutable = Сервер дээр SSH → patch суулгах → "Юу өөрчлөгдсөнийг мэдэхгүй". Immutable = Шинэ Docker image → Шинэ container. Хуучныг устгах. Предсказуем, найдвартай.

Тест 84

docker system prune юу хийдэг вэ?

  • A) Docker устгах
  • B) Зогссон container, ашиглагдаагүй image, network, cache ЦЭВЭРЛЭХ — Зай чөлөөлөх
  • C) Бүх container эхлүүлэх
  • D) Бүх image татах

Зөв хариулт: B

Тайлбар: docker system prune = Disk зай чөлөөлөх. -a = Бүх ашиглагдаагүй image устгах. CI runner-д build завсрын зүйл цэвэрлэхэд ашиглана.

Тест 85

Secret Management хэрэгслүүд аль нь вэ?

  • A) Git-д хадгалах
  • B) HashiCorp Vault, AWS Secrets Manager, GitHub Secrets — Нууц мэдээллийг АЮУЛГҮЙ удирдах
  • C) .env файлд
  • D) Код дотор

Зөв хариулт: B

Тайлбар: Vault = Нууц мэдээллийн цахим сейф. Encrypt + Access control + Audit log. ХЭЗЭЭ Ч: Password Git-д push хийхгүй! .env файлыг .gitignore-д нэмэх.

Тест 86

workflow_dispatch trigger юу хийдэг вэ?

  • A) Push-д ажиллах
  • B) Pipeline-г ГАРААР (manual) ЭХЛҮҮЛЭХ боломж олгох
  • C) PR-д ажиллах
  • D) Schedule-д ажиллах

Зөв хариулт: B

Тайлбар: on: workflow_dispatch = GitHub Actions → Run workflow товч. Input parameter нэмж болно. Hotfix deploy, тусгай тест ажиллуулахад ашиглана.

Тест 87

schedule trigger (GitHub Actions) юу хийдэг вэ?

  • A) Push бүрт
  • B) Тогтсон ЦАГИЙН ХУВААРЬААР pipeline автоматаар ажиллуулах (cron)
  • C) PR бүрт
  • D) Гараар

Зөв хариулт: B

Тайлбар: on: schedule: - cron: '0 2 * * *' = Өдөр бүр шөнийн 2 цагт. Nightly build, dependency vulnerability scan, cleanup ажилд ашиглана.

Тест 88

Artifact Registry (Container Registry) юу вэ?

  • A) Git repository
  • B) Docker IMAGE хадгалах ХУВИЙН REGISTRY — Docker Hub, AWS ECR, GCR
  • C) Кодын repository
  • D) Тестийн platform

Зөв хариулт: B

Тайлбар: Registry = Image хадгалах газар. Docker Hub (public), AWS ECR (private), GitHub Container Registry. CI → Build → Push to registry → Deploy → Pull from registry.

Тест 89

Load Balancer юу хийдэг вэ?

  • A) Код compile хийх
  • B) Хэрэглэгчдийн хүсэлтийг ОЛОН серверт ХУВААРИЛАХ — Ачаалал тэнцвэржүүлэх
  • C) Тест ажиллуулах
  • D) Image бүтээх

Зөв хариулт: B

Тайлбар: Load Balancer = Хүсэлтийг сервер 1, 2, 3 руу тараах. Нэг сервер унтарвал → Бусад руу. Blue-Green deploy: Traffic Green руу шилжүүлэх. AWS ALB, Nginx.

Тест 90

docker tag юу хийдэг вэ?

  • A) Container нэрлэх
  • B) Байгаа image-д ШИНЭ TAG (нэр:хувилбар) өгөх
  • C) Image устгах
  • D) Container эхлүүлэх

Зөв хариулт: B

Тайлбар: docker tag student-api:latest myregistry/student-api:v1.2.3 = Ижил image, шинэ нэр. Registry руу push хийхийн өмнө tag нэмнэ.

Тест 91

Pipeline-д "fail fast" зарчим юу вэ?

  • A) Бүгдийг ажиллуулах
  • B) Алдаа гарвал pipeline-г ДАРУЙ зогсоох — Шаардлагагүй алхмуудыг ажиллуулахгүй
  • C) Алдааг үл тоох
  • D) Удаан ажиллуулах

Зөв хариулт: B

Тайлбар: Unit test fail → Integration test, Docker build ажиллуулах ШААРДЛАГАГҮЙ. Хурд + Нөөц хэмнэх. needs: = Өмнөх job fail → Дараагийн job skip.

Тест 92

Chaos Engineering гэж юу вэ?

  • A) Системийг устгах
  • B) Системд ЗОРИУДААР алдаа оруулж, ТЭСВЭРЛЭХ ЧАДВАРЫГ шалгах
  • C) Код бичих
  • D) Тест бичих

Зөв хариулт: B

Тайлбар: Netflix Chaos Monkey = Production-д server зориудаар унтраах → Систем автоматаар сэргэж чадаж байна уу? Resilience тест. "Сайн цагт бэлтгэх".

Тест 93

docker-compose.override.yml юу хийдэг вэ?

  • A) docker-compose.yml устгах
  • B) Үндсэн docker-compose.yml-г ДАРЖ, ЛОКАЛ хөгжүүлэлтийн тохиргоо нэмэх
  • C) Production тохиргоо
  • D) Test тохиргоо

Зөв хариулт: B

Тайлбар: docker-compose.yml = Үндсэн. docker-compose.override.yml = Локал нэмэлт (volume mount, debug port). Автоматаар merge хийгдэнэ.

Тест 94

Blue-Green deploy-ийн гол ДАВУУ тал юу вэ?

  • A) Хямд
  • B) DOWNTIME-ГҮЙ deploy + ХУРДАН rollback (traffic буцаахад л хангалттай)
  • C) Нэг сервер
  • D) Автомат тест

Зөв хариулт: B

Тайлбар: Blue-Green: Traffic шилжүүлэх = Секунд. Rollback = Traffic буцаах = Секунд. Сул тал: 2 орчин хэрэгтэй = 2x нөөц зардал.

Тест 95

WORKDIR /app (Dockerfile) юу хийдэг вэ?

  • A) Image бүтээх
  • B) Container дотор АЖЛЫН ХАВТСЫГ /app болгож тохируулах
  • C) Port нээх
  • D) App ажиллуулах

Зөв хариулт: B

Тайлбар: WORKDIR /app = Дараагийн COPY, RUN командууд /app хавтаст ажиллана. cd /app шиг, гэхдээ хавтас байхгүй бол автоматаар үүсгэнэ.

Тест 96

RUN vs CMD (Dockerfile)-ийн ялгаа юу вэ?

  • A) Ялгаагүй
  • B) RUN = IMAGE БҮТЭЭХ үед ажиллана, CMD = CONTAINER ЭХЛЭХ үед ажиллана
  • C) RUN = Container үед
  • D) CMD = Build үед

Зөв хариулт: B

Тайлбар: RUN apt-get install -y curl = Build үед (image layer нэмнэ). CMD ["java", "-jar", "app.jar"] = Container эхлэхэд ажиллана. Build vs Runtime.

Тест 97

Pipeline-д Parallel Jobs яагаад чухал вэ?

  • A) Чухал биш
  • B) Бие биенээсээ хамааралгүй job-уудыг ЗЭРЭГ ажиллуулж, pipeline-г ХУРДАСГАХ
  • C) Нэг job
  • D) Дараалсан

Зөв хариулт: B

Тайлбар: Unit test (2 мин) + Linting (1 мин) = Дараалсан: 3 мин. Зэрэгцээ: 2 мин. needs: ашиглахгүй → Автоматаар зэрэг ажиллана.

Тест 98

docker volume ls юу хийдэг вэ?

  • A) Container жагсаалт
  • B) Docker VOLUME-уудын жагсаалт харуулах — Persistent data хадгалдаг
  • C) Image жагсаалт
  • D) Network жагсаалт

Зөв хариулт: B

Тайлбар: Volume = Container-аас тусдаа өгөгдөл хадгалах. docker volume ls = Бүх volume. docker volume rm = Устгах. docker volume prune = Ашиглагдаагүй цэвэрлэх.

Тест 99

CI/CD яагаад "Main branch ҮРГЭЛЖ deployable" байх ёстой вэ?

  • A) Чухал биш
  • B) Хэзээ ч ХУРДАН, ИТГЭЛТЭЙ deploy хийх — Hotfix, шинэ feature-ийг саадгүй хүргэх
  • C) Зөвхөн тестэд
  • D) Зөвхөн build-д

Зөв хариулт: B

Тайлбар: Main = Deployable = CI бүх тест pass + Код чанар OK. Яаралтай hotfix хэрэгтэй → Main-аас шууд deploy. Main эвдэрхий → Deploy хийж ЧАДАХГҮЙ → Бизнесийн эрсдэл.

Тест 100

CI/CD ба DevOps яагаад орчин үеийн програм хангамжийн бүтээлтэд хамгийн чухал вэ?

  • A) Зөвхөн том компанид
  • B) Хурдан, найдвартай, байнгын хүргэлт — Хөгжүүлэлтээс production хүртэлх БҮТЭН автоматжуулалт
  • C) Зөвхөн deploy-д
  • D) Зөвхөн тестэд

Зөв хариулт: B

Тайлбар: DevOps + CI/CD = Код бичих → Push → Автомат build, test, quality check, Docker image, deploy → Мониторинг. Хүний оролцоо бага → Алдаа бага → Хурд их → Хэрэглэгчид хурдан хүрнэ. "Автоматжуулалт = Чөлөөлөлт."


📚 Ашигласан эх сурвалжууд:

  • Gene Kim, Jez Humble — The DevOps Handbook (IT Revolution, 2016)
  • Jez Humble, David Farley — Continuous Delivery (Addison-Wesley, 2010)
  • GitHub Actions Documentation — docs.github.com/en/actions
  • Docker Documentation — docs.docker.com
  • Kubernetes Documentation — kubernetes.io/docs
  • Terraform Documentation — developer.hashicorp.com/terraform
  • Martin Fowler — Continuous Integration (martinfowler.com)
  • Nicole Forsgren et al. — Accelerate: The Science of Lean Software and DevOps (2018)