Skip to main content

CI/CD интеграци

GitLab Container Registry-ийг CI/CD pipeline-д нэгтгэх заавар. Энэ хэсэгт git-registry.techpartners.asia registry ашиглан Docker image-үүдийг бүрдүүлж, push хийх үйл явцыг тайлбарлана.


Үндсэн зарчим

GitLab CI/CD pipeline дотор:

  • dev branch: dev tag-аар image push хийнэ
  • main/master branch: latest болон commit SHA tag-аар image push хийнэ
  • Registry хаяг: git-registry.techpartners.asia

CI/CD тохиргоо

1. Variables тохиргоо

.gitlab-ci.yml файлд registry болон image-ийн мэдээллийг variables-д тодорхойлно:

variables:
REGISTRY_URL: 'git-registry.techpartners.asia'
IMAGE_NAME: 'git-registry.techpartners.asia/medtech/mrp/api'

Тайлбар:

  • REGISTRY_URL: Registry-ийн үндсэн хаяг
  • IMAGE_NAME: Таны project-ийн image-ийн бүтэн хаяг (namespace, project нэртэй)

2. Dev environment pipeline

Dev branch дээр ажиллах pipeline жишээ:

dev:
only:
- dev
stage: dev
script:
# 1. Environment файл хуулах
- cp $ENV_DEV "$(pwd)/.env"
# 2. Registry-д нэвтрэх
- echo "$CI_REGISTRY_PASSWORD" | docker login -u "$CI_REGISTRY_USER" --password-stdin "$REGISTRY_URL"
# 3. Docker image build хийх
- docker build -t "$IMAGE_NAME:dev" -t mrp-api:dev .
# 4. Registry-д push хийх
- docker push "$IMAGE_NAME:dev"
# 5. Хуучин container устгах
- docker ps --quiet --filter="name=mrp-api-dev" | xargs --no-run-if-empty docker rm -f
# 6. Шинэ container ажиллуулах
- docker run -dt -p 7470:8080 --add-host=prodvpn-new.golomtbank.com:10.20.30.1 --restart always --name mrp-api-dev mrp-api:dev
tags:
- medtech-deploy

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

  1. Environment файл (.env) хуулах
  2. Registry-д нэвтрэх
  3. Docker image бүрдүүлэх, dev tag өгөх
  4. Registry-д image push хийх
  5. Хуучин container-ийг устгах
  6. Шинэ container ажиллуулах

3. Production environment pipeline

Main branch дээр manual байдлаар ажиллах pipeline жишээ:

prod:
only:
- main
stage: prod
when: manual
script:
# 1. Production environment файл хуулах
- cp $ENV "$(pwd)/.env"
# 2. Registry-д нэвтрэх
- echo "$CI_REGISTRY_PASSWORD" | docker login -u "$CI_REGISTRY_USER" --password-stdin "$REGISTRY_URL"
# 3. Docker image build хийх (олон tag-тай)
- docker build -t "$IMAGE_NAME:latest" -t "$IMAGE_NAME:$CI_COMMIT_SHORT_SHA" -t mrp-api .
# 4. Registry-д push хийх
- docker push "$IMAGE_NAME:latest"
- docker push "$IMAGE_NAME:$CI_COMMIT_SHORT_SHA"
# 5. Хуучин container устгах
- docker ps --quiet --filter="name=mrp-api-prod" | xargs --no-run-if-empty docker rm -f
# 6. Шинэ container ажиллуулах
- docker run -dt -p 6060:8080 --add-host=prodvpn-new.golomtbank.com:10.20.30.1 --restart always --name mrp-api-prod mrp-api
tags:
- medtech-deploy

Production-ий онцлог:

  • when: manual: Manual ажиллуулна (автомат биш)
  • Олон tag: latest, commit SHA ($CI_COMMIT_SHORT_SHA)

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

variables:
REGISTRY_URL: 'git-registry.techpartners.asia'
IMAGE_NAME: 'git-registry.techpartners.asia/medtech/mrp/api'

stages:
- dev
- prod

dev:
only:
- dev
stage: dev
script:
- cp $ENV_DEV "$(pwd)/.env"
- echo "$CI_REGISTRY_PASSWORD" | docker login -u "$CI_REGISTRY_USER" --password-stdin "$REGISTRY_URL"
- docker build -t "$IMAGE_NAME:dev" -t mrp-api:dev .
- docker push "$IMAGE_NAME:dev"
- docker ps --quiet --filter="name=mrp-api-dev" | xargs --no-run-if-empty docker rm -f
- docker run -dt -p 7470:8080 --add-host=prodvpn-new.golomtbank.com:10.20.30.1 --restart always --name mrp-api-dev mrp-api:dev
tags:
- medtech-deploy

prod:
only:
- main
stage: prod
when: manual
script:
- cp $ENV "$(pwd)/.env"
- echo "$CI_REGISTRY_PASSWORD" | docker login -u "$CI_REGISTRY_USER" --password-stdin "$REGISTRY_URL"
- docker build -t "$IMAGE_NAME:latest" -t "$IMAGE_NAME:$CI_COMMIT_SHORT_SHA" -t mrp-api .
- docker push "$IMAGE_NAME:latest"
- docker push "$IMAGE_NAME:$CI_COMMIT_SHORT_SHA"
- docker ps --quiet --filter="name=mrp-api-prod" | xargs --no-run-if-empty docker rm -f
- docker run -dt -p 6060:8080 --add-host=prodvpn-new.golomtbank.com:10.20.30.1 --restart always --name mrp-api-prod mrp-api
tags:
- medtech-deploy

Pipeline амжилттай ажиллаж дууссаны дараа Container registry дараах байдлаар харагдана: Container Registry

Registry дотор: Registry tag


Image-ийг local татах

Registry-аас image татах жишээ:

# 1. Registry-д нэвтрэх
docker login git-registry.techpartners.asia

# 2. Image татах
docker pull git-registry.techpartners.asia/medtech/mrp/api:dev
docker pull git-registry.techpartners.asia/medtech/mrp/api:latest
docker pull git-registry.techpartners.asia/medtech/mrp/api:abc1234

# 3. Ажиллуулах
docker run -p 8080:8080 git-registry.techpartners.asia/medtech/mrp/api:latest

Cleanup Policy тохиргоо

Container Registry-ийн cleanup policy нь project эсвэл repository түвшинд тохируулна. Энэ тохиргоо нь хуучин tag-үүдийг автоматаар устгаж, хадгалах зайг хэмнэхэд тусална.

Cleanup Policy хэрхэн олох

  1. Project-ийн Settings хэсэг рүү орох
  2. Зүүн sidebar-аас Packages and registries сонгох

Packages and registries sidebar

  1. Cleanup policies хэсэг рүү орох

Cleanup Policy тохиргоо

Cleanup policy-д дараах тохиргоонуудыг хийж болно:

Cleanup policies тохиргоо

Үндсэн тохиргоонууд:

  • Enable cleanup policy: Cleanup policy-г идэвхжүүлэх/унтраах
  • Run cleanup: Cleanup хэзээ ажиллах (жишээ: өдөр бүр)
  • Keep these tags: Хадгалах tag-ууд
    • Keep the most recent: Хамгийн сүүлийн N tag хадгалах
    • Keep tags matching: Regex pattern-тай таарч байгаа tag-үүдийг хадгалах
  • Remove these tags: Устгах tag-ууд
    • Remove tags older than: N хоногоос эхлэн хуучин tag-үүдийг устгах
    • Remove tags matching: Regex pattern-тай таарч байгаа tag-үүдийг устгах

Жишээ тохиргоо:

  • Keep the most recent: 5 tags per image name
  • Keep tags matching: ^latest$|^dev$|^prod$|^v.*$
  • Remove tags older than: 7 days
  • Remove tags matching: .*

Энэ тохиргоо нь:

  • latest, dev, prod tag-үүд болон v-ээр эхэлсэн version tag-үүдийг хадгална
  • Хамгийн сүүлийн 5 tag-ийг хадгална
  • 7 хоногоос эхлэн хуучин tag-үүдийг устгана

Анхаарах: Policy-ийн шинэчлэл нь cleanup-ийн дараагийн ажиллах огноо, цагийг өөрчлөнө.


Нэмэлт материал