Skip to main content

Хөгжүүлэлтийн CI/CD — үе шатуудын жишээ

Энэ хуудас дараах үе шаттай pipeline-ийн бүтэн жишээ .gitlab-ci.yml-ийг агуулна:

Үе шатЗориулалт
code-checkSonarQube-оор кодын чанар шалгах
migrationAtlas ашиглан өгөгдлийн сангийн migration (dev / prod орчин)
buildDocker image build, registry руу push — development салбарт dev орчинд ажиллуулах, main дээр production image бэлтгэх
deployProduction сервер дээр image татаж, container сэргээх

Тэмдэглэл: Migration хэсэгт Atlas (atlas.hcl) ашиглана. Өөр хэрэгслийг сонговол db-migration job-ийн script-ийг тохируулна.


Хувьсагчид (variables)

ХувьсагчЖишээ / тайлбар
IMAGEgit-registry.techpartners.asia/<namespace>/<project> — registry дээрх image-ийн бүтэн зам
DEV_CONTAINER_NAMEDevelopment орчинд ажиллах container-ийн нэр, жишээ: project_dev_api
PROD_CONTAINER_NAMEProduction container-ийн нэр, жишээ: project_prod_api

GitLab Settings → CI/CD → Variables дээр registry-д нэвтрэх (CI_REGISTRY_USER, CI_REGISTRY_PASSWORD эсвэл төслийн registry token), SonarQube (SONAR_HOST_URL), Atlas (ATLAS_HCL), орчны файлууд (DEV_CONFIG, PROD_ENV) зэргийг шаардлагатай бол нэмж тохируулна.


Docker registry-д нэвтрэх (YAML anchor)

Доорх блокыг олон job-д дахин ашиглахын тулд anchor (&docker-login) болгож тодорхойлно:

.docker-login: &docker-login
- echo "$CI_REGISTRY_PASSWORD" | docker login -u "$CI_REGISTRY_USER" --password-stdin "git-registry.techpartners.asia"

Бүтэн .gitlab-ci.yml жишээ

Доорх жишээнд path/to/your/app-ийг Dockerfile болон atlas.hcl орших бодит замаар солино. docker run-ийн -p хос портыг (8080:8080 гэх мэт) өөрийн аппын сонсох портод тааруулна.

stages:
- code-check
- migration
- build
- deploy

variables:
# Жишээ: git-registry.techpartners.asia/my-group/my-api
IMAGE: git-registry.techpartners.asia/my-group/my-api
DEV_CONTAINER_NAME: project_dev_api
PROD_CONTAINER_NAME: project_prod_api

.docker-login: &docker-login
- echo "$CI_REGISTRY_PASSWORD" | docker login -u "$CI_REGISTRY_USER" --password-stdin "git-registry.techpartners.asia"

# --- Code quality (SonarQube) ---
code-validate:
stage: code-check
image:
name: sonarsource/sonar-scanner-cli:11
entrypoint: [""]
variables:
SONAR_USER_HOME: "${CI_PROJECT_DIR}/.sonar"
GIT_DEPTH: "0"
cache:
policy: pull-push
key: "sonar-cache-$CI_COMMIT_REF_SLUG"
paths:
- "${SONAR_USER_HOME}/cache"
- sonar-scanner/
script:
- sonar-scanner -Dsonar.host.url="${SONAR_HOST_URL}"
allow_failure: false
rules:
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
- if: $CI_COMMIT_BRANCH == "main"
- if: $CI_COMMIT_BRANCH == "development"

# --- Atlas: өгөгдлийн сангийн migration (өгөгдлийн санд зориулсан жишээ) ---
db-migration:
stage: migration
rules:
- if: $CI_COMMIT_BRANCH == "development"
- if: $CI_COMMIT_BRANCH == "main"
script:
- cp "$ATLAS_HCL" "$(pwd)/path/to/your/app/atlas.hcl"
- |
cd "$(pwd)/path/to/your/app"
if [ "$CI_COMMIT_BRANCH" != "main" ]; then
atlas migrate diff --env dev
atlas migrate apply --env dev
else
atlas migrate diff --env prod
atlas migrate apply --env prod
fi
tags:
- strong-b-production-runner

# --- Development: build + registry + dev сервер дээр ажиллуулах ---
deploy-to-development:
stage: build
rules:
- if: $CI_COMMIT_BRANCH == "development"
script:
- *docker-login
- cp "$DEV_CONFIG" "$(pwd)/config.yml"
- docker build -f "$(pwd)/path/to/your/app/Dockerfile" -t "$IMAGE:dev-$CI_COMMIT_SHORT_SHA" .
- docker push "$IMAGE:dev-$CI_COMMIT_SHORT_SHA"
- docker rm -f "$DEV_CONTAINER_NAME" 2>/dev/null || true
- docker run -d --name "$DEV_CONTAINER_NAME" --restart always -p 8080:8080 "$IMAGE:dev-$CI_COMMIT_SHORT_SHA"
- docker image prune -f -a
- echo "API_IMAGE=$IMAGE:dev-$CI_COMMIT_SHORT_SHA" > build.env
tags:
- strong-b-production-runner
artifacts:
reports:
dotenv: build.env

# --- Production: зөвхөн main — image бэлтгэж build.env-д хадгална ---
build-to-production:
stage: build
rules:
- if: $CI_COMMIT_BRANCH == "main"
script:
- *docker-login
- cp "$PROD_ENV" "$(pwd)/.env"
- docker build -f "$(pwd)/path/to/your/app/Dockerfile" -t "$IMAGE:prod-$CI_COMMIT_SHORT_SHA" .
- docker push "$IMAGE:prod-$CI_COMMIT_SHORT_SHA"
- echo "API_IMAGE=$IMAGE:prod-$CI_COMMIT_SHORT_SHA" > build.env
tags:
- strong-b-production-runner
artifacts:
reports:
dotenv: build.env

# --- Production deploy: өмнөх job-оос API_IMAGE уншина ---
deploy-to-production:
stage: deploy
rules:
- if: $CI_COMMIT_BRANCH == "main"
needs:
- job: build-to-production
artifacts: true
script:
- *docker-login
- docker pull "$API_IMAGE"
- docker rm -f "$PROD_CONTAINER_NAME" || true
- docker run -d --name "$PROD_CONTAINER_NAME" --restart always -p 8080:8080 "$API_IMAGE"
- docker image prune -f -a
tags:
- production-server-runner

Job-уудын товч тайлбар

  • code-validate: MR, main, development салбарууд дээр Sonar scanner ажиллана. SONAR_HOST_URL зайлшгүй.
  • db-migration: development дээр dev, main дээр prod Atlas орчны migration (atlas migrate diff, apply). ATLAS_HCL нь GitLab variable эсвэл файлын зам байж болно — төслийн бүтэцтэй нийцүүлэн cp мөрийг өөрчилнө.
  • deploy-to-development: Development runner дээр image build/push, хуучин container устгаад шинээр ажиллуулна. build.env дотор API_IMAGE бичигдэнэ — энэ жишээнд дараагийн job түүнийг уншдаггүй; шаардлагатай бол child pipeline, гадаад триггер эсвэл нэмэлт job-оор дамжуулж болно.
  • build-to-production: Production-ийн .env эсвэл тохиргоо хуулж, prod-<sha> tag-тай image үүсгэж, API_IMAGE-ийг build.env-д бичнэ.
  • deploy-to-production: Production runner дээр needs + artifacts: true-аар build-to-production-оос API_IMAGE авна. Эхлээд pull хийж, хуучин container-ийг солино.

Runner tag-ууд: strong-b-production-runner нь development болон Docker build хийх серверт холбогдсон runner; production-server-runner нь зөвхөн production серверийн runner — GitLab дээр бүртгэхдээ үүсгэсэн tag-тай тааруулна.


Холбоотой материал