13-bo‘lim
Versiyalash va relizlar
Semantik versiyalash, teg bo'yicha ishga tushadigan quvur, o'zgarishlar ro'yxatini yasash va GitHub Release chiqarish.
Ushbu bo‘lim mundarijasi
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:
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'zgarish | Yangi versiya |
|---|---|
| Xato tuzatildi | 1.4.2 -> 1.4.3 |
| Yangi funksiya qo'shildi | 1.4.3 -> 1.5.0 |
| Funksiya nomi o'zgardi yoki o'chirildi | 1.5.0 -> 2.0.0 |
| Hujjat tahrirlandi | Versiya o'zgarmaydi |
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:
git tag v1.4.2
git push origin v1.4.2
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 }}"
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:
- 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.
git log dan yasalgan ro'yxat kommit xabarlari qanchalik yaxshi
bo'lsa, shunchalik foydali bo'ladi:
| Yomon xabar | Yaxshi xabar |
|---|---|
tuzatish | login formasida bo'sh parol qabul qilinmaydi |
. | PDF eksportida sana formati tuzatildi |
ishladi nihoyat | sekin so'rovga indeks qo'shildi |
Conventional Commits kelishuvi (fix:, feat:, chore:) esa
ro'yxatni toifalarga ajratish imkonini beradi.
GitHub Release yaratish #
- 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
| Sozlama | Nima qiladi |
|---|---|
tag_name | Qaysi tegga bog'lanadi |
body | Reliz tavsifi (Markdown) |
files | Qo'shiladigan fayllar - yuklab olinadi |
draft | true bo'lsa, qoralama sifatida saqlanadi |
prerelease | true bo'lsa, "oldindan chiqarilgan" deb belgilanadi |
contents: write ruxsati bu yerda majburiy - usiz reliz yaratilmaydi.
Versiya raqamini fayl bilan moslash #
package.json dagi versiya teg bilan mos kelishi kerak. Buni tekshirish
oson:
- 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"
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:
git tag v2.0.0-rc.1
git push origin v2.0.0-rc.1
- 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
| Teg | Ma'nosi |
|---|---|
v2.0.0-alpha.1 | Erta sinov, ko'p narsa o'zgarishi mumkin |
v2.0.0-beta.2 | Imkoniyatlar tayyor, xatolar tuzatilmoqda |
v2.0.0-rc.1 | Relizga nomzod - xato topilmasa, shu chiqadi |
v2.0.0 | To'liq reliz |
Chiqarilgan tegni o'chirib, boshqa kommitga qo'yish - eng xavfli odatlardan biri:
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:
with:
draft: true
Bu holda quvur hamma narsani tayyorlaydi: changelog yoziladi, fayllar biriktiriladi, obraz teglanadi. Chop etish tugmasini esa odam bosadi.
- Loyihangizga
v0.1.0tegini qo'ying va push qiling. - Teg bo'yicha ishga tushadigan reliz workflow'ini yozing.
- Tegdan versiya raqamini ajratib, jurnalga chiqaring.
package.jsondagi versiya bilan tegni solishtiruvchi tekshiruv qo'shing.- Ularni ataylab mos kelmaydigan qilib, quvur qizil bo'lishini ko'ring.
- Oxirgi ikki teg orasidagi kommitlardan changelog yasang.
- GitHub Release yarating va uning sahifasida changelog ko'rinishini tekshiring.
- Relizga bitta fayl (arxiv) biriktiring va uni yuklab oling.
v0.2.0-rc.1tegini qo'yib, uprereleasedeb belgilanishini ta'minlang.draft: truebilan 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: 0kerak - aks holda oldingi teglar ko'rinmaydi. - Ko'p qatorli qiymatni
$GITHUB_OUTPUTga ajratgich bilan yoziladi. - Kommit xabarlari changelog sifatini bevosita belgilaydi.
- Reliz yaratish uchun
contents: writeruxsati shart. - Teg va
package.jsondagi versiya mosligini tekshiring - bu klassik xatoni yo'q qiladi. -alpha,-beta,-rcqo'shimchalari oldindan chiqarilgan versiyani bildiradi.- Chiqarilgan tegni hech qachon qayta ishlatmang - yangi raqam chiqaring.
Keyingi bo'limda deploy strategiyalari bilan tanishamiz.
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.