Zamonaviy dasturlash dunyosida kodni yozish jarayonning faqat yarmidir. Yozilgan kodni tekshirish, testdan o'tkazish va serverga joylashtirish ham xuddi shunchalik muhim, ammo bularning barchasini qo'lda bajarish vaqt talab qiladi va xatolarga moyil. Aynan shu muammoni hal qilish uchun CI/CD metodologiyasi paydo bo'ldi. Ushbu maqolada biz CI/CD nima ekanligini, nega u zamonaviy jamoalar uchun zaruriy bo'lib qolganini va GitHub Actions yordamida uni qanday amalda joriy qilishni batafsil ko'rib chiqamiz.
CI/CD nima va nega kerak?
CI/CD ikkita tushunchaning qisqartmasidir: Continuous Integration (uzluksiz integratsiya) va Continuous Delivery yoki Deployment (uzluksiz yetkazib berish yoki joylashtirish). Uzluksiz integratsiya degani har bir dasturchi o'z o'zgartirishlarini umumiy kod omboriga muntazam ravishda, ko'pincha kuniga bir necha marta qo'shadi va har bir qo'shilish avtomatik ravishda test va build jarayonidan o'tkaziladi. Bu yondashuv kodning turli qismlari bir-biriga mos kelmasligi natijasida yuzaga keladigan konfliktlarni erta aniqlashga yordam beradi.
Uzluksiz yetkazib berish esa testdan muvaffaqiyatli o'tgan kodni avtomatik tarzda ishlab chiqarish muhitiga yoki serverga joylashtirish jarayonidir. Bu jarayonning eng katta foydasi shundaki, xatolar foydalanuvchiga yetib bormasidan ancha oldin, ishlab chiqish bosqichida aniqlanadi. Agar siz kichik bir o'zgartirish kiritsangiz va u biror funksiyani buzsa, avtomatik testlar buni darhol ko'rsatadi va siz muammoni soatlar yoki kunlar emas, balki daqiqalar ichida hal qilasiz. Natijada jamoa tezroq ishlaydi, kod sifati oshadi va ishlab chiqishdan foydalanuvchigacha bo'lgan yo'l qisqaradi.
GitHub Actions nima?
GitHub Actions bu GitHub platformasiga to'g'ridan-to'g'ri integratsiya qilingan avtomatlashtirish vositasidir. U sizning repozitoriyangizdagi muayyan hodisalarga, masalan kodni push qilish, pull request ochish yoki belgilangan vaqt jadvaliga javoban avtomatik vazifalarni ishga tushirish imkonini beradi. GitHub Actions'ning eng katta afzalligi shundaki, u sizning kodingiz allaqachon saqlanayotgan joyda joylashgan, shuning uchun alohida xizmatlarni sozlash yoki integratsiya qilish bilan ovora bo'lishingiz shart emas.
Har bir avtomatlashtirish stsenariysi workflow deb ataladi va u repozitoriyaning .github/workflows papkasidagi YAML formatidagi fayl orqali ta'riflanadi. GitHub bu fayllarni avtomatik o'qiydi va belgilangan shartlar bajarilganda ularni ishga tushiradi. Bunda kodni ishga tushirish uchun GitHub o'zining bulutdagi serverlarini, ya'ni runner deb ataladigan virtual mashinalarni taqdim etadi, shuning uchun siz o'z infratuzilmangiz haqida qayg'urishingiz shart emas.
Workflow tuzilmasi: trigger, job va step
Workflow faylining tuzilmasini tushunish CI/CD'ni o'rganishning kalitidir. Har bir workflow uchta asosiy qatlamdan iborat: triggerlar workflow qachon ishga tushishini belgilaydi, joblar bir-biridan mustaqil ravishda parallel yoki ketma-ket bajariladigan vazifalar guruhini ifodalaydi, steplar esa har bir job ichida ketma-ket bajariladigan aniq buyruqlardir. Quyidagi misolda eng oddiy workflow tuzilmasi keltirilgan:
name: CI
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Kodni yuklab olish
uses: actions/checkout@v4
- name: Node.js o'rnatish
uses: actions/setup-node@v4
with:
node-version: '20'
- name: Paketlarni o'rnatish
run: npm install
- name: Testlarni ishga tushirish
run: npm test
Ushbu misolda on bo'limi triggerlarni belgilaydi, ya'ni workflow main tarmog'iga push qilinganda yoki pull request ochilganda ishga tushadi. jobs ostidagi build esa Ubuntu serverida ishlaydi va uchta qadamdan iborat: avval kod yuklab olinadi, keyin Node.js muhiti tayyorlanadi, so'ngra paketlar o'rnatiladi va nihoyat testlar ishga tushiriladi.
Serverga avtomatik deploy qilish
Testlar muvaffaqiyatli o'tgandan keyin keyingi mantiqiy qadam kodni serverga joylashtirishdir. Ko'pincha bu SSH orqali serverga ulanib, yangi kodni yuklab olish va xizmatni qayta ishga tushirish orqali amalga oshiriladi. Quyidagi misolda testlar o'tgandan so'ng sayt.uz'dagi hosting serveriga avtomatik deploy qilish workflow'i keltirilgan:
name: Deploy
on:
push:
branches: [ main ]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Kodni yuklab olish
uses: actions/checkout@v4
- name: Serverga deploy qilish
uses: appleboy/ssh-action@v1.0.0
with:
host: ${{ secrets.SERVER_HOST }}
username: ${{ secrets.SERVER_USER }}
key: ${{ secrets.SSH_KEY }}
script: |
cd /var/www/myproject
git pull origin main
npm install --production
pm2 restart app
Bu yerda workflow main tarmog'iga har safar kod push qilinganda ishga tushadi va SSH orqali serverga ulanib, eng so'nggi kodni tortib oladi, kerakli paketlarni o'rnatadi hamda ilovani qayta ishga tushiradi. Shu tarzda siz kod yozishdan tashqari hech qanday qo'lda harakat qilmasdan, o'zgartirishlaringiz avtomatik ravishda jonli serverga yetib boradi.
Sirlar (secrets) bilan ishlash
Yuqoridagi misolda siz ${{ secrets.SSH_KEY }} kabi yozuvlarni payqagandirsiz. Bular GitHub'ning sirlar tizimi orqali saqlanadigan maxfiy ma'lumotlardir. Server paroli, SSH kaliti, API tokenlari yoki ma'lumotlar bazasi ulanish satrlari kabi maxfiy ma'lumotlarni hech qachon to'g'ridan-to'g'ri kod ichiga yozmaslik kerak, chunki bu xavfsizlik nuqtai nazaridan juda xavfli. Buning o'rniga ularni repozitoriya sozlamalarida Settings bo'limidagi Secrets and variables qismiga saqlaysiz.
Bunday sirlar shifrlangan holda saqlanadi va faqat workflow ishga tushganda ularga murojaat qilish mumkin, hatto loglarda ham ular avtomatik ravishda yashiriladi. Bu yondashuv sizning maxfiy ma'lumotlaringiz kod omborida ochiq holda turmasligini va boshqa odamlar ularni ko'ra olmasligini ta'minlaydi. Shuning uchun har qanday parol yoki kalitni doimo secrets orqali boshqarish eng yaxshi amaliyot hisoblanadi.
Matritsa orqali bir nechta muhitda test qilish
Ko'pincha kodingiz turli versiyalarda yoki turli operatsion tizimlarda to'g'ri ishlashiga ishonch hosil qilishingiz kerak. Buning uchun har bir versiya uchun alohida job yozish o'rniga matritsa strategiyasidan foydalanish mumkin. Matritsa bir job'ni bir nechta parametrlar bilan avtomatik ravishda ko'paytiradi, masalan Node.js'ning bir necha versiyasida bir vaqtning o'zida test o'tkazish imkonini beradi:
jobs:
test:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [18, 20, 22]
steps:
- uses: actions/checkout@v4
- name: Node ${{ matrix.node-version }} sozlash
uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}
- run: npm install
- run: npm test
Ushbu konfiguratsiya bilan GitHub Actions avtomatik ravishda uchta alohida job yaratadi, ularning har biri Node.js'ning turli versiyasida ishlaydi. Bu sizga kodingiz keng auditoriya foydalanadigan barcha muhitlarda barqaror ishlashiga kafolat beradi va versiyalar o'rtasidagi mosliksizliklarni erta aniqlashga yordam beradi.
Real foyda va xulosa
CI/CD'ni joriy qilishning amaliy foydasi bebahodir. Avtomatlashtirish tufayli jamoa qo'lda test va deploy qilishga sarflanadigan soatlarni tejaydi, inson xatosi ehtimoli keskin kamayadi va kod sifati barqaror yuqori darajada saqlanadi. Eng muhimi, dasturchilar deploy jarayonidan qo'rqmasdan tez-tez va ishonchli tarzda yangilanishlar chiqara oladilar, bu esa mahsulotning rivojlanish sur'atini sezilarli darajada oshiradi.
GitHub Actions bu jarayonni boshlash uchun eng qulay vositalardan biridir, chunki u kodingiz bilan bir joyda joylashgan va sozlash uchun murakkab infratuzilma talab qilmaydi. Agar siz o'z loyihangizni sayt.uz hostingiga yoki serverga joylashtirayotgan bo'lsangiz, yuqoridagi deploy workflow'ini o'zingizning ehtiyojlaringizga moslab, butun yetkazib berish jarayonini to'liq avtomatlashtirishingiz mumkin. Bir marta sozlangan CI/CD quvuri yillar davomida sizga xizmat qiladi va jamoangizning eng qimmatli resursini, ya'ni vaqtni tejaydi.