16-bo‘lim

Orqaga qaytarish va xatolarga tayyorgarlik

Rollback usullari, avtomatik qaytarish, deploy jurnali, xabarnomalar va tushgan quvurni tuzatish tartibi.

🕑 7 daqiqa o‘qish 📄 749 so‘z 👁 0 marta ko‘rilgan
Ushbu bo‘lim mundarijasi
  1. Orqaga qaytarishning uch yo'li
  2. Eski obrazga qaytish
  3. Avtomatik qaytarish
  4. Deploy jurnali
  5. Xabarnomalar
  6. Tushgan quvurni tuzatish tartibi
  7. Xulosa

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 #

UsulTezligiSharti
Eski obrazga qaytishSoniyalarObraz aniq teglangan bo'lsa
Trafikni eski muhitga o'tkazishSoniyalarKo'k-yashil sozlangan bo'lsa
Tuzatish chiqarish (roll forward)DaqiqalarXato sababi ma'lum bo'lsa
Orqaga qaytarish har doim ham to'g'ri javob emas

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:

Terminal
docker compose down
IMAGE_TAG=1.4.1 docker compose up -d

Buni quvurga tugma sifatida qo'shish mumkin:

YAML
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:

YAML
      - 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
Deploy va avtomatik qaytarish Yangi versiya chiqarildi Salomatlik 60 soniya kutiladi Javob bor - deploy tugadi jamoaga xabar yuboriladi Javob yo'q - qaytariladi eski versiya tiklanadi, ogohlantirish yuboriladi Avtomatik qaytarish - bu xatoni yashirish emas U faqat vaqt yutadi: xizmat tiklanadi, sababni esa keyin tinch o'rganasiz
Salomatlik tekshiruvi o'tmasa, quvur o'zi eski versiyaga qaytadi
Avtomatik qaytarish cheksiz sikl yasamasin

Agar qaytarish ham deploy quvurini ishga tushirsa, ikkalasi navbat bilan bir-birini chaqirib, to'xtovsiz aylanishi mumkin.

Ikki chora yetarli:

ChoraIzoh
Qaytarish alohida workflow bo'lsinU hech qanday push hosil qilmaydi
Bir marta urinishQaytarish ham yiqilsa - odamga xabar bering, qayta urinmang

Deploy jurnali #

Kim, qachon, qaysi versiyani chiqargani yozib borilsa, tergov osonlashadi:

YAML
      - 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:

YAML
      - 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}"
KanalQachon mos
TelegramO'zbekistonda eng tez yetib boradigan kanal
EmailGitHub o'zi yuboradi - sozlash shart emas
Slack, DiscordJamoa o'sha yerda yashasa
Har bir hodisa uchun xabar yubormang

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 beringXabar bermang
main da quvur yiqildiPR da linter xatosi (PR sahifasida ko'rinadi)
Deploy yiqildiHar muvaffaqiyatli deploy
Avtomatik qaytarish ishladiHar kommit

Tushgan quvurni tuzatish tartibi #

Quvur main da qizil bo'lsa - bu jamoaning umumiy muammosi: hech kim ishonchli chiqara olmaydi.

QadamNima qilinadi
1Xizmat ishlayaptimi - avval shuni tekshiring
2Ishlamasa - orqaga qayting, sabab keyin
3Qaysi kommitdan buzilganini toping (jurnaldagi oxirgi yashil ishga tushirish)
4Tuzatish kichik bo'lsa - oldinga tuzating
5Katta bo'lsa - o'sha kommitni git revert qiling
6Xato nima uchun testlardan o'tib ketganini tahlil qiling
7Shu holat uchun test yozing

Oxirgi qadam eng muhimi: har bir ishlab chiqarishdagi xato - bu yetishmagan testning belgisi.

Aybdor izlash o'rniga jarayonni tuzating

"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?
Amaliy topshiriq
  1. Obrazlaringiz aniq teglanganiga ishonch hosil qiling (latest emas).
  2. Qo'lda ishga tushiriladigan «orqaga qaytarish» workflow'ini yozing.
  3. Unga versiya raqamini kiritma sifatida qabul qiling.
  4. Sinov muhitida eski versiyaga qaytarib ko'ring.
  5. Deploy'dan keyin salomatlikni kutadigan qadam qo'shing.
  6. Uni ataylab yiqitib, avtomatik qaytarish ishlashini kuzating.
  7. Qaytarish cheksiz sikl yasamasligiga ishonch hosil qiling.
  8. $GITHUB_STEP_SUMMARY ga deploy jurnalini yozing.
  9. Telegram (yoki boshqa kanal) ga faqat xato bo'lganda xabar yuboring.
  10. 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.

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.