ЛЕКЦ 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)
| Зарчим | Англи | Тайлбар |
|---|---|---|
| C | Culture | Хамтын ажиллагааны соёл |
| A | Automation | Давталттай ажлыг автоматжуулах |
| L | Lean | Хог хаягдлыг багасгах, урсгалыг сайжруулах |
| M | Measurement | Бүх зүйлийг хэмжих (deploy хугацаа, алдааны хувь) |
| S | Sharing | Мэдлэг, туршлага хуваалцах |
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 Integration | Build + 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 |
| Test | Unit test, integration test | JUnit, Mockito |
| Analysis | Код чанар, аюулгүй байдал шалгах | SonarQube, Checkstyle |
| Package | Artifact үүсгэх (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 |
| Step | Job дотор нэг алхам | mvn test, docker build |
| Runner | Pipeline ажиллах сервер | 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 Machine | Container (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 |
| SpotBugs | Bug олох | 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-Green | 2 орчин: Blue (хуучин), Green (шинэ) → Шилжүүлэх | Бага |
| Canary | 5% хэрэглэгчид шинэ → Амжилттай бол 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-ээр хувилбарлана |
| Баримт | Баримтгүй | Код = Баримт |
Хэрэгслүүд:
| Хэрэгсэл | Зорилго | Жишээ |
|---|---|---|
| Terraform | Cloud дэд бүтэц | AWS EC2, RDS, VPC |
| Ansible | Серверийн тохиргоо | Java суулгах, тохиргоо |
| Docker | Програмын орчин | Container image |
| Kubernetes | Container зохион байгуулалт | Pod, Service, Deployment |
| Helm | K8s package manager | Chart ашиглан 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 |
| Trace | Traces | Хүсэлт ямар замаар явсан? | Jaeger, Zipkin |
Лог түвшнүүд:
| Түвшин | Хэрэглээ | Жишээ |
|---|---|---|
| ERROR | Ноцтой алдаа | DB холбогдохгүй, NullPointerException |
| WARN | Анхааруулга | Кэш дүүрсэн, retry хийж байна |
| INFO | Чухал үйл явдал | Хэрэглэгч нэвтэрсэн, захиалга үүссэн |
| DEBUG | Дэлгэрэнгүй debug | SQL 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:
| Шинж | GitFlow | Trunk-Based |
|---|---|---|
| Branch | main, develop, feature, release, hotfix | main + short-lived feature |
| Merge | Олон удаа, урт branch | Өдөр бүр main руу |
| CI/CD | Нарийн, удаан | Хурдан, энгийн |
| Тохиромжтой | Том баг, release schedule | CI/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 бүрт |
| Staging | Production-тэй ижил орчин, 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)
| # | Зарчим | Тайлбар |
|---|---|---|
| 1 | Commit бүрт CI | Алдааг ЭРТ олох |
| 2 | Тест бичих | Тестгүй CI = Хоосон CI |
| 3 | Pipeline хурдан | 10 минутаас бага (Cache, parallel) |
| 4 | Main branch = Deployable | Main ҮРГЭЛЖ deploy-д бэлэн |
| 5 | Feature Flag | Дуусаагүй feature → Flag-аар нуух |
| 6 | Rollback бэлэн | Хуучин хувилбар руу хурдан буцах |
| 7 | Мониторинг | Deploy-ийн дараа ШУУД хянах |
| 8 | Secrets хамгаалах | Password кодонд БАЙХГҮЙ |
| 9 | IaC ашиглах | Дэд бүтцийг кодоор |
| 10 | Increment deploy | Жижиг, байнгын өөрчлөлт |
| 11 | Code Review | PR merge-ийн өмнө review |
| 12 | Бүх орчин ижил | Dev ≈ Staging ≈ Production |
ХЭСЭГ 2: ТҮЛХҮҮР ҮГ БА МЭРГЭЖЛИЙН НЭР ТОМЬЁО (Keywords & Glossary)
| # | Англи нэр томьёо | Монгол утга | Дэлгэрэнгүй тайлбар |
|---|---|---|---|
| 1 | DevOps | DevOps | Development + Operations — Хөгжүүлэлт ба ашиглалтын нэгдэл. |
| 2 | CI (Continuous Integration) | Байнгын нэгтгэл | Код push бүрт автомат build + test. |
| 3 | CD (Continuous Delivery) | Байнгын хүргэлт | CI + Staging бэлэн, deploy гараар. |
| 4 | CD (Continuous Deployment) | Байнгын суулгалт | CI + Production руу автомат deploy. |
| 5 | Pipeline | Дамжлага | Код → Build → Test → Deploy автомат дараалал. |
| 6 | Workflow | Ажлын урсгал | GitHub Actions-ийн бүрэн pipeline (YAML). |
| 7 | Job | Ажил | Pipeline-ийн бие даасан ажлын нэгж. |
| 8 | Step | Алхам | Job дотор нэг үйлдэл. |
| 9 | Runner | Ажиллуулагч | Pipeline ажиллах сервер (ubuntu-latest). |
| 10 | Trigger / Event | Гох / Үйл явдал | Pipeline эхлүүлэх нөхцөл (push, PR). |
| 11 | Artifact | Бүтээгдэхүүн | Build-ийн үр дүн (JAR, Docker image). |
| 12 | Docker | Docker | Програмыг container-д ажиллуулах хэрэгсэл. |
| 13 | Container | Контейнер | Тусгаарлагдсан, хөнгөн ажиллах орчин. |
| 14 | Image | Дүрс | Container-ийн загвар (template). |
| 15 | Dockerfile | Dockerfile | Docker image бүтээх зааварчилгаа. |
| 16 | Docker Compose | Docker Compose | Олон container-ийг хамтад нь удирдах. |
| 17 | Kubernetes (K8s) | Kubernetes | Container зохион байгуулалтын платформ. |
| 18 | IaC | Дэд бүтэц кодоор | Infrastructure as Code — Terraform, Ansible. |
| 19 | Terraform | Terraform | Cloud дэд бүтцийг кодоор тодорхойлох. |
| 20 | Monitoring | Хяналт | Системийн төлөв, гүйцэтгэлийг хянах. |
| 21 | Logging | Лог бичих | Системийн үйл явдлыг текстээр бүртгэх. |
| 22 | Metrics | Хэмжигдэхүүн | CPU, Memory, Request/sec зэрэг тоон утгууд. |
| 23 | Tracing | Мөрдөлт | Хүсэлтийн замыг дагаж мөрдөх. |
| 24 | Blue-Green Deploy | Хөх-Ногоон суулгалт | 2 орчин солих → Downtime-гүй deploy. |
| 25 | Canary Deploy | Канар суулгалт | Бага хувьд шинэ хувилбар → Аажмаар нэмэгдүүлэх. |
| 26 | Rolling Deploy | Шатлал суулгалт | Серверүүдийг нэг нэгээр шинэчлэх. |
| 27 | Rollback | Буцаах | Алдаатай deploy-г хуучин хувилбар руу буцаах. |
| 28 | Feature Flag | Боломжийн тугалга | Шинэ feature-ийг тохиргоогоор нуух/харуулах. |
| 29 | SonarQube | SonarQube | Кодын чанарын шинжилгээний хэрэгсэл. |
| 30 | JaCoCo | JaCoCo | Java тест хамрах хүрээ (coverage) хэрэгсэл. |
| 31 | Code Coverage | Тест хамралт | Тестээр хамрагдсан кодын хувь. |
| 32 | Staging | Staging орчин | Production-тэй ижил тест орчин. |
| 33 | Production | Production орчин | Бодит хэрэглэгчдэд зориулсан орчин. |
| 34 | Health Check | Эрүүл мэндийн шалгалт | Систем хэвийн ажиллаж буй эсэхийг шалгах. |
| 35 | Actuator | Actuator | Spring Boot-ийн мониторинг endpoint-ууд. |
| 36 | Secret | Нууц мэдээлэл | Password, API key, token — кодонд хадгалдаггүй. |
| 37 | Trunk-Based Dev | Үндсэн салааны хөгжүүлэлт | Main branch руу байнга merge хийх. |
| 38 | Pull Request (PR) | Татах хүсэлт | Код merge хийхийн өмнөх review хүсэлт. |
| 39 | YAML | YAML | YAML Ain't Markup Language — Тохиргооны формат. |
| 40 | Observability | Ажиглах чадвар | Logs + Metrics + Traces = Систем ойлгох. |
ХЭСЭГ 3: ЛАБОРАТОРИ БА ПРАКТИК ЗААВАР (Labs & Step-by-Step Guide)
3.1 Лабораторийн зорилго
Энэ лабораторид та:
- GitHub Actions ашиглан Java/Spring Boot CI pipeline үүсгэх
- Автомат тест, код чанарын шалгалт нэмэх
- Docker image бүтээх pipeline нэмэх
- 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.tf→terraform 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
buildjob АМЖИЛТТАЙ дуусмагц ажиллана — Дарааллыг тодорхойлох - 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-apicontainer-ийн ЛОГУУДЫГ харуулах - 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/prometheusendpoint-оос метрик татна. 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)