16-bo‘lim
Orqaga qaytarish va xatolarga tayyorgarlik
Rollback usullari, avtomatik qaytarish, deploy jurnali, xabarnomalar va tushgan quvurni tuzatish tartibi.
Ushbu bo‘lim mundarijasi
Har qanday quvur ertami-kechmi buzuq versiyani chiqaradi. Savol - buni qanchalik tez qaytara olasiz. Yaxshi jamoada bu bir necha daqiqa, yomonida esa yarim kun.
Orqaga qaytarishning uch yo'li #
| Usul | Tezligi | Sharti |
|---|---|---|
| Eski obrazga qaytish | Soniyalar | Obraz aniq teglangan bo'lsa |
| Trafikni eski muhitga o'tkazish | Soniyalar | Ko'k-yashil sozlangan bo'lsa |
| Tuzatish chiqarish (roll forward) | Daqiqalar | Xato sababi ma'lum bo'lsa |
Agar yangi versiya baza sxemasini o'zgartirgan bo'lsa, eski kod yangi baza bilan ishlay olmasligi mumkin. Bunday holda oldinga tuzatish (roll forward) xavfsizroq.
Shuning uchun 14-bo'limdagi «kengaytir - ko'chir - qisqartir» qoidasi muhim: u aynan orqaga qaytish imkoniyatini saqlash uchun o'ylab topilgan.
Eski obrazga qaytish #
Aniq teglangan obraz bo'lsa, qaytish bitta buyruq:
docker compose down
IMAGE_TAG=1.4.1 docker compose up -d
Buni quvurga tugma sifatida qo'shish mumkin:
name: Orqaga qaytarish
on:
workflow_dispatch:
inputs:
versiya:
description: 'Qaysi versiyaga qaytamiz'
required: true
type: string
jobs:
qaytarish:
runs-on: ubuntu-latest
environment:
name: ishlab-chiqarish
steps:
- name: Serverda eski versiyani ko'tarish
uses: appleboy/ssh-action@v1
with:
host: ${{ secrets.SERVER_HOST }}
username: ${{ secrets.SERVER_USER }}
key: ${{ secrets.SSH_KALIT }}
script: |
set -e
cd /srv/ilova
echo "IMAGE_TAG=${{ inputs.versiya }}" > .env.versiya
docker compose --env-file .env.versiya up -d
curl -sSf http://localhost:3000/salomatlik
Endi tungi favqulodda holatda hech kim serverga kirib, buyruqlarni eslab o'tirmaydi: Actions sahifasida versiya raqamini yozib, tugma bosiladi.
Avtomatik qaytarish #
Deploy'dan keyin salomatlik tekshirilmasa, quvur o'zi qaytarishi mumkin:
- name: Yangi versiyani chiqarish
id: deploy
run: ./deploy.sh 1.4.2
- name: Tekshirish
id: tekshiruv
run: |
uxlash=5
for i in $(seq 1 12); do
if curl -sSf https://misol.uz/salomatlik > /dev/null; then
echo "Yangi versiya javob bermoqda"
exit 0
fi
sleep "$uxlash"
done
exit 1
- name: Xato bo'lsa - orqaga qaytarish
if: failure() && steps.deploy.outcome == 'success'
run: |
echo "Salomatlik tekshiruvi o'tmadi - eski versiya tiklanmoqda"
./deploy.sh 1.4.1
Agar qaytarish ham deploy quvurini ishga tushirsa, ikkalasi navbat bilan bir-birini chaqirib, to'xtovsiz aylanishi mumkin.
Ikki chora yetarli:
| Chora | Izoh |
|---|---|
| Qaytarish alohida workflow bo'lsin | U hech qanday push hosil qilmaydi |
| Bir marta urinish | Qaytarish ham yiqilsa - odamga xabar bering, qayta urinmang |
Deploy jurnali #
Kim, qachon, qaysi versiyani chiqargani yozib borilsa, tergov osonlashadi:
- name: Deploy jurnaliga yozish
if: always()
run: |
{
echo "## Deploy"
echo ""
echo "| Maydon | Qiymat |"
echo "|--------|--------|"
echo "| Versiya | ${{ github.ref_name }} |"
echo "| Kommit | ${{ github.sha }} |"
echo "| Boshladi | ${{ github.actor }} |"
echo "| Natija | ${{ job.status }} |"
} >> "$GITHUB_STEP_SUMMARY"
Bu ma'lumot ishga tushirish sahifasida saqlanadi va keyin "o'tgan payshanba nima chiqarilgan edi?" degan savolga javob beradi.
Xabarnomalar #
Quvur yiqilganini o'z vaqtida bilish kerak:
- name: Telegram'ga xabar
if: failure()
env:
TOKEN: ${{ secrets.TELEGRAM_TOKEN }}
CHAT: ${{ secrets.TELEGRAM_CHAT_ID }}
run: |
matn="Deploy yiqildi: ${{ github.repository }}%0A"
matn="${matn}Versiya: ${{ github.ref_name }}%0A"
matn="${matn}Havola: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}"
curl -sS -X POST "https://api.telegram.org/bot${TOKEN}/sendMessage" \
-d "chat_id=${CHAT}" -d "text=${matn}"
| Kanal | Qachon mos |
|---|---|
| Telegram | O'zbekistonda eng tez yetib boradigan kanal |
| GitHub o'zi yuboradi - sozlash shart emas | |
| Slack, Discord | Jamoa o'sha yerda yashasa |
Har yashil quvur haqida xabar kelsa, bir hafta ichida hamma kanalni o'chiradi. Keyin haqiqiy xato ham e'tibordan chetda qoladi.
Foydali qoida: faqat harakat talab qiladigan hodisa haqida xabar bering:
| Xabar bering | Xabar bermang |
|---|---|
main da quvur yiqildi | PR da linter xatosi (PR sahifasida ko'rinadi) |
| Deploy yiqildi | Har muvaffaqiyatli deploy |
| Avtomatik qaytarish ishladi | Har kommit |
Tushgan quvurni tuzatish tartibi #
Quvur main da qizil bo'lsa - bu jamoaning umumiy muammosi: hech kim
ishonchli chiqara olmaydi.
| Qadam | Nima qilinadi |
|---|---|
| 1 | Xizmat ishlayaptimi - avval shuni tekshiring |
| 2 | Ishlamasa - orqaga qayting, sabab keyin |
| 3 | Qaysi kommitdan buzilganini toping (jurnaldagi oxirgi yashil ishga tushirish) |
| 4 | Tuzatish kichik bo'lsa - oldinga tuzating |
| 5 | Katta bo'lsa - o'sha kommitni git revert qiling |
| 6 | Xato nima uchun testlardan o'tib ketganini tahlil qiling |
| 7 | Shu holat uchun test yozing |
Oxirgi qadam eng muhimi: har bir ishlab chiqarishdagi xato - bu yetishmagan testning belgisi.
"Kim buzdi?" degan savol foydasiz - quvur aynan shuning uchun bor: xatoni odamga emas, tizimga qaratish.
To'g'ri savollar boshqacha:
- Nima uchun bu xato CI da ushlanmadi?
- Qaysi tekshiruv yetishmayapti?
- Xuddi shu holat yana takrorlansa, endi to'xtatiladimi?
- Obrazlaringiz aniq teglanganiga ishonch hosil qiling (
latestemas). - Qo'lda ishga tushiriladigan «orqaga qaytarish» workflow'ini yozing.
- Unga versiya raqamini kiritma sifatida qabul qiling.
- Sinov muhitida eski versiyaga qaytarib ko'ring.
- Deploy'dan keyin salomatlikni kutadigan qadam qo'shing.
- Uni ataylab yiqitib, avtomatik qaytarish ishlashini kuzating.
- Qaytarish cheksiz sikl yasamasligiga ishonch hosil qiling.
$GITHUB_STEP_SUMMARYga deploy jurnalini yozing.- Telegram (yoki boshqa kanal) ga faqat xato bo'lganda xabar yuboring.
- Oxirgi ishlab chiqarish xatosini eslab, uni ushlay oladigan test yozing.
Xulosa #
- Har qanday quvur ertami-kechmi buzuq versiya chiqaradi - tayyorgarlik muhim.
- Uch yo'l: eski obrazga qaytish, trafikni o'tkazish, oldinga tuzatish.
- Baza sxemasi o'zgargan bo'lsa, orqaga qaytish xavfli bo'lishi mumkin.
- Aniq teglangan obraz orqaga qaytishni bir buyruqqa aylantiradi.
- Qo'lda ishga tushiriladigan qaytarish workflow'i tungi favqulodda holat uchun zarur.
- Salomatlik tekshiruvi o'tmasa, quvur o'zi qaytarishi mumkin.
- Avtomatik qaytarish cheksiz sikl yasamasligi kerak - bir marta urinsin.
- Deploy jurnali "o'tgan hafta nima chiqarilgan edi" savoliga javob beradi.
- Xabarnoma faqat harakat talab qiladigan hodisalar uchun bo'lsin.
- Har bir ishlab chiqarishdagi xato - yetishmagan testning belgisi; aybdor emas, jarayon tuzatiladi.
Keyingi bo'limda o'z runner'ingizni o'rnatishni ko'ramiz.
O‘qish tarixini saqlamoqchimisiz?
Tizimga kirsangiz, tugatgan bo‘limlaringiz saqlanadi va qoldirgan joyingizdan davom etasiz.
Xatolik topdingizmi?
Imlo xatosi, ishlamaydigan kod yoki noto‘g‘ri ma‘lumotni ko‘rsangiz - bizga xabar bering. Har bir xabar administrator tomonidan ko‘rib chiqiladi.