02. I. Código base

Por: Artiko
12factorcodebasegitcontrol-de-versiones

02. I. Código base

Un código base bajo control de versiones, con múltiples despliegues.

La regla: uno a uno

Una aplicación twelve-factor siempre se rastrea en un sistema de control de versiones (Git, Mercurial, Subversion). Existe una relación uno a uno entre el código base y la aplicación:

  • Si hay un código base → hay una aplicación (con múltiples despliegues posibles).
  • Si hay varios códigos base → no es una aplicación, es un sistema distribuido. Cada componente de ese sistema es su propia app y debe cumplir los 12 factores de forma independiente.
flowchart LR
    subgraph App["Una aplicación"]
        Repo["Repositorio único"]
        Dev["Despliegue: dev"]
        Staging["Despliegue: staging"]
        Prod["Despliegue: producción"]
        Repo --> Dev
        Repo --> Staging
        Repo --> Prod
    end

Código compartido = extraerlo a librería

Si dos aplicaciones necesitan el mismo código, la solución no es compartir un repositorio entre ellas ni copiar/pegar archivos. La solución correcta es extraer ese código a una librería independiente, declararla como dependencia (ver Factor II) y versionarla con su propio changelog.

Esto evita el anti-patrón de “monolito distribuido”: varias apps que en realidad comparten estado y ciclo de vida a través de código copiado, pero se despliegan como si fueran independientes.

Despliegues múltiples, mismo código base

Un único código base puede tener muchos despliegues corriendo simultáneamente:

  • El entorno de producción.
  • Uno o varios entornos de staging/QA.
  • El entorno local de cada desarrollador.

Todos ellos identifican la misma aplicación, aunque no necesariamente ejecuten exactamente el mismo commit en un momento dado — es normal que staging tenga cambios que todavía no llegaron a producción. Lo que los une no es “correr el mismo código en este instante”, sino compartir el mismo origen histórico.

Checklist del factor I

  • La aplicación vive en un único repositorio de control de versiones.
  • No hay código copiado/pegado entre este repo y otro: lo compartido está extraído a una librería versionada.
  • Puedo nombrar todos los despliegues activos de este código base (dev, staging, prod, …) sin ambigüedad.
  • Un sistema con varios repos independientes está tratado explícitamente como varias aplicaciones, cada una con sus propios 12 factores.

El siguiente factor, Dependencias, define cómo cada despliegue instala exactamente lo que necesita sin asumir nada del sistema anfitrión.