GitHub Packages — paket chiqarish va saqlash

~15 daq · Git · GitHub Imkoniyatlari

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 ga
  • files — paketga faqat dist kiradi (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] .npmrc ga 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 .npmrc sidan 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: .npmrc da @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