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— formatarescripts/release.js— orchestrationscripts/mirror-forgejo-releases.mjs— mirror/backfillscripts/generate-changelog.js— changelogscripts/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/.