Skip to content
Dokumentatsiya
Gitlab CI Release && Integrations

Gitlab CI | Releaselar va Integrationlar

gitlab-ci

Tashkilotlarda loyiha kodlarni samarali saqlash va boshqarish asosiy vazifalardan biri hisoblanadi. Bugungi amaliyotimizda biz loyiha kodlarini qanday qilib versiyalash va roolback(ortga qaytish)ni yo'lga qo'yamiz. Jamoa bilan ishlash uchun bir nechta integratsiyalarni ko'rib chiqamiz, bu amaliyotda asosan notification integrationlarni ko'rib chiqamiz.

Gitlab Releaselar

Loyihalarni versiyalash va rollback qilish uchun biz Gitlab Releaselardan foydalanamiz. Loyiha kodlarini samarali boshqarishning bir nechta usullari bor, barcha tashkilotlarning o'z kod saqlash srategiyalari bor, keling bu amalaiyotda bir loyiha kodlarini samarali manage qilishning bir usulini ko'rib chiqamiz.

gitlab-ci

Rasmdagi loyiha kodlarini samarali saqlash va boshqarish qarashini ko'rib chiqamiz:

  • Barcha loyihlarda environmentga qarab asosiy branchlar bo'ladi misol uchun: dev,test,prod
  • Barcha Dasturchilar guruhi loyihaning dev branchida ishlashadi va dev branch uchun DEV environmentga deploy bo'ladi.
  • Loyihaning TEST(yoki STAGE) va PROD branchlariga to'gridan to'gri o'zgartirish kiritish mumkin bo'lmaydi, faqat DEV -> TEST -> PROD qilib qadamma qadam prodga chiqish mumkin bo'ladi, ya'ni PROD chiqish uchun birinchi dev branchdan kodlar test branchga test branchdan esa prod branchga o'tkiziladi.
  • Stabil production kod prod yoki main branchda saqlanadi va shu branchlarda Release qilib kod versiyalanadi.
  • Bugungi amalaiyotda bizda main(prod) va dev,stage branchlar bo'ladi.

Keling loyiha kodlarini versiyalashni ko'rib chiqamiz. Biz misol uchun main branchga o'zgarish bo'lganda Gitlab release qilib loyiha kodlarini versiyalaydigan Gitlab CI yozamiz.

Ushbu amaliyotda biz gitlab.com/ismoilovdev/devops-journey (opens in a new tab) loyihasi misolida ko'rib chiqamiz.

Keling birinchi navbatda branchlar ochib chiqamiz.

gitlab-ci

gitlab-ci

Rasmda ko'rsatilganidek dev va stage branchlar ochib olamiz main branchimiz esa prod chiqadigan branchimiz bo'ladi.

Loyihamiz branchlar ro'yxati, bu yerda main branch default branch hisoblanadi. gitlab-ci

Gitlab CI

Loyihamiz Repositoriyasini sozlab olganimizdan keyin keling ikkita bosqichli Gitlab CI yozamiz yani build va release. Qachonki loyihamiz main branchida o'zgarish bo'lsa Gitlab CI pipelienmiz avtomatik ishga tushadi va loyihani build qilib keyin loyihani pipeline ID'si bilan versiyalab Release chiqaradi.

Gitlab CI yozish uchun loyihamiz papkasida .gitlab-ci.yml CI pipeline fayl ochib olamiz. Mana bizning gitlab-ci.yml konfiguratsiyamiz.

.gitlab-ci.yml
stages:
  - build
  - release
 
variables:
  NODE_VERSION: "20.x"
 
cache:
  key: "$CI_COMMIT_REF_SLUG"
  paths:
    - node_modules/
 
before_script:
  - |
    if [[ "$CI_JOB_NAME" != *"release_job"* ]]; then
      apt-get update -qy
      apt-get install -y curl
      curl -sL https://deb.nodesource.com/setup_20.x | bash -
      apt-get install -y nodejs
      npm install -g pnpm
    fi
 
build:
  stage: build
  image: node:20
  script:
    - pnpm install
    - pnpm next build
  rules:
    - if: '$CI_COMMIT_BRANCH == "main"'
 
release_job:
  stage: release
  image: registry.gitlab.com/gitlab-org/release-cli:latest
  script:
    - echo "Running release_job for $TAG"
  release:
    tag_name: "v0.$CI_PIPELINE_IID"
    description: "v0.$CI_PIPELINE_IID"
    ref: "$CI_COMMIT_SHA"
  rules:
    - if: '$CI_COMMIT_BRANCH == "main"'

Keling loyihamizda .gitlab-ci.yml konfigiga shu Gitlab CI konfiguratsiyani qo'shib main branchga push qilamiz va bizda loyihamiz main branchiga o'tganimizda Gitlab CI pipeline ishlayotganini ko'rishimiz mumkin.

gitlab-ci

Repositoriyamizdan -> Build -> Pipelinesga o'tib jarayonni kuzatishimiz mumkin. gitlab-ci

gitlab-ci

Okeyyy bizda Gitlab Ci pipelinemiz muvaffiqiyatli ishga tushdi, keling loyihani versiyalab reliz chiqarganini ko'rib chiqamiz. gitlab-ci

Repositoriyamizga o'tib Release bo'limiga o'tamiz. gitlab-ci

Releasega kirganimizda loyihamizda bitta v0.1 tag bilan reliz chiqganini ko'rishimiz mumkin. gitlab-ci

Okeyy keling endi bu Gitlab CI pipelineni va vazifalarini ko'rib chiqamiz.

Bu qism ikkita stage bo'lishini belgilaydi ya'ni build va release

stages:
  - build
  - release

Bu qismda variables ga Nodejs 20.x belgilanadi yani bu loyihani Nodejs 20.x da ishga tushirishni bildiradi. cache qismi esa Nodejs loyihani ya'ni node_modules/ papkani keshlashni bildiradi bu keyingi CI larni tezlashtirishga yordam beradi.

variables:
  NODE_VERSION: "20.x"
 
cache:
  key: "$CI_COMMIT_REF_SLUG"
  paths:
    - node_modules/

Bu qismda esa before_script Gitlab CI pipeline joblari ishga tushmasidan oldin ishga tushadigan qism hisoblanadi va NoeJS loyihani build qilish uchun runnerga NodeJS o'rnatib, pnpm ham o'rnatib loyihani build qilishga tayyor bo'ladi.

before_script:
  - |
    if [[ "$CI_JOB_NAME" != *"release_job"* ]]; then
      apt-get update -qy
      apt-get install -y curl
      curl -sL https://deb.nodesource.com/setup_20.x | bash -
      apt-get install -y nodejs
      npm install -g pnpm
    fi

Bu esa build bosqich hisoblanadi bu bosqichda pnpm install va pnpm next build buyruqlari yordamida main branchdagi Nodejs loyiha build qilinadi.

build:
  stage: build
  image: node:20
  script:
    - pnpm install
    - pnpm next build
  rules:
    - if: '$CI_COMMIT_BRANCH == "main"'

Ushbu bosqich release bosqich hisoblanadi. Bu bosqichda registry.gitlab.com/gitlab-org/release-cli:latest docker imagedan foydalangan holda Release chiqariladi. Release faqat main branchda o'zgarish bo'lganidagina main branchdagi kodlardan foydalanib ishlaydi.

release_job:
  stage: release
  image: registry.gitlab.com/gitlab-org/release-cli:latest
  script:
    - echo "Running release_job for $TAG"
  release:
    tag_name: "v0.$CI_PIPELINE_IID"
    description: "v0.$CI_PIPELINE_IID"
    ref: "$CI_COMMIT_SHA"
  rules:
    - if: '$CI_COMMIT_BRANCH == "main"'

Integrationlar

Tashkilotda loyihalarni samarali boshqarish va jamoa bilan ishlashni yaxshilash uchun har xil usullardan foydalaniladi, bulardan eng keng tarqagani Repositoriyalarga notification integratsiyalar hisoblanadi. Bugun biz Loyihalarimizga notification uchun Discord bilan inetgegratsiya qilamiz.

Keling birinchi o'rinda Discord sozlab olamiz. Discord kirib Add a Server bosib Server yaratib olamiz

gitlab-ci

gitlab-ci

gitlab-ci

Serverga nom berib Create bosamiz.

gitlab-ci

Discord Server yaratib olganimzidan keyin Serverimizda channel yaratib olamiz. Create Channel

gitlab-ci

Channel nomini yozamiz masalan merge-requests -> Create Channel

gitlab-ci

Channel ochib olganimzidan keyin Integrations bo'limga kirib Webhooksdan Create Webhook bosamiz

gitlab-ci

Webhook yaratib olganimizdan keyin uni nusxalab Copy Webhook URL olib qo'yamiz va Gitlab Discord Notificationda ishlatish uchun olib qo'yamiz.

gitlab-ci

Discord Server ochib channellar ochib olganimizdan keyin Gitlabda Repositoriyamizga o'tamiz va

-> Settings -> Integrations -> Discord Notifications bo'limiga o'tamiz.

gitlab-ci

Integrations bo'limidan Discord Notifications bo'limiga o'tamiz va Configure bosib konfiguratsiya bo'limiga o'tamiz. gitlab-ci

Bu qismda Discord serverimizda yaratib olgan Webhookni qo'shib qo'yamiz. gitlab-ci

Trigger qismidan o'zimizga keraklisini sozlab olamiz. Bu holda yaxshi amaliyot bu har bir event uchun alohida Discord channel ochib uni webhookini Triggerga qo'shib chiqish kerak, Masalan Discord Serverda Merge Requests, Issue, Deployment status kabi Discord channellar ochib olinadi va quyidagi Trigger bo'limida kerakli joylarga kerakli Discord channel webhook urllari qo'yib chiqiladi, shunda har bir event alohida Discord channelga keladi va ularni kuzatib manage qilish osonroq bo'ladi. gitlab-ci

Bu qismda qaysi branchlar uchun notification kelishini belgilaymiz bu holda All branches. Konfiguratsiyani to'grilab chiqganimizdan keyin Test settings bosib konfiguratsiya ishlashini tekshirib olamiz. gitlab-ci

Konfiguratsiyamiz to'gri bo'lsa bizga Discord channelimizga quyidagicha test Notification keladi. gitlab-ci

Keling endi main branchdagi kodga o'zgartirish kiritib commit qilamiz, bu holda yani Release chiqishi va Discordga Notification kelishi kerak.

gitlab-ci

Okeyy biz Repositoriyamizni muvaffiqiyatli ravishda Discord bilan integratsiya qildik.

Email bilan integratsiya ham oddiy, o'zingizga moslab konfiguratsiya qilasiz va kimlarni emailiga notification yuborish kerakligi belgilanadi.

gitlab-ci

Emailga quyidagicha notification keladi. gitlab-ci

Qo'shimcha