Хөгжүүлэлтийн CI/CD — үе шатуудын жишээ
Энэ хуудас дараах үе шаттай pipeline-ийн бүтэн жишээ .gitlab-ci.yml-ийг агуулна:
| Үе шат | Зориулалт |
|---|---|
| code-check | SonarQube-оор кодын чанар шалгах |
| migration | Atlas ашиглан өгөгдлийн сангийн migration (dev / prod орчин) |
| build | Docker image build, registry руу push — development салбарт dev орчинд ажиллуулах, main дээр production image бэлтгэх |
| deploy | Production сервер дээр image татаж, container сэргээх |
Тэмдэглэл: Migration хэсэгт Atlas (atlas.hcl) ашиглана. Өөр хэрэгслийг сонговол db-migration job-ийн script-ийг тохируулна.
Хувьсагчид (variables)
| Хувьсагч | Жишээ / тайлбар |
|---|---|
IMAGE | git-registry.techpartners.asia/<namespace>/<project> — registry дээрх image-ийн бүтэн зам |
DEV_CONTAINER_NAME | Development орчинд ажиллах container-ийн нэр, жишээ: project_dev_api |
PROD_CONTAINER_NAME | Production 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дээрprodAtlas орчны 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-тай тааруулна.