Proceso de release
metacore-kernel se distribuye como un módulo Go, no como binario. No hay artefactos ejecutables; los releases existen como tags Git indexados por proxy.golang.org, con GitHub Releases proveyendo un changelog categorizado encima.
Este documento es la fuente única de verdad para cortar un release y para recuperarse de uno embarrado.
Tabla de contenidos
- Elegir la versión (SemVer)
- Cortar y publicar el tag
- Lo que corre automáticamente
- Verificar el release
- Consumir desde una app host
- Renovate en repos consumer
- Pre-releases
- Rollback / retract
- Troubleshooting
- Referencias
1. Elegir la versión (SemVer)
El kernel sigue SemVer 2.0 estrictamente porque el grafo de módulos Go lo requiere.
| Bump | Disparado por |
|---|---|
| Patch | Commits fix:, refactors internos, optimizaciones, doc-only |
| Minor | Commits feat:, nuevos symbols exportados, deprecations marcadas con // Deprecated: |
| Major | feat!: / cuerpo BREAKING CHANGE:, exports removidos/renombrados, cambios de interfaz |
Los bumps major requieren el sufijo de module-path /v2 (o superior): github.com/asteby/metacore-kernel/v2. Planificá la migración del import path en los consumers con anticipación — Renovate no puede reescribir el sufijo por sí mismo.
Mientras el kernel está en v0.x, los bumps minor pueden técnicamente incluir cambios breaking. Igual los marcamos como tales en el changelog para que los consumers puedan distinguirlos.
Cómo decidir
# What landed since the last tag?
git log $(git describe --tags --abbrev=0)..HEAD --oneline- Cualquier línea
feat!:/BREAKING CHANGE:→ major. - Cualquier línea
feat:→ minor. - Solo
fix:/chore:/docs:/test:→ patch.
El primer mensaje de commit que introduce un cambio breaking gana, sin importar cuántos fixes vayan al lado.
2. Cortar y publicar el tag
# From a clean main branch:
git checkout main
git pull --ff-only
git status # must be clean
go test -race ./... # match CI
# Annotated tag — required for GoReleaser to pick up the message:
git tag -a v0.2.0 -m "Release v0.2.0"
git push origin v0.2.0Para pushear todos los tags pendientes de una:
git push --tags3. Lo que corre automáticamente
.github/workflows/release.yml se triggerea con cada tag v* y corre:
- Checkout + Go 1.25 con cache de módulo.
- Tests con race detector (
go test -race ./...). Una falla aborta el release. - Ping al Go proxy —
curl https://proxy.golang.org/.../@v/<tag>.infopara forzar el indexado inmediato. Sin esto,go getpuede reportarunknown revisiondurante varios minutos. - GoReleaser (
release --clean) crea el GitHub Release con:- Changelog categorizado (features / fixes / other).
- Source archive (
.tar.gz). - Checksums.
prerelease: trueautomático cuando el tag arrastra un sufijo SemVer (-alpha,-beta,-rc).
- Dispatch a consumers —
POST /repos/{owner}/{repo}/dispatchesa cada repo consumer host conevent_type=metacore-kernel-released. Cada consumer puede subscribirse víaon: repository_dispatchpara correr Renovate inmediatamente.
El token de dispatch (CROSSREPO_DISPATCH_TOKEN) necesita scope repo en cada organización consumer. El step usa continue-on-error: true así un dispatch fallido nunca bloquea el release en sí.
4. Verificar el release
# 1. GitHub Release exists
gh release view v0.2.0 --repo asteby/metacore-kernel
# 2. Go proxy indexed the tag
curl -s https://proxy.golang.org/github.com/asteby/metacore-kernel/@v/list
curl -s https://proxy.golang.org/github.com/asteby/metacore-kernel/@v/v0.2.0.info | jq
# 3. pkg.go.dev (5–30 minutes after release)
open https://pkg.go.dev/github.com/asteby/metacore-kernel@v0.2.05. Consumir desde una app host
En cualquier repo host consumer:
go env -w GOPRIVATE="github.com/asteby/*" # one time per machine
go get github.com/asteby/metacore-kernel@v0.2.0
go mod tidyRenovate, configurado según consumer-guide.md, abre el PR automáticamente al próximo tick del schedule — o inmediatamente cuando llega el evento repository_dispatch.
6. Renovate en repos consumer
Cada consumer publica un renovate.json derivado de docs/consumer-renovate-template.json. Política default:
- patch + minor → auto-merge (
platformAutomergede GitHub). - major → PR abierto con labels
breakingyreview-required.
El auto-merge procede solo cuando el CI del consumer está green. Una suite de tests fallida deja el PR abierto para intervención humana.
7. Pre-releases
Los pre-releases dejan a los consumers ejercitar cambios entrantes antes de un tag estable.
git tag -a v0.3.0-alpha.1 -m "Pre-release v0.3.0-alpha.1"
git push origin v0.3.0-alpha.1GoReleaser flaggea el GitHub Release como prerelease: true automáticamente. Renovate ignora prereleases por default — para optar a un consumer al testeo de uno, corré go get github.com/asteby/metacore-kernel@v0.3.0-alpha.1 manualmente en ese repo.
8. Rollback / retract
Los módulos Go son inmutables — una vez que una versión está en proxy.golang.org, queda ahí para siempre. Para marcar un release como defectuoso, usá retract en go.mod:
# 1. Add a retract directive with a rationale comment.
go mod edit -retract=v0.2.0go.mod resultante:
module github.com/asteby/metacore-kernel
go 1.25
retract (
v0.2.0 // leaked credentials in logs; use v0.2.1+
)Pasos:
- Aterrizá la directiva retract (y el fix real) en
main. - Taggeá una versión patch nueva que incluya las dos (
v0.2.1). - Pusheá el tag — el workflow de release la indexa y dispatcha consumers.
- Los consumers que corran
go get -uvan a ver un warning y resolver a la próxima versión no-retracted.
Para retractar un rango contiguo:
retract [v0.2.0, v0.2.4]9. Troubleshooting
| Síntoma | Causa probable | Fix |
|---|---|---|
go get reporta unknown revision | Proxy todavía no indexó | GOPROXY=direct go get … o esperar 5 minutos |
| El workflow de release falla en tests | Race condition reciente | Fixealo en main, re-taggeá con la próxima versión patch |
pkg.go.dev no muestra la nueva versión | Lag de index | Abrí https://pkg.go.dev/github.com/asteby/metacore-kernel@vX.Y.Z para forzar el fetch |
| El step de dispatch a consumer falla | Al token le falta scope | Regenerá CROSSREPO_DISPATCH_TOKEN con repo |
| El consumer nunca recibe un PR de Renovate | Renovate deshabilitado o GOPRIVATE mal configurado | Inspeccioná renovate.json y hostRules.token |