Recetas para cambios comunes¶
Cada receta enumera los archivos que hay que tocar, en orden. Termine cada una con make test-remote, el libro y un despliegue.
Agregar un campo a rendimiento.yaml¶
Ejemplo: terminationGracePeriod (los segundos que tiene un pod para apagarse).
- El tipo en
internal/spec/spec.go, enService, con un comentario de documentación: - El valor predeterminado en
Spec.Defaultsi lo necesita, y la validación enSpec.Validate(rango, formato), con un mensaje que nombre la ruta (services[%d].terminationGracePeriod). - Las pruebas en
internal/spec/spec_test.go: un valor válido se lee bien; uno inválido da el mensaje. - La generación en
internal/render/render.go(deployment): definapod.TerminationGracePeriodSeconds. - Los archivos de referencia: si la especificación de referencia debe mostrarlo, agréguelo a la entrada de la prueba; vuelva a generar y revise las diferencias:
- Vuelva a generar el CRD, porque el recurso
Appincluye la especificación:make generate. Confirmedeploy/crds/. - La interfaz, si la gente debe definirlo en el asistente: el tipo
Serviceenweb/src/api.tsy un campo enServiceForm(pages/NewApp.tsx). - El libro: una fila en la referencia.
- El despliegue:
kubectl apply -f deploy/crds/rendimiento.ai_apps.yamlantes de la plataforma nueva (si no, el servidor de la API tira el campo nuevo), luegomake imagey reinicie.
Agregar una ruta a la API y una página a la interfaz¶
Ejemplo: GET /api/apps/{app}/pods.
- El manejador: un método de
*Servereninternal/api(un archivo nuevo por área, comoaddons.go): Deje la lógica fuera de los manejadores: póngala en el paquete de la plataforma, del almacén o del controlador, y llámela. - La ruta en
Server.Handler:auth("GET /api/apps/{app}/pods", s.appPods).authsignifica que se requiere una sesión;logines el usuario. - La prueba en
internal/api/server_test.go(un almacén real, una plataforma de imitación donde haga falta). - El cliente: el tipo de la respuesta y una función en
web/src/api.ts. - La página o el componente en
web/src/pages/; una ruta enmain.tsx(y unNavLinkpara una página principal). UseusePollpara cargar y refrescar. - El libro: la referencia de la API, y el capítulo de la guía al que pertenece la función.
Agregar un complemento al catálogo¶
- Revise el paquete: el
index.yamlde su repositorio, la versión, y que tenga imágenes arm64. - Agregue una entrada a
Catalogeninternal/addon/catalog.go:ID,Title,Category,Description,Helm(repositorio, paquete, versión),Namespacey unos cuantosFields(rutas de valores con puntos, con etiqueta, tipo y valor predeterminado). PongaManualSyncen cualquier cosa riesgosa, yNotespara lo que los usuarios deben saber. - Pruébelo de verdad: instálelo desde la interfaz, revise la vista previa y luego desinstálelo.
- El libro: Complementos enumera el catálogo.
Agregar una comprobación del entorno¶
- Escriba
func (c *Checker) checkX(ctx context.Context) Checkeninternal/environment/checks.go: definaID,Name,Category,Required, luegoStatus(OK,Warning,Missing,Error), unSummaryde una línea,Detailsy unFixque le diga al lector exactamente qué hacer. - Regístrela en
Checker.checks. - Pruébela en
environment_test.gocon un cliente de imitación.
Agregar un proveedor de DNS¶
- Implemente
dns.Provider(Ensure,Remove,Zones,Describe) eninternal/dns/<proveedor>.go.Ensuredebe negarse a sobrescribir registros que no creó (marque los suyos, como lo hace el comentario de Cloudflare). - Selecciónelo en
cmd/rendimiento/main.goa partir de ajustes nuevos. - Agréguelo a las opciones de proveedor que muestra la página Entorno.
- Pruebas con
httptest.NewServeren lugar de la API del proveedor.
Cambiar la base de datos¶
- Agregue
internal/store/migrations/000N_que.sql. Nunca edite una migración que ya corrió en algún lado. - Agregue métodos al almacén, cada uno con un comentario de documentación, SQL simple y
ErrNotFoundpara las filas que no existen. - Pruebas en
internal/store/store_test.go(corren contra el Postgres de prueba). - La migración corre sola en el siguiente arranque de la plataforma.
Agregar un tipo nuevo de paso de integración continua¶
Los pasos de tarea (tasks:, comandos como eas build con secretos) se agregaron así, así que sígalos como ejemplo resuelto: spec.Task, KindTask, internal/pipeline/task.go y skippedTasks en la plataforma.
- La especificación: una forma de declararlo (una lista de primer nivel como
tasks:), con valores predeterminados y validación (nombres únicos entre servicios, tareas programadas y tareas; referencias que existan; sin ciclos). - El plan (
internal/pipeline/plan.go): unKindnuevo, pasos con sus dependencias. - El ejecutor (
KubeExecutor.pod): el contenedor de ese tipo (imagen, comando, entorno desde secretos, recursos). - La versión (
platform.release): decida si el resultado del paso afecta las versiones. - La interfaz: el grafo de la ejecución muestra cualquier tipo; agregue un ícono si quiere.
- Las pruebas: pruebas del plan, una prueba de la forma del pod (como
TestBuildPodPicksBuilder) y una prueba del corredor.
Detectar un lenguaje o marco de trabajo nuevo¶
internal/detect/detect.go: reconozca el manifiesto, definaLanguage,Framework,Port, la imagen y el comando de pruebas, con una línea enReasonsque explique la suposición.- Una plantilla de Dockerfile en
templates/dockerfiles/<nombre>.tmpl, elegida eninternal/generate/generate.go. - Pruebas con un repositorio
fstest.MapFSendetect_test.goygenerate_test.go.
Administrar un tipo nuevo de objeto de Kubernetes para las aplicaciones¶
- Genérelo (
internal/render) y agréguelo aObjectsy aObjects.List. - Deje que el controlador lo vigile:
Owns(&Kind{})enAppReconciler.SetupWithManager. - Pódelo (
pruneenumera y borra por etiqueta los que ya sobran). - Dé los permisos de RBAC en
deploy/rbac.yaml. - Decida si la adopción debe tomar su control (
takeover).