Sari la conținutul principal

Automatizarea release-urilor

Scriptul de release rulează din rădăcina repository-ului, citește istoricul Git real de la tag-ul anterior, actualizează versiunile, scrie changelog-ul, rulează verificările și creează commit-ul și tag-ul adnotat. GitHub construiește și publică binarele, iar metadata și linkurile artefactelor sunt oglindite în Forgejo.

Configurare inițială

npm install
npm run setup-hooks

Sunt configurate .githooks/commit-msg pentru Conventional Commits, .githooks/pre-commit pentru formatare și .gitmessage ca șablon.

Crearea unui release

# Patch release
npm run release

# Minor release
npm run release:minor

# Major release
npm run release:major

Scriptul verifică un tree curat și un tag disponibil, colectează dovezi despre commit-uri, fișiere, dependențe, localizări și changelog, generează notele, actualizează package.json, pachetele workspace, package-lock.json, Helm și CHANGELOG.md, rulează npm run release:check și creează commit-ul/tag-ul numai după succes.

Changelog

npm run changelog
npm run changelog -- update

Un model local compatibil Ollama poate scrie un draft, care este validat față de dovezile Git. La eșec este folosit generatorul determinist.

CHANGELOG_AI=0 npm run release:minor
CHANGELOG_AI_MODEL=glm-5.2:cloud npm run changelog
OLLAMA_BASE_URL=http://127.0.0.1:11434 npm run release

Publicarea release-ului

Publicați numai commit-ul și tag-ul create de script. Mai întâi Forgejo, apoi GitHub, fără tag-uri urmărite automat:

git -c push.followTags=false push \
https://git.kroonen.ai/libre-webui/libre-webui.git \
HEAD:refs/heads/main
git ls-remote \
https://git.kroonen.ai/libre-webui/libre-webui.git \
refs/heads/main

git -c push.followTags=false push \
https://github.com/libre-webui/libre-webui.git \
HEAD:refs/heads/main
git ls-remote \
https://github.com/libre-webui/libre-webui.git \
refs/heads/main

SHA-urile trebuie să coincidă. Așteptați workflow-urile și verificați că tag-ul lipsește înainte de push:

git ls-remote \
https://git.kroonen.ai/libre-webui/libre-webui.git \
'refs/tags/vX.Y.Z' 'refs/tags/vX.Y.Z^{}'
git ls-remote \
https://github.com/libre-webui/libre-webui.git \
'refs/tags/vX.Y.Z' 'refs/tags/vX.Y.Z^{}'

git -c push.followTags=false push \
https://git.kroonen.ai/libre-webui/libre-webui.git \
refs/tags/vX.Y.Z:refs/tags/vX.Y.Z
git -c push.followTags=false push \
https://github.com/libre-webui/libre-webui.git \
refs/tags/vX.Y.Z:refs/tags/vX.Y.Z

git ls-remote \
https://git.kroonen.ai/libre-webui/libre-webui.git \
'refs/tags/vX.Y.Z' 'refs/tags/vX.Y.Z^{}'
git ls-remote \
https://github.com/libre-webui/libre-webui.git \
'refs/tags/vX.Y.Z' 'refs/tags/vX.Y.Z^{}'

Înlocuiți vX.Y.Z și verificați obiectul tag și commit-ul rezultat. Nu folosiți niciodată git push --tags.

Traseul CI

Un tag v* rulează verificările, construiește Electron, creează release-ul GitHub, oglindește Forgejo și publică Docker, Helm la aceeași versiune și npm cu NPM_TOKEN.

npm run release:check

Oglindirea în Forgejo

Secretul FORGEJO_TOKEN are numai permisiunea write:repository. Oglindirea este idempotentă: creează înregistrările lipsă, sincronizează metadata și omite linkurile existente. Asset-urile sunt linkuri externe către browser_download_url din GitHub.

Repository-ul țintă este libre-webui/libre-webui, previzualizarea folosește --dry-run, tag-ul este vX.Y.Z, iar branch-ul este main.

Previzualizarea/refacerea unui release

node scripts/mirror-forgejo-releases.mjs --tag vX.Y.Z --dry-run
node scripts/mirror-forgejo-releases.mjs --tag vX.Y.Z

Previzualizarea/refacerea tuturor

node scripts/mirror-forgejo-releases.mjs --all --dry-run
node scripts/mirror-forgejo-releases.mjs --all

GITHUB_TOKEN este necesar pentru --all, iar FORGEJO_TOKEN pentru scriere. API-urile folosesc pagination și procesează GitHub Releases. Repetați dry-run până când nu mai rămân schimbări.

Politica tag-urilor imuabile

Tag-urile publicate nu sunt șterse, mutate, reutilizate sau suprascrise prin force-push. Corectați problema într-un nou patch release. Tag-ul Forgejo v0.8.6 a fost aliniat o singură dată, cu aprobare, la introducerea oglinzii duble și nu constituie precedent.

Politica de versiuni Helm

version și appVersion din chart, pachetul rădăcină și tag-ul release-ului folosesc aceeași versiune semantică. Chart-ul este publicat numai din v*. Versiunea 0.14.1 are un override digest unic; următorul release îl elimină. Docker publică același tag în GHCR/Docker Hub, iar Helm așteaptă până la 20 de minute. Imaginea Ollama folosește separat latest.

Conventional Commits

<type>[optional scope]: <description>

Tipurile sunt feat, fix, docs, refactor, perf, test și chore. Breaking changes folosesc !:

git commit -m "feat!: remove deprecated endpoint"
git commit -m "fix(auth)!: change token validation"

Depanare

Director de lucru necurat

git status --short
git add .
git commit -m "fix: resolve pending changes"

Nu există schimbări publicabile

git log $(git describe --tags --abbrev=0)..HEAD --oneline

Changelog editat manual

git add CHANGELOG.md
git commit -m "docs: refine changelog"

Anularea unui release local

git tag -d v0.12.0
git reset --soft HEAD~1

Dacă tag-ul există la distanță, creați un patch release nou.

Oglindă incompletă

node scripts/mirror-forgejo-releases.mjs --tag vX.Y.Z --dry-run
node scripts/mirror-forgejo-releases.mjs --tag vX.Y.Z

O eroare de autorizare indică un FORGEJO_TOKEN lipsă sau expirat. Oglindirea nu creează și nu mută tag-uri.

Fișiere pentru mentenanță

  • .gitmessage — șablon de commit
  • .githooks/commit-msg — verificare Conventional Commit
  • .githooks/pre-commit — formatare
  • scripts/release.js — orchestration
  • scripts/mirror-forgejo-releases.mjs — mirror/backfill
  • scripts/generate-changelog.js — changelog
  • scripts/lib/releaseNotes.js — dovezi
  • .github/workflows/release.yml — CI pentru tag
  • .github/workflows/helm-publish.yml — Helm

Mai multe informații: https://www.conventionalcommits.org/.