13-bo‘lim

Versiyalash va relizlar

Semantik versiyalash, teg bo'yicha ishga tushadigan quvur, o'zgarishlar ro'yxatini yasash va GitHub Release chiqarish.

🕑 10 daqiqa o‘qish 📄 685 so‘z 👁 0 marta ko‘rilgan
Ushbu bo‘lim mundarijasi
  1. Semantik versiyalash
  2. Teg bo'yicha ishga tushadigan quvur
  3. O'zgarishlar ro'yxati (changelog)
  4. GitHub Release yaratish
  5. Versiya raqamini fayl bilan moslash
  6. Oldindan chiqarilgan versiyalar
  7. Relizni qo'lda boshqarish
  8. Xulosa

Obraz tayyor. Endi savol tug'iladi: qaysi obraz qayerda ishlayapti va kechagi versiyaga qanday qaytamiz? Javob - versiyalash intizomi.

Semantik versiyalash #

Eng keng tarqalgan kelishuv - uchta son:

Natija
1.4.2
│ │ └─ patch: xato tuzatildi, xatti-harakat o'zgarmadi
│ └─── minor: yangi imkoniyat qo'shildi, eski kod ishlayveradi
└───── major: eski kodni buzadigan o'zgarish
O'zgarishYangi versiya
Xato tuzatildi1.4.2 -> 1.4.3
Yangi funksiya qo'shildi1.4.3 -> 1.5.0
Funksiya nomi o'zgardi yoki o'chirildi1.5.0 -> 2.0.0
Hujjat tahrirlandiVersiya o'zgarmaydi
Major raqami o'sishidan qo'rqmang

Ko'p jamoa 1.x da abadiy qolib ketadi va buzuvchi o'zgarishlarni minor sifatida chiqaradi. Bu foydalanuvchini adashtiradi: u minor yangilanish xavfsiz deb o'ylaydi.

Major - bu "e'tibor bering, kodingizni o'zgartirish kerak bo'lishi mumkin" degan halol ogohlantirish. U bepul.

Teg bo'yicha ishga tushadigan quvur #

Reliz odatda teg bilan boshlanadi:

Terminal
git tag v1.4.2
git push origin v1.4.2
YAML
name: Reliz

on:
  push:
    tags:
      - 'v*'

jobs:
  reliz:
    runs-on: ubuntu-latest
    permissions:
      contents: write
      packages: write
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - name: Versiyani ajratib olish
        id: versiya
        run: |
          teg="${GITHUB_REF#refs/tags/}"
          echo "teg=$teg" >> "$GITHUB_OUTPUT"
          echo "raqam=${teg#v}" >> "$GITHUB_OUTPUT"

      - name: Ko'rsatish
        run: |
          echo "Teg:    ${{ steps.versiya.outputs.teg }}"
          echo "Raqam:  ${{ steps.versiya.outputs.raqam }}"
Natija
Teg:    v1.4.2
Raqam:  1.4.2

fetch-depth: 0 bu yerda kerak: o'zgarishlar ro'yxatini yasash uchun oldingi teglar ham bo'lishi shart.

O'zgarishlar ro'yxati (changelog) #

Oxirgi ikki teg orasidagi kommitlardan ro'yxat yasash mumkin:

YAML
      - name: O'zgarishlarni yig'ish
        id: ozgarishlar
        run: |
          oldingi=$(git describe --tags --abbrev=0 HEAD^ 2>/dev/null || echo "")
          if [ -z "$oldingi" ]; then
            royxat=$(git log --pretty=format:'- %s (%an)')
          else
            royxat=$(git log "$oldingi..HEAD" --pretty=format:'- %s (%an)')
          fi
          {
            echo 'matn<<ROYXAT'
            echo "$royxat"
            echo 'ROYXAT'
          } >> "$GITHUB_OUTPUT"

Ko'p qatorli qiymatni $GITHUB_OUTPUT ga yozish uchun ajratgich (ROYXAT) ishlatiladi - oddiy echo bilan faqat bitta qator yoziladi.

Kommit xabarlari changelog sifatini belgilaydi

git log dan yasalgan ro'yxat kommit xabarlari qanchalik yaxshi bo'lsa, shunchalik foydali bo'ladi:

Yomon xabarYaxshi xabar
tuzatishlogin formasida bo'sh parol qabul qilinmaydi
.PDF eksportida sana formati tuzatildi
ishladi nihoyatsekin so'rovga indeks qo'shildi

Conventional Commits kelishuvi (fix:, feat:, chore:) esa ro'yxatni toifalarga ajratish imkonini beradi.

GitHub Release yaratish #

YAML
      - name: Relizni chop etish
        uses: softprops/action-gh-release@v2
        with:
          tag_name: ${{ steps.versiya.outputs.teg }}
          name: ${{ steps.versiya.outputs.teg }}
          body: |
            ## O'zgarishlar

            ${{ steps.ozgarishlar.outputs.matn }}

            ## Obraz

                docker pull ghcr.io/${{ github.repository }}:${{ steps.versiya.outputs.raqam }}
          files: |
            dist/*.zip
            dist/*.tar.gz
          draft: false
          prerelease: false
SozlamaNima qiladi
tag_nameQaysi tegga bog'lanadi
bodyReliz tavsifi (Markdown)
filesQo'shiladigan fayllar - yuklab olinadi
drafttrue bo'lsa, qoralama sifatida saqlanadi
prereleasetrue bo'lsa, "oldindan chiqarilgan" deb belgilanadi

contents: write ruxsati bu yerda majburiy - usiz reliz yaratilmaydi.

Tegdan relizgacha git tag v1.4.2 odam qaror qiladi Testlar yana bir marta Obraz :1.4.2 tegi bilan Changelog kommitlardan Reliz chop etildi Nima uchun teg qo'yish odamga qoldiriladi Har bir kommit reliz emas - qachon chiqarishni mahsulot qarori belgilaydi Teg qo'yilgandan keyin esa hamma narsa avtomatik bo'ladi
Teg - odam qo'yadigan yagona qadam; qolgani quvurning ishi

Versiya raqamini fayl bilan moslash #

package.json dagi versiya teg bilan mos kelishi kerak. Buni tekshirish oson:

YAML
      - name: Versiya mosligini tekshirish
        run: |
          faylda=$(node -p "require('./package.json').version")
          tegda="${GITHUB_REF#refs/tags/v}"
          if [ "$faylda" != "$tegda" ]; then
            echo "package.json: $faylda, teg: $tegda - mos emas"
            exit 1
          fi
          echo "Versiya mos: $faylda"
Natija
Versiya mos: 1.4.2

Bu kichik tekshiruv klassik xatoni oldini oladi: teg v1.4.2, obraz esa ichida 1.4.1 deb yozilgan holat.

Oldindan chiqarilgan versiyalar #

Katta o'zgarishni avval sinash uchun:

Terminal
git tag v2.0.0-rc.1
git push origin v2.0.0-rc.1
YAML
      - name: Oldindan chiqarilganmi
        id: tur
        run: |
          teg="${GITHUB_REF#refs/tags/}"
          if echo "$teg" | grep -qE '-(alpha|beta|rc)'; then
            echo "oldindan=true" >> "$GITHUB_OUTPUT"
          else
            echo "oldindan=false" >> "$GITHUB_OUTPUT"
          fi
TegMa'nosi
v2.0.0-alpha.1Erta sinov, ko'p narsa o'zgarishi mumkin
v2.0.0-beta.2Imkoniyatlar tayyor, xatolar tuzatilmoqda
v2.0.0-rc.1Relizga nomzod - xato topilmasa, shu chiqadi
v2.0.0To'liq reliz
Tegni hech qachon qayta ishlatmang

Chiqarilgan tegni o'chirib, boshqa kommitga qo'yish - eng xavfli odatlardan biri:

Terminal
git tag -f v1.4.2       # QILMANG
git push -f origin v1.4.2

Sabab: kimdir o'sha tegni allaqachon yuklagan bo'lishi mumkin. Endi bir xil nom ikki xil kodni bildiradi - va bu xatoni topish deyarli imkonsiz.

Xato chiqsa, v1.4.3 chiqaring. Raqamlar arzon.

Relizni qo'lda boshqarish #

Har doim ham avtomatik chiqarish kerak emas. Qoralama relizni tayyorlab, qaror qabul qilishni odamga qoldirish mumkin:

YAML
        with:
          draft: true

Bu holda quvur hamma narsani tayyorlaydi: changelog yoziladi, fayllar biriktiriladi, obraz teglanadi. Chop etish tugmasini esa odam bosadi.

Amaliy topshiriq
  1. Loyihangizga v0.1.0 tegini qo'ying va push qiling.
  2. Teg bo'yicha ishga tushadigan reliz workflow'ini yozing.
  3. Tegdan versiya raqamini ajratib, jurnalga chiqaring.
  4. package.json dagi versiya bilan tegni solishtiruvchi tekshiruv qo'shing.
  5. Ularni ataylab mos kelmaydigan qilib, quvur qizil bo'lishini ko'ring.
  6. Oxirgi ikki teg orasidagi kommitlardan changelog yasang.
  7. GitHub Release yarating va uning sahifasida changelog ko'rinishini tekshiring.
  8. Relizga bitta fayl (arxiv) biriktiring va uni yuklab oling.
  9. v0.2.0-rc.1 tegini qo'yib, u prerelease deb belgilanishini ta'minlang.
  10. draft: true bilan qoralama reliz yarating va uni qo'lda chop eting.

Xulosa #

  • Semantik versiyalash: patch - tuzatish, minor - yangi imkoniyat, major - buzuvchi o'zgarish.
  • Buzuvchi o'zgarishni minor sifatida chiqarish foydalanuvchini adashtiradi - major dan qo'rqmang.
  • Reliz odatda teg bilan boshlanadi: on: push: tags: ['v*'].
  • Changelog uchun fetch-depth: 0 kerak - aks holda oldingi teglar ko'rinmaydi.
  • Ko'p qatorli qiymatni $GITHUB_OUTPUT ga ajratgich bilan yoziladi.
  • Kommit xabarlari changelog sifatini bevosita belgilaydi.
  • Reliz yaratish uchun contents: write ruxsati shart.
  • Teg va package.json dagi versiya mosligini tekshiring - bu klassik xatoni yo'q qiladi.
  • -alpha, -beta, -rc qo'shimchalari oldindan chiqarilgan versiyani bildiradi.
  • Chiqarilgan tegni hech qachon qayta ishlatmang - yangi raqam chiqaring.

Keyingi bo'limda deploy strategiyalari bilan tanishamiz.

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.