Przejdź do głównej zawartości

Wydawanie wersji

Ksefnik stosuje prosty model release oparty na dwoch branchach i jednym skrypcie wersjonujacym.

BranchRolaCo sie dzieje po push/merge
mainBranch deweloperskiNic automatycznego. CI odpala sie tylko na PR-ach.
prodBranch release’owyMerge triggeruje pelny pipeline: bump → build → npm publish → tag → GitHub Release → sync PR
main ─────●─────●─────●─────●─────●─────
│ ↑
PR do prod sync PR prod→main
│ │
prod ──────────────────●──────────────●──
│
npm publish
+ git tag v0.3.0
BranchKto moze mergowacMechanizm
mainKazdy czlonek organizacjiStandardowe review
prodTylko @luke-cfCODEOWNERS + branch protection + guard-prod.yml

Plik CODEOWNERS wymaga review od @luke-cf na kazdym PR do prod. Workflow guard-prod.yml automatycznie zamyka PR-y od osob spoza organizacji CodeFormers-it.

  1. Otworz PR z main do prod

    Okno terminala
    gh pr create --base prod --head main \
    --title "Release: opis zmian"
  2. CI odpala sie na PR

    Workflow ci.yml uruchamia build, typecheck i testy. PR nie moze byc zmergowany, dopoki CI nie przejdzie.

  3. Review i merge

    @luke-cf przegląda PR i merguje. To jest moment decyzji “chce wydac release”.

  4. Automatyczny pipeline (po merge)

    Workflow prod-release.yml wykonuje w kolejnosci:

    • pnpm typecheck — ponowne sprawdzenie typow
    • pnpm test -- --run — ponowne uruchomienie testow
    • node scripts/bump-version.mjs minor — podbicie wersji minor
    • pnpm -r build — build wszystkich pakietow
    • pnpm -r publish --access public --provenance — publikacja na npm
    • Commit wersji + push taga v{version}
    • Utworzenie GitHub Release
    • Otwarcie sync PR prod → main
  5. Zmerguj sync PR

    Po release pipeline otwiera PR z prod do main, zeby zsynchronizowac podbite wersje w package.json. Zmerguj ten PR, zeby main odzwierciedlal opublikowane wersje.

Skrypt scripts/bump-version.mjs podbija wersje we wszystkich 6 pakietach jednoczesnie. Wszystkie pakiety maja zawsze ta sama wersje.

Okno terminala
# Patch: 0.2.1 → 0.2.2
node scripts/bump-version.mjs patch
# Minor: 0.2.1 → 0.3.0 (domyslnie w pipeline)
node scripts/bump-version.mjs minor
# Major: 0.2.1 → 1.0.0
node scripts/bump-version.mjs major

Pakiety objete wersjonowaniem:

Pakietnpm
@ksefnik/sharednpm
@ksefnik/corenpm
@ksefnik/httpnpm
@ksefnik/simulatornpm
@ksefnik/mcpnpm
@ksefnik/clinpm

Automatyczny pipeline zawsze podbija wersje minor. Jesli potrzebujesz wydac wersje major (breaking change):

  1. Przed otwarciem PR do prod, uruchom bump lokalnie:

    Okno terminala
    node scripts/bump-version.mjs major
  2. Commituj zmiane:

    Okno terminala
    git add packages/*/package.json
    git commit -m "chore: bump to v1.0.0"
  3. Otworz PR do prod jak zwykle. Pipeline wykryje, ze wersje sa juz podbite i podbije je jeszcze raz o minor (np. 1.0.0 → 1.1.0).

Kazda paczka jest publikowana z flaga --provenance, co generuje podpisany atest SLSA. Na stronie npm przy kazdej paczce widac:

  • Zrodlowe repozytorium
  • Commit, z ktorego paczka zostala zbudowana
  • Workflow, ktory ja opublikowal

Publikacja wymaga tokenu npm ustawionego jako secret NPM_TOKEN w repozytorium GitHub. Token powinien byc typu granular access token z uprawnieniem publish do scope @ksefnik.

Pipeline uzywa --no-git-checks, poniewaz publikacja odbywa sie z detached HEAD po checkout — git nie jest na zadnym branchu w tradycyjnym sensie.

UstawienieWartosc
Require PRTak
Required checkstest (CI workflow)
Require up-to-date branchTak
Allow force pushNie
Allow deletionNie
UstawienieWartosc
Require PRTak
Required reviewers@luke-cf (CODEOWNERS)
Required checkstest (CI workflow)
Allow force pushNie
Allow deletionNie
Restrict who can pushTylko org members (+ guard-prod.yml)

Objaw: Pipeline pada na kroku “Publish to npm” z bledem 401 Unauthorized.

Rozwiazanie:

  1. Wejdz na npmjs.com/settings/tokens
  2. Wygeneruj nowy granular access token z uprawnieniem publish do @ksefnik/*
  3. Zaktualizuj secret NPM_TOKEN w Settings → Secrets → Actions

Objaw: PR sync prod → main ma konflikty w package.json.

Rozwiazanie:

  1. Zmerguj sync PR recznie, rozwiazujac konflikty
  2. Zawsze przyjmuj wersje z prod — to sa opublikowane wersje
Okno terminala
# W razie konfliktu
git checkout prod -- packages/*/package.json
git add packages/*/package.json
git commit -m "chore: resolve version sync from prod"

Objaw: Workflow wisi w statusie “Queued” bez postepow.

Rozwiazanie:

  1. Sprawdz Mac mini w biurze — czy jest wlaczony i podlaczony do sieci

  2. Sprawdz status runnera: Settings → Actions → Runners

  3. Jesli runner jest offline, uruchom go ponownie:

    Okno terminala
    ssh macmini
    cd ~/actions-runner
    ./run.sh

Objaw: Paczki sa na npm, ale brak taga i GitHub Release.

Rozwiazanie:

  1. Sprawdz logi workflow — zazwyczaj problem z uprawnieniami contents: write

  2. Utworz tag i release recznie:

    Okno terminala
    VERSION=$(node -p "require('./packages/shared/package.json').version")
    git tag "v$VERSION"
    git push origin "v$VERSION"
    gh release create "v$VERSION" --generate-notes