TPTito Pinardo Gutiérrez
← Artículos
English

Renovate en casa: tres actualizaciones que nunca se aplicaban

Renovate abre un PR por cada versión fijada que tiene versión nueva, y cada uno pasa por el CI y por el plan como cualquier cambio. En el primer día de PR, uno de ellos traía un plan con cero cambios. Tirando de ese hilo salieron tres roles que llevaban tiempo «actualizándose» sin actualizar nada.

  • Renovate
  • Ansible
  • Forgejo · Actions

Qué hace Renovate aquí

Toda mi infraestructura fija versiones: Forgejo, Terraform, Traefik, Qdrant, el panel de inicio, el cliente de Matrix, los proveedores de Terraform… Volver a lanzar un playbook no debe actualizar nada por sorpresa, así que cada subida es un cambio con su commit. Hasta ahora lo hacía a mano, cuando me acordaba.

Ahora, cada lunes, Renovate mira esas versiones y abre un PR por cada una que tenga versión nueva. Las descargas fijadas llevan su suma SHA-256, y un pequeño script la saca del fichero de sumas oficial de la release. Si la release no la publica, el PR no sale. Las versiones mayores esperan a que las apruebe en un issue, y las bases de datos quedan fuera.

Nada se aplica solo: cada PR pasa por el CI, trae su plan como comentario y, al fusionarlo, se aplica con el mismo clic que un cambio mío.

# renovate: datasource=docker depName=qdrant/qdrant extractVersion=^v(?<version>.+)$
qdrant_version: "1.19.1"

El plan que no cuadraba

El PR de Qdrant subía de 1.19.1 a 1.19.2. El CI salió en verde y el plan decía que el playbook de Qdrant se lanzaría con cero tareas cambiadas. Una versión nueva que no cambia nada no tiene sentido: algo tenía que descargarse e instalarse.

El rol bajaba el binario a una ruta temporal fija y se saltaba la descarga si ya había un fichero allí. Allí estaba el de la versión anterior, así que la nueva nunca se bajaba y se reinstalaba la vieja. El número del inventario decía 1.19.2 y el servidor seguía en 1.19.1.

Traefik tenía el mismo defecto. Y la herramienta de Ansible del nodo de control usaba «que esté instalado», así que una versión ya instalada no se tocaba nunca: el PR de su versión nueva tampoco habría cambiado nada.

El arreglo

  • Cada versión, en su propio directorio, como ya hacían otros roles: una versión nueva es una ruta nueva, que no existe hasta que se baja.
  • La herramienta de Ansible compara la versión instalada con la pedida y, si no coinciden, actualiza dentro del mismo entorno, sin perder lo añadido.
  • De paso, fuera el ruido: varias tareas salían como «cambiadas» en cada despliegue sin cambiar nada (paquetes copiados a una carpeta que se vaciaba sola). Así un plan con cambios significa cambios.

Por qué no lo había visto

Subiendo los números a mano, lanzaba el playbook, salía en verde y daba la subida por hecha. Nadie comparaba el número con lo que de verdad corría.

Con Renovate, cada subida trae un plan que dice cuántas tareas cambiarían, y lo leo antes de fusionar. Un cero donde tenía que haber un cambio salta a la vista.

Resultado

Los tres roles actualizan de verdad, y los PR de Renovate de ese día se fusionaron con sus planes ya enseñando los cambios. Desde entonces, el único trabajo que me queda con las versiones es leer el plan y pulsar.