Saltar al contenido

Artículos

RSS

Posts y artículos que he escrito.

Cómo prevenir connection leaks en la base de datos

Un handler que lanza una excepción con ciertos inputs pierde una conexión a la base de datos por cada request fallido. Después de treinta, el pool queda vacío y requests sanos empiezan a morir con timeouts. Por qué la limpieza va en finally, y dónde ponerla para que nadie tenga que acordarse.

3 min de lectura
  • databases
  • python
  • backend
Bases de datos en producción

Una nueva serie con un formato distinto: posts cortos, una práctica de bases de datos en cada uno, todas sacadas de cosas que de verdad se rompen bajo carga. Fugas de conexiones, N+1 invisibles, migraciones que bloquean tablas, tasks que corren contra datos que todavía no existen.

1 min de lectura
  • databases
  • python
  • backend
Mantenimiento de dependencias en piloto automático con Renovate

Los scanners de la parte 12 te dicen qué dependencias son vulnerables, pero los upgrades siguen siendo manuales y nunca alcanzan. Renovate self-hosted como pipeline programado, los dos tokens que lo mantienen vivo y el chequeo previo que convirtió una sesión recurrente de debugging en una línea de log.

6 min de lectura
  • gitlab
  • ci-cd
  • devops
Escaneos de seguridad que nadie ignora

El escaneo de seguridad tarda 21 minutos, inunda cada merge request con hallazgos sobre código que nadie tocó y el equipo aprende a pasarlo de largo. SAST diff-aware con Semgrep, un umbral de severidad para OSV-Scanner y el formato de reporte que devuelve los hallazgos al widget del MR.

6 min de lectura
  • gitlab
  • ci-cd
  • security
Pipelines programados y E2E: señal sin bloquear merges

La suite de E2E es demasiado lenta y demasiado inestable para bloquear merges, pero la señal la necesitas igual, junto con un lugar donde ver su historial. Pipelines programados, service tokens para un entorno con puerta de acceso, sharding de Playwright y un archivo de reportes que sobrevive a sus pipelines.

7 min de lectura
  • gitlab
  • ci-cd
  • devops
Releases desde CI sin disparar tu propio pipeline

Un job de release que hace push del commit de versiones dispara un pipeline nuevo, y dos merges seguidos compiten entre sí por publicar en npm. Cómo serializar releases con resource_group, autenticar el push desde un job, y cuándo usar [skip ci] frente a -o ci.skip.

6 min de lectura
  • gitlab
  • ci-cd
  • devops
Pipelines de monorepo en GitLab CI: todo selectivo

Cincuenta paquetes y ocho apps en un solo repo: recompilar el mundo en cada commit no es una opción. Detección de cambios con rules:changes y compare_to, un anchor de YAML por app, un task runner que ya conoce el grafo de dependencias, y la semana en que los runners se quedaron sin disco.

8 min de lectura
  • gitlab
  • ci-cd
  • devops
Una librería de CI compartida: un solo pipeline para diez repos

Diez repos hermanos copiaron y pegaron las mismas ~300 líneas de YAML, y cada copia se fue rompiendo por su lado. include:, hidden jobs como API pública, un vocabulario de rules con !reference, y cómo publicar cambios cuando todos los consumidores siguen main.

8 min de lectura
  • gitlab
  • ci-cd
  • devops
Downstream pipelines: hacer que dos repos se hablen

Mergear un cambio del frontend debería correr los tests E2E que viven en otro repo, mantenido por otro equipo. Trigger jobs, pipelines multi-project frente a parent-child, cómo reflejar el estado del pipeline hijo, y un allowlist de variables que además funciona como frontera de secretos.

7 min de lectura
  • gitlab
  • ci-cd
  • devops
Workflow y tipos de pipeline en GitLab CI: un pipeline por commit

Haz push a una rama con un merge request abierto y aparecen dos pipelines para el mismo commit: el doble de costo y dos estados que interpretar. Los tipos de pipeline, workflow rules como portero, y lo que de verdad cuesta correr solo branch pipelines.

7 min de lectura
  • gitlab
  • ci-cd
  • devops
Rules en GitLab CI: controlar cuándo corre cada job

Cada job corre en cada push: los jobs de deploy se cuelan en las ramas de feature y las suites caras corren aunque nada relevante haya cambiado. Rules a nivel de job (if, changes, exists), gates manuales y un regex que coincidía en silencio con casi cualquier mensaje de commit.

5 min de lectura
  • gitlab
  • ci-cd
  • devops
Pipelines más rápidos en GitLab CI con needs y parallel

Tus jobs son eficientes pero tu pipeline es lento, porque los stages obligan a cada job a esperar a jobs de los que no depende. Cómo reemplazar las barreras de stage por un grafo con needs, y partir el job más lento entre varios runners con parallel.

3 min de lectura
  • gitlab
  • ci-cd
  • devops
Artifacts en GitLab CI: compila una vez, reutiliza en todos lados

Tu job de deploy recompila la app que otro job acaba de compilar. Meter dist/ al cache parece la solución, hasta que despliega código viejo sin avisar. Artifacts, expiración, reportes de fallos y cómo pasar valores entre jobs con dotenv.

3 min de lectura
  • gitlab
  • ci-cd
  • devops
Políticas de cache en GitLab CI: pull, push y fallback keys

Un cache que funciona todavía pierde tiempo de tres formas: cada job lo vuelve a subir, un bump del lockfile arranca de cero, y los merge requests nunca ven lo que main dejó caliente. Políticas de cache, fallback keys y el cache partido de las ramas protegidas.

3 min de lectura
  • gitlab
  • ci-cd
  • devops
¿Cómo escribir una regla de ESLint?

Crear una regla de ESLint personalizada para prohibir el uso de un componente. Cómo recorrer el AST, identificar el nodo correcto y empaquetar la regla en un plugin local.

5 min de lectura
  • javascript
  • eslint
  • tooling
¿Cómo subir archivos a S3 usando @aws-sdk/client-s3?

Cómo usar @aws-sdk/client-s3 para subir archivos y carpetas enteras a AWS S3 desde Node.js, con los gotchas más comunes (content type, claves con barras, paths de Windows).

4 min de lectura
  • javascript
  • node.js
  • aws
  • aws-s3
  • tooling
Leer y modificar archivos y carpetas en Go

Recetas mínimas para leer un archivo, sobreescribirlo y recorrer una carpeta de forma recursiva en Go, con un ejemplo práctico que combina las tres.

2 min de lectura
  • go
  • snippets
¿Cómo truncar líneas de texto con CSS?

Una técnica corta para limitar un bloque de texto a N líneas con CSS puro, ideal cuando el contenido es dinámico y no quieres que rompa la UI.

1 min de lectura
  • css
  • snippets
¿Cómo integrar NProgress con Next.js?

Snippets para mostrar una barra de progreso en la parte superior mientras Next.js navega entre páginas, usando NProgress y los eventos del router.

1 min de lectura
  • react
  • next.js
  • snippets
Cheatsheet de GORM en Go

Una colección de snippets de GORM que tengo a mano cuando arranco un proyecto en Go — instalación, modelos, validaciones, relaciones many-to-many, hooks y consultas más comunes.

3 min de lectura
  • go
  • gorm
  • snippets
Ser Tech en Crehana: ¡Falla!, pero aprende rápido

Aprendizajes de mis primeros tres años como Frontend Developer en Crehana — fallar rápido, creer en lo que construyes y por qué las personas son lo más importante.

3 min de lectura
  • culture
  • career
  • crehana
BDD con Ruby on Rails usando RSpec y Capybara

Por qué los tests de controladores muchas veces prueban lo que Rails ya garantiza, y cómo los feature tests con RSpec y Capybara permiten testear lo que el usuario realmente ve.

6 min de lectura
  • ruby
  • rails
  • testing
  • bdd