Avtomatik deploy
CI kodni tekshiradi, endi CD uni serverga chiqaradi. Deploy paytida parol, kalit va tokenlar kerak bo'ladi โ ularni kodda ochiq yozib bo'lmaydi. Buning uchun secrets ishlatiladi.
Secrets โ maxfiy ma'lumotlar
Server paroli, API kalit, SSH kalit โ bularni hech qachon YAML faylga yoki kodga ochiq yozmang. GitHub'da ular Secrets sifatida shifrlangan holda saqlanadi.
Qo'shish yo'li: GitHub repo → Settings → Secrets and variables → Actions → New repository secret.
- Har bir secret'ga nom (masalan
SSH_PRIVATE_KEY) va qiymat berasiz. - Bir marta saqlangach, qiymatini hech kim (siz ham) qayta ko'ra olmaysiz โ faqat yangilash mumkin.
- Loglarda secret qiymati avtomatik
***bilan yashiriladi.
echo yoki console.log bilan chiqarmang. GitHub yashirishga harakat qiladi, lekin kodlangan (base64) ko'rinishda oshkor bo'lib qolishi mumkin.${{ secrets.X }} โ secret'ni ishlatish
Workflow ichida secret'ga ${{ secrets.NOM }} ifodasi orqali murojaat qilinadi:
steps:
- name: Serverga ulanish
run: deploy-tool --token "$DEPLOY_TOKEN"
env:
DEPLOY_TOKEN: ${{ secrets.DEPLOY_TOKEN }}
Bu yerda secret env: orqali muhit o'zgaruvchisiga uzatiladi, so'ng buyruqda $DEPLOY_TOKEN sifatida ishlatiladi. Bu โ eng xavfsiz usul.
${{ ... }} โ GitHub Actions ifodasi. U workflow ishga tushishidan oldin haqiqiy qiymat bilan almashtiriladi. Faqat secrets emas, github, matrix, env kabi kontekstlarga ham murojaat qiladi.Shartli ishga tushirish โ faqat main'ga deploy
Deploy har PR'da emas, faqat asosiy shoxchaga (main) push bo'lganda ishga tushishi kerak. Buni ikki usulda qilamiz.
1-usul โ workflow darajasida on orqali:
on:
push:
branches: [ main ]
2-usul โ job darajasida if sharti orqali (bitta workflow ichida ham test, ham deploy bo'lsa):
jobs:
deploy:
if: github.ref == 'refs/heads/main'
runs-on: ubuntu-latest
steps:
- run: echo "Faqat main da ishga tushdim"
github.ref โ joriy shoxcha/teg havolasi. refs/heads/main asosiy shoxcha degani. Bu shart PR'larda deploy'ni bloklaydi.Environment โ muhitlar va himoya
GitHub Environment tushunchasi deploy muhitlarini (masalan production, staging) ajratish va himoyalash uchun ishlatiladi. Settings → Environments'da yaratiladi.
jobs:
deploy:
runs-on: ubuntu-latest
environment: production
steps:
- run: echo "Production ga deploy"
- Har bir environment'ning o'z secret'lari bo'lishi mumkin (production va staging uchun har xil kalitlar).
- Required reviewers: deploy oldidan qo'lda tasdiqlash talab qilinadi (Continuous Delivery).
- Wait timer: deploy oldidan kutish vaqti qo'yish mumkin.
Deploy misoli 1 โ GitHub Pages
Statik saytni (React, Vite, oddiy HTML) GitHub Pages'ga deploy qilish eng sodda holat. Rasmiy action'lar buni oson qiladi:
name: Deploy to Pages
on:
push:
branches: [ main ]
permissions:
contents: read
pages: write
id-token: write
jobs:
build-and-deploy:
runs-on: ubuntu-latest
environment:
name: github-pages
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'
- run: npm ci
- run: npm run build
- name: Pages sozlash
uses: actions/configure-pages@v5
- name: Artefaktni yuklash
uses: actions/upload-pages-artifact@v3
with:
path: ./dist
- name: Deploy
uses: actions/deploy-pages@v4
permissions bloki Pages'ga yozish huquqini beradi. path: ./dist โ build natijasi papkasi (Vite'da dist, boshqa vositalarda farq qilishi mumkin).
Deploy misoli 2 โ SSH orqali serverga
O'z serveringizga (VPS) SSH orqali deploy qilish uchun tayyor action ishlatamiz. SSH maxfiy kalit secret sifatida saqlanadi:
- name: Serverga SSH orqali deploy
uses: appleboy/ssh-action@v1
with:
host: ${{ secrets.SERVER_HOST }}
username: ${{ secrets.SERVER_USER }}
key: ${{ secrets.SSH_PRIVATE_KEY }}
script: |
cd /var/www/myapp
git pull origin main
npm ci --production
npm run build
pm2 restart myapp
script: ichidagi buyruqlar uzoq serverda bajariladi: kod yangilanadi, bog'liqliklar o'rnatiladi, build qilinadi va ilova qayta ishga tushiriladi. Hamma maxfiy ma'lumot secrets'dan olinadi.
SSH_PRIVATE_KEY) juda ehtiyot bo'lib saqlang. U server'ga to'liq kirish huquqini beradi. Faqat deploy uchun alohida cheklangan kalit yaratish yaxshi amaliyot.CI va CD birga โ to'liq pipeline
Amalda CI (test) va CD (deploy) ko'pincha bitta workflow'da bog'lanadi. needs kaliti deploy'ni test muvaffaqiyatli tugagandan keyingina ishga tushiradi:
name: CI/CD
on:
push:
branches: [ main ]
pull_request:
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'
- run: npm ci
- run: npm test
- run: npm run build
deploy:
needs: test
if: github.ref == 'refs/heads/main'
runs-on: ubuntu-latest
environment: production
steps:
- uses: actions/checkout@v4
- name: Serverga deploy
uses: appleboy/ssh-action@v1
with:
host: ${{ secrets.SERVER_HOST }}
username: ${{ secrets.SERVER_USER }}
key: ${{ secrets.SSH_PRIVATE_KEY }}
script: |
cd /var/www/myapp
git pull origin main
npm ci --production
pm2 restart myapp
Mana bu haqiqiy CI/CD! Mantiq:
- test job har push va har PR'da ishlaydi (tekshiruv).
- deploy job
needs: testtufayli faqat test o'tgach ishlaydi. if: github.ref == 'refs/heads/main'tufayli deploy faqat main'ga push'da bo'ladi โ PR'larda emas.- Buzuq kod hech qachon serverga chiqmaydi: testlar buzilsa, deploy umuman boshlanmaydi.
Xavfsizlik va yaxshi amaliyotlar
- Maxfiy ma'lumotlarni doimo secrets'da saqlang, kodda emas.
- Deploy job'ni
ifvaneedsbilan himoyalang. environmentorqali production uchun qo'lda tasdiqlash qo'ying (muhim loyihalarda).- Deploy uchun eng kam huquqli kalit/token ishlating.
- Har bir deploy'ni Actions logida kuzatib boring โ muammo bo'lsa tez orqaga qayting (rollback).
Xulosa
- Secrets (Settings → Secrets) maxfiy ma'lumotni shifrlangan saqlaydi;
${{ secrets.X }}bilan olinadi. - Shartli deploy:
on: push: branches: [main]yoki job'daif: github.ref == 'refs/heads/main'. - Environment muhitlarni ajratadi va qo'lda tasdiqlash/himoya qo'shadi.
- Deploy tayyor action'lar bilan qilinadi: GitHub Pages yoki SSH (
appleboy/ssh-action). needs: testdeploy'ni test o'tgach ishga tushiradi โ CI va CD birga to'liq pipeline hosil qiladi.- Buzuq kod hech qachon production'ga chiqmaydi โ bu CI/CD ning asosiy va'dasi.