GitHub Packages — paket chiqarish va saqlash
Muammodan boshlaylik
Kompaniyangizda uchta loyiha bir xil kodni ishlatadi: validatsiya funksiyalari, UI komponentlari, API mijozi. Hozir u har bir loyihaga nusxalangan. Bittasida xato tuzatildi — qolgan ikkitasida xato qoldi.
Yechim — umumiy kodni paket qilish (@dokon/utils) va har bir loyihada npm install bilan o'rnatish. Lekin bu kod — kompaniya siri; uni ommaviy npmjs.com ga chiqarib bo'lmaydi.
Kerak — yopiq paketlar ombori. GitHub da u o'rnatilgan: GitHub Packages.
GitHub Packages nima?
Repozitoriy yonidagi paketlar registri. Qo'llab-quvvatlanadigan turlar:
| Tur | Registri manzili |
|---|---|
| npm (JavaScript) | npm.pkg.github.com |
| Docker / OCI konteynerlar | ghcr.io (Container registry) |
| Maven, Gradle (Java) | maven.pkg.github.com |
| NuGet (.NET) | nuget.pkg.github.com |
| RubyGems | rubygems.pkg.github.com |
Afzalliklari:
- Ruxsatlar — repozitoriy bilan bir xil: repozitoriyga kirishi bor odam paketga ham kira oladi
- GITHUB_TOKEN bilan Actions dan avtomatik nashr qilish
- Ommaviy paketlar — bepul; yopiqlar — tarif doirasida bepul hajm
npm paket nashr qilish
1. package.json
Paket nomi scope bilan bo'lishi shart — GitHub foydalanuvchi yoki tashkilot nomi:
{
"name": "@dokon/utils",
"version": "1.0.0",
"main": "dist/index.js",
"types": "dist/index.d.ts",
"files": ["dist"],
"repository": {
"type": "git",
"url": "https://github.com/dokon/utils.git"
},
"publishConfig": {
"registry": "https://npm.pkg.github.com"
}
}
@dokon— GitHub tashkilot nomi (kichik harflarda)publishConfig.registry— npmjs.com ga emas, GitHub gafiles— paketga faqatdistkiradi (manba kod va testlar emas)
2. Autentifikatsiya
GitHub → Settings → Developer settings → Personal access tokens (classic) → write:packages ruxsati bilan token.
npm login --scope=@dokon --auth-type=legacy --registry=https://npm.pkg.github.com
# Username: GitHub username
# Password: token
3. Nashr qilish
npm run build
npm publish
Paket repozitoriy sahifasida o'ng tomonda Packages bo'limida paydo bo'ladi.
Paketni o'rnatish
Boshqa loyihada — .npmrc faylida @dokon scope i GitHub ga yo'naltiriladi:
@dokon:registry=https://npm.pkg.github.com
//npm.pkg.github.com/:_authToken=${GITHUB_TOKEN}
export GITHUB_TOKEN=ghp_... # read:packages ruxsatli token
npm install @dokon/utils
@dokon/... paketlari GitHub dan, qolganlari (react, express) — odatdagidek npmjs.com dan.
[!WARNING]
.npmrcga token ni to'g'ridan-to'g'ri yozmang — u repozitoriyga tushadi. Yuqoridagidek${GITHUB_TOKEN}muhit o'zgaruvchisi orqali (Linux kursi, 30-dars). Va~/.npmrc(uy papkadagi, shaxsiy) — loyiha.npmrcsidan farqli o'laroq commit qilinmaydi.
Actions bilan avtomatik nashr
Release (41-dars) chiqqanda — paket avtomatik:
# .github/workflows/publish.yml
name: Publish
on:
release:
types: [published]
permissions:
contents: read
packages: write
jobs:
publish:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 22
registry-url: https://npm.pkg.github.com
scope: "@dokon"
- run: npm ci
- run: npm run build
- run: npm publish
env:
NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GITHUB_TOKEN — har bir workflow uchun GitHub avtomatik beradi (alohida token yaratish shart emas); permissions: packages: write — unga nashr qilish huquqi.
Boshqa repozitoriyning CI sida paketni o'rnatish uchun — paket sozlamalarida (Package settings → Manage Actions access) o'sha repozitoriyga ruxsat bering.
Container registry — ghcr.io
Docker image lar uchun — GitHub Packages ning eng ko'p ishlatiladigan qismi. Docker kursining 38 va 41-darslarida batafsil:
echo $TOKEN | docker login ghcr.io -u otabek --password-stdin
docker build -t ghcr.io/dokon/api:1.4.2 .
docker push ghcr.io/dokon/api:1.4.2
Image ni repozitoriy bilan bog'lash — Dockerfile da:
LABEL org.opencontainers.image.source="https://github.com/dokon/api"
Ko'rinish va boshqaruv
Paket sahifasi → Package settings:
- Visibility — Public / Private (tashkilotda — Internal ham)
- Manage access — qaysi repozitoriylar va odamlar
- Eski versiyalarni o'chirish
[!INFO] npm paketini ommaviy qilmoqchi bo'lsangiz va hamma uni oson topishini xohlasangiz — npmjs.com odatiy tanlov (u yerda o'rnatish uchun token kerak emas). GitHub Packages dagi ommaviy npm paketlarini o'rnatish uchun ham autentifikatsiya talab qilinadi — bu foydalanuvchilar uchun noqulay. GitHub Packages — asosan yopiq, kompaniya ichidagi paketlar va Docker image lar uchun.
Nima uchun shunday?
Nima uchun umumiy kodni paket qilish kerak — boshqa loyihaga papkani nusxalash oddiyroq-ku?
Nusxa — ajralish boshlanishi: birinchi kuni bir xil, bir oydan keyin uchta turli versiya, har birida o'z tuzatishlari va o'z xatolari. Paket esa bitta manba va versiya (35-dars) beradi: tuzatish bir joyda qilinadi, 1.0.1 nashr qilinadi, har bir loyiha o'z vaqtida npm update bilan oladi. SemVer "bu yangilanish xavfsizmi?" savoliga javob beradi, CHANGELOG — "nima o'zgardi?" ga. Va GitHub Packages bularning hammasini kod turgan joyda, bir xil ruxsatlar bilan beradi — alohida registri serveri yoki hisob kerak emas.
Xulosa
Eslab qoling:
- GitHub Packages — repozitoriy yonidagi registri: npm, Docker (ghcr.io), Maven, NuGet...
- Ruxsatlar — repozitoriy bilan bir xil; yopiq paketlar uchun qulay
- npm: nom
@tashkilot/paket;publishConfig.registry: https://npm.pkg.github.com - O'rnatish:
.npmrcda@scope:registry=...va token — muhit o'zgaruvchisidan - Actions:
permissions: packages: write+GITHUB_TOKEN+npm publish - Docker:
ghcr.io/egasi/image:teg - Ommaviy npm paketlar — odatda npmjs.com
Keyingi dars
44-dars: GitHub Secrets — maxfiy ma'lumotlarni saqlash