Gestión de Lanzamientos
La gestión de lanzamientos coordina cuándo y cómo se publican los servicios de Python: reglas de versionado, trenes de lanzamiento, aprobaciones de cambios y comunicación. Una buena higiene de lanzamientos hace que la reversión sea creíble y los interesados predecibles.
Receta
Tarjeta de referencia rápida - lista para copiar y pegar.
# Lanzamiento: orders-api v2026.07.09
## Artefactos
- Imagen: `orders-api:sha-9f2a1bc` (Python 3.14.0)
- Wheel (lib interna): `acme-billing==2.4.0`
## Migraciones
- alembic `20260709_add_tax_code` (expandir, compatible con versiones anteriores)
## Reversión
- `kubectl rollout undo` a `sha-7c1b2aa`
- Pausar trabajadores de `billing` si la profundidad de la cola > 5k
## Interesados
- #releases, macro de soporte actualizadaCuándo usar esto:
- Múltiples equipos publican la misma plataforma semanalmente
- API orientada al cliente con compromisos de SLA
- Bibliotecas compartidas consumidas por muchos servicios internos
- El cumplimiento requiere registros de cambios
Ejemplo de Trabajo
"""version_bump.py - automatiza metadatos de versión de servicio para notas de lanzamiento."""
from __future__ import annotations
import subprocess
from dataclasses import dataclass
from datetime import date
@dataclass(frozen=True)
class ReleaseMetadata:
service: str
git_sha: str
python: str
release_date: date
def git_short_sha() -> str:
return subprocess.check_output(["git", "rev-parse", "--short", "HEAD"], text=True).strip()
def build_release_notes(meta: ReleaseMetadata, changes: list[str]) -> str:
lines = [
f"# Lanzamiento de {meta.service} {meta.release_date.isoformat()}",
f"- Git: `{meta.git_sha}`",
f"- Python: {meta.python}",
"",
"## Cambios",
]
lines.extend(f"- {c}" for c in changes)
return "\n".join(lines)
if __name__ == "__main__":
meta = ReleaseMetadata("orders-api", git_short_sha(), "3.14.0", date.today())
print(build_release_notes(meta, ["Añadir campo de código fiscal (nullable)", "Corregir backoff de reintento de Celery"]))Lo que esto demuestra:
- Las notas de lanzamiento vinculan los cambios visibles para el cliente con el SHA de git
- Riesgo de migración detallado explícitamente para los operadores
- Pasos de reversión junto a las instrucciones de despliegue hacia adelante
- La automatización reduce los errores de copiar y pegar en las publicaciones de
#releases
Inmersión Profunda
Cómo Funciona
- Tren de lanzamiento - Cadencia fija (por ejemplo, martes/jueves) con fecha límite para la fusión.
- Semver - Las bibliotecas usan MAYOR.MENOR.PARCHE; los cambios que rompen incrementan el mayor.
- Gestión de cambios - Revisión del CAB para migraciones destructivas o días de bandera entre servicios.
- Inmutabilidad de artefactos - Construir una vez, promover a través de entornos.
- Comunicación - Macros de soporte y plantillas de estado actualizadas antes de la promoción a producción.
Tipos de Lanzamiento
| Tipo | Cadencia | Alcance Típico |
|---|---|---|
| Tren Estándar | Semanal | Funciones detrás de banderas |
| Hotfix | Ad hoc | Mitigación de SEV |
| Parche de Biblioteca | Fusión automática diaria | CVE de seguridad |
| Plataforma Mayor | Trimestral | Incremento menor de Python |
Notas de Python
# pyproject.toml - versionado de bibliotecas
[project]
name = "acme-billing"
version = "2.4.0"
requires-python = ">=3.13"Trampas
:latestflotante en producción - Ambigüedad en la reversión. Solución: Etiquetas inmutables con SHA; registrar en la anotación de despliegue.- Notas de lanzamiento sin sección de migración - Operadores sorprendidos por bloqueos. Solución: IDs de revisión de Alembic obligatorios en las notas.
- Tren sin fecha límite - Fusiones arriesgadas de último minuto. Solución: Congelación de código 24h antes de producción con proceso de excepción.
- Python diferente en worker vs API - Sutiles errores de pickle/esquema. Solución: Política de imagen base única por lanzamiento.
- Omitir notificación a interesados - Soporte tomado por sorpresa. Solución: La publicación en
#releaseses una puerta de lanzamiento, no opcional.
Alternativas
| Alternativa | Usar Cuando | No Usar Cuando |
|---|---|---|
| Despliegue Continuo | Banderas sólidas + canary | Acoplamiento pesado de esquemas |
| GitOps (Argo CD) | Flota de K8s | Tienda manual solo Lambda |
| Lanzamientos Oscuros | Cambios de modelos de ML | Se requiere divulgación regulada |
| Ramas de larga duración | Modelo de lanzamiento heredado | Equipo moderno de trunk-based |
Preguntas Frecuentes
¿Con qué frecuencia deben lanzar los servicios de Python?
Diario a semanal con banderas es común cuando las migraciones son de expansión-contracción y el CFR es bajo.
¿Las bibliotecas siguen el mismo tren?
Las bibliotecas se lanzan bajo demanda; los servicios fijan versiones en el archivo de bloqueo por tren.
¿Qué es un capitán de lanzamiento?
Un ingeniero rotativo es responsable de la lista de verificación, las comunicaciones y el visto bueno/no visto bueno para ese tren.
¿Cómo manejar un hotfix durante la congelación?
El IC o el capitán de lanzamiento aprueba; documentar la excepción en el ticket de cambio.
¿Deben los notebooks enviarse en el tren?
No - los trabajos por lotes y los notebooks tienen una promoción separada con la aprobación del propietario de los datos.
¿Cómo versionar las API internas?
Versionado de URL o encabezado documentado en el changelog; los consumidores fijan el SDK del cliente.
¿Qué pasa con los monorepos?
Etiquetas y notas de lanzamiento por servicio; una fusión puede desencadenar múltiples pipelines de despliegue.
¿Cómo registrar cambios para auditoría?
Enlazar tickets de JIRA/Linear en las notas de lanzamiento; conservar artefactos de construcción durante 90+ días.
¿Cuándo retrasar un tren?
Presupuesto de errores agotado, SEV1 abierto o prueba de carga de migración fallida en staging.
¿Afecta uv a la gestión de lanzamientos?
uv acelera CI; el proceso de lanzamiento todavía se rige por pruebas, migraciones y canary.
Relacionado
- Estrategias de Reversión - cuando los trenes salen mal
- Entornos y Promoción de Configuración - ruta de promoción
- Métricas DORA - medir la salud de la entrega
- Pipelines de CI/CD - automatización
- Empaquetado y Publicación - lanzamientos de bibliotecas
Versiones de Stack: Esta página fue escrita para Python 3.14.0 (estable 3.14, mantenimiento 3.13), FastAPI 0.115+, Django 5.2, Flask 3.1, Pydantic 2, PyTorch 2.6+, pandas 2.2+, Polars 1.x, ruff 0.9+, y uv 0.6+.