Wydawanie wersji
Ksefnik stosuje prosty model release oparty na dwoch branchach i jednym skrypcie wersjonujacym.
Strategia branchow
Dział zatytułowany „Strategia branchow”| Branch | Rola | Co sie dzieje po push/merge |
|---|---|---|
main | Branch deweloperski | Nic automatycznego. CI odpala sie tylko na PR-ach. |
prod | Branch release’owy | Merge 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.0Kto moze mergowac
Dział zatytułowany „Kto moze mergowac”| Branch | Kto moze mergowac | Mechanizm |
|---|---|---|
main | Kazdy czlonek organizacji | Standardowe review |
prod | Tylko @luke-cf | CODEOWNERS + 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.
Przebieg release’u
Dział zatytułowany „Przebieg release’u”-
Otworz PR z
maindoprodOkno terminala gh pr create --base prod --head main \--title "Release: opis zmian" -
CI odpala sie na PR
Workflow
ci.ymluruchamia build, typecheck i testy. PR nie moze byc zmergowany, dopoki CI nie przejdzie. -
Review i merge
@luke-cfprzegląda PR i merguje. To jest moment decyzji “chce wydac release”. -
Automatyczny pipeline (po merge)
Workflow
prod-release.ymlwykonuje w kolejnosci:pnpm typecheck— ponowne sprawdzenie typowpnpm test -- --run— ponowne uruchomienie testownode scripts/bump-version.mjs minor— podbicie wersji minorpnpm -r build— build wszystkich pakietowpnpm -r publish --access public --provenance— publikacja na npm- Commit wersji + push taga
v{version} - Utworzenie GitHub Release
- Otwarcie sync PR
prod → main
-
Zmerguj sync PR
Po release pipeline otwiera PR z
proddomain, zeby zsynchronizowac podbite wersje wpackage.json. Zmerguj ten PR, zebymainodzwierciedlal opublikowane wersje.
Skrypt wersjonowania
Dział zatytułowany „Skrypt wersjonowania”Skrypt scripts/bump-version.mjs podbija wersje we wszystkich 6 pakietach jednoczesnie. Wszystkie pakiety maja zawsze ta sama wersje.
# Patch: 0.2.1 → 0.2.2node 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.0node scripts/bump-version.mjs majorPakiety objete wersjonowaniem:
| Pakiet | npm |
|---|---|
@ksefnik/shared | npm |
@ksefnik/core | npm |
@ksefnik/http | npm |
@ksefnik/simulator | npm |
@ksefnik/mcp | npm |
@ksefnik/cli | npm |
Wydanie major
Dział zatytułowany „Wydanie major”Automatyczny pipeline zawsze podbija wersje minor. Jesli potrzebujesz wydac wersje major (breaking change):
-
Przed otwarciem PR do
prod, uruchom bump lokalnie:Okno terminala node scripts/bump-version.mjs major -
Commituj zmiane:
Okno terminala git add packages/*/package.jsongit commit -m "chore: bump to v1.0.0" -
Otworz PR do
prodjak zwykle. Pipeline wykryje, ze wersje sa juz podbite i podbije je jeszcze raz o minor (np.1.0.0 → 1.1.0).
Publikacja na npm
Dział zatytułowany „Publikacja na npm”Provenance
Dział zatytułowany „Provenance”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.
Flaga --no-git-checks
Dział zatytułowany „Flaga --no-git-checks”Pipeline uzywa --no-git-checks, poniewaz publikacja odbywa sie z detached HEAD po checkout — git nie jest na zadnym branchu w tradycyjnym sensie.
Branch protection
Dział zatytułowany „Branch protection”| Ustawienie | Wartosc |
|---|---|
| Require PR | Tak |
| Required checks | test (CI workflow) |
| Require up-to-date branch | Tak |
| Allow force push | Nie |
| Allow deletion | Nie |
| Ustawienie | Wartosc |
|---|---|
| Require PR | Tak |
| Required reviewers | @luke-cf (CODEOWNERS) |
| Required checks | test (CI workflow) |
| Allow force push | Nie |
| Allow deletion | Nie |
| Restrict who can push | Tylko org members (+ guard-prod.yml) |
Troubleshooting
Dział zatytułowany „Troubleshooting”NPM_TOKEN wygasl
Dział zatytułowany „NPM_TOKEN wygasl”Objaw: Pipeline pada na kroku “Publish to npm” z bledem 401 Unauthorized.
Rozwiazanie:
- Wejdz na npmjs.com/settings/tokens
- Wygeneruj nowy granular access token z uprawnieniem publish do
@ksefnik/* - Zaktualizuj secret
NPM_TOKENw Settings → Secrets → Actions
Wersje rozjechaly sie miedzy main i prod
Dział zatytułowany „Wersje rozjechaly sie miedzy main i prod”Objaw: PR sync prod → main ma konflikty w package.json.
Rozwiazanie:
- Zmerguj sync PR recznie, rozwiazujac konflikty
- Zawsze przyjmuj wersje z
prod— to sa opublikowane wersje
# W razie konfliktugit checkout prod -- packages/*/package.jsongit add packages/*/package.jsongit commit -m "chore: resolve version sync from prod"Self-hosted runner nie dziala
Dział zatytułowany „Self-hosted runner nie dziala”Objaw: Workflow wisi w statusie “Queued” bez postepow.
Rozwiazanie:
-
Sprawdz Mac mini w biurze — czy jest wlaczony i podlaczony do sieci
-
Sprawdz status runnera: Settings → Actions → Runners
-
Jesli runner jest offline, uruchom go ponownie:
Okno terminala ssh macminicd ~/actions-runner./run.sh
Pipeline opublikowal paczke, ale nie utworzyl release
Dział zatytułowany „Pipeline opublikowal paczke, ale nie utworzyl release”Objaw: Paczki sa na npm, ale brak taga i GitHub Release.
Rozwiazanie:
-
Sprawdz logi workflow — zazwyczaj problem z uprawnieniami
contents: write -
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