Changelog
Todos los cambios importantes de Acropolis por versión, tomados del CHANGELOG.md del repositorio.
Todos los cambios importantes de Acropolis. El formato sigue Keep a Changelog y el proyecto usa versionado semántico. Desde la 0.1.0, release-plz genera las entradas a partir de los títulos de los PR (Conventional Commits). La fuente es CHANGELOG.md, y los binarios están en la página de releases.
0.3.1 - 2026-10-14
Imágenes
- La capa de
node_modulesya no tiene directorios duplicados: un paquete con dependencias anidadas (node_modules/debug/node_modules/ms,@mastra/core,@types/pgen una app de bun) se escribía como su propio directorio y de nuevo como ancestro del anidado.docker loady el image store de containerd lo aceptan, perodocker pullsobre overlay2 falla conduplicates of file paths not supported. - Los paquetes de bun marcados como
bundled(que vienen dentro del tarball de su padre, comonapi-wasmen@parcel/watcher-wasm) ya no se extraen una segunda vez: cada uno de sus archivos estaba dos veces en la capa. La nueva verificación de capas lo detectó ennode-tanstack-startde Railpack. - Un tarball de paquete que nombra un archivo dos veces (
package/./dist/cjs/index.jsypackage/dist/cjs/index.jsen@rollup/plugin-alias5.1.1, una dependencia de nitropack) lo pone una sola vez en la capa, con el contenido de la última entrada, como pasaría al extraerlo. - Cada capa se verifica mientras se escribe: una ruta que aparece dos veces (archivo, directorio o link) hace fallar el build con exit 70 en vez de producir una imagen que overlay2 rechaza. Las capas cacheadas por la 0.3.0 no se reutilizan (la caché de capas usa la versión como clave).
Seguridad
- rustls 0.23.46 (RUSTSEC-2026-0346, RUSTSEC-2026-0347 y el advisory de descompresión de certificados con Brotli contra la 0.23.45).
Tests
- El e2e verifica que ninguna capa de ninguna imagen (incluidas las capas base) tenga rutas duplicadas, el chequeo que hace
docker pullsobre overlay2, ya que el Docker local usa el image store de containerd.tests/suites/layersbuildea una app de bun y una de npm con una dependencia anidada.
0.3.0 - 2026-10-13
Builds
- Los miembros de un workspace reciben en tiempo de build las devDependencies de los miembros de los que dependen (bun instalaba solo sus dependencies: un
extendsdetsconfighacia un miembro que era devDependency fallaba en Vite y Astro). La imagen de runtime sigue recibiendo solo las dependencies. - Los miembros de workspaces de yarn berry conservan en la imagen el
node_modulesraíz (o los archivos de PnP); quedaban afuera y la app no podía importar sus dependencias del workspace. - Un toolchain de node que instaló primero un plan que pedía menos partes (yarn berry solo toma los headers) ya no se usa para un plan que necesita npm: los install scripts fallaban con
node-gyp: not founden un--homecompartido. - El
node_modulesreutilizado de la caché de una app y las capas denode_modulescacheadas también usan la versión de Acropolis como clave: un plan de instalación más nuevo no reutiliza lo que una versión anterior buildeó a partir del mismo lockfile. - Sin lockfile, las imágenes glibc ya no reciben los builds musl de paquetes nativos (
@next/swc-linux-x64-musl,@img/sharp-libvips-linuxmusl-x64): la metadata abreviada del registry no tienelibc, así que decide el nombre del paquete, como ya pasaba con lockfile. - Sin lockfile, los archivos
package.jsonocupan el lugar del lockfile en los hashes de los pasos: dos apps así en un mismo--home(o una app después de cambiar sus dependencias) reutilizaban la capa denode_modulescacheada de la otra, y corrían con los paquetes equivocados.
Salida
info.jsontienewatchPaths: las rutas del repo, relativas a la raíz del workspace, cuyos cambios pueden cambiar la imagen (el miembro, los miembros del workspace de los que depende, devDependencies incluidas, y el lockfile, elpackage.jsony los archivos de instalación/toolchain de la raíz).["."]cuando Acropolis no puede acotarlo.
Tests
- Nuevas suites: miembros de workspace con un miembro devDependency (bun, pnpm, npm, yarn 1 y berry), los tests de deploy de Next.js (
NEXT_TEST_MODE=deploy, Next 15.5.27 y 16.4.0), TechEmpower FrameworkBenchmarks sin sus Dockerfiles, y las apps de getting-started de Heroku y los samples de Paketo. Los casos e2e pueden buildear un subdirectorio (directory) y correr varios chequeos HTTP contra un mismo contenedor.
Seguridad
- El YAML (
pnpm-lock.yaml,pnpm-workspace.yaml,package.yaml) se parsea conserde_norwayen lugar deserde_yaml, cuyounsafe-libyamlno tiene mantenimiento (RUSTSEC-2024-0449).
0.2.1 - 2026-10-09
Empaquetado
- Imagen del builder ~30 % más liviana para descargar (573 → ~400 MB comprimida para amd64): se eliminan los archivos comprimidos de toolchains que
acropolis prewarmdeja en el store; los builds solo usan los toolchains extraídos.
0.2.0 - 2026-10-09
Seguridad
- Los pasos de build corren bajo un filtro seccomp (sin nuevos namespaces, mounts, ptrace, keyring ni BPF), los pasos de imagen usan
pivot_rooty los pasos de host ven el sistema de archivos en solo lectura, salvo su directorio de trabajo, la caché de su app,/tmpy/var/tmp. - Se rechazan las redirecciones a hosts privados y los downgrades de https a http; el desempaquetado de archivos tiene límites (32 GiB por archivo, 1 GiB por paquete de npm).
- El store detecta blobs truncados por un crash de la máquina.
Builds
- La precedencia de providers coincide con la de Railpack (Go, Rust, Python, Java, … le ganan a un
package.json). - Rust: un toolchain sin versión fijada se sube al
rust-versionmás alto de los crates del lockfile; las apps con sqlx se buildean en el host en vez de dentro de la imagen de rust. - Node: las versiones fijadas de servidores buildeados corren sobre distroless/cc con el
nodedel toolchain de build (imagen web de olimpia-cloud: 84.5 → 57.1 MB). - Reglas de build scripts de pnpm 10, dependencias de miembros de workspaces de bun, checksums de yarn 2.x, capas de
node_modulescon una sola copia. --infoincluyeerrorClassyexitCode; los nombres de archivo que no son UTF-8 fallan temprano con exit 78.
Empaquetado
- Binario de release de 25 MB (ring en vez de aws-lc,
codegen-units = 1); imagen del builder multi-arquitectura (amd64 y arm64). - Documentación en inglés.
0.1.0 - 2026-10-08
Primera versión pública.
Construcción de imágenes
- Un único binario
acropolisconbuild,plan,prewarmycache export|import. Salida a un registry (-t), a un tar OCI que se puede cargar condocker load(--oci) y un resumen en JSON (--info); eventos JSON delimitados por línea con--events json. - Store direccionado por contenido, descargas verificadas por checksum, segmentadas y con duplicación del segmento que se atrasa; la base se copia de registry a registry por digest y las capas nuevas se comprimen en paralelo.
- Pasos de build aislados en namespaces de mount, PID y red; pasos dentro del rootfs de imágenes oficiales con overlayfs (Python, Ruby, PHP, Java, .NET, Elixir).
- Cachés por app que sobreviven a builders efímeros (
acropolis cache export|import).
Ecosistemas
- Node: instalador propio para npm, pnpm, yarn 1 y bun (yarn berry y
bun.lockbcon sus CLI oficiales), hoisting, install scripts,patchedDependenciesde bun y pnpm, filtrado de binarios por plataforma en yarn; Next (standalone forzado, Turbopack), Nuxt, Astro, SvelteKit, Remix, React Router, TanStack Start, Angular, Vite (bundler nativo con Rolldown), Nx y Turborepo. - Go (módulos verificados contra
go.sum,go.work, apps singo.mod), Rust (toolchain desde el manifiesto del canal y crates vendorizados), Python (uv, poetry, pdm, pipenv, pip), Ruby/Rails, PHP/Laravel, Java, .NET, Elixir, Gleam, Deno, C/C++, sitios estáticos y scripts. - Runtimes livianos: distroless para Node, Bun, Go y Rust; imágenes slim oficiales para el resto.
- Compatible con
railpack.jsonyacropolis.json.
Producción
- Configuración del operador (
ACROPOLIS_CACHE_KEY,ACROPOLIS_CACHE_MAX,ACROPOLIS_BUILD_TIMEOUT,ACROPOLIS_STEP_TIMEOUT,ACROPOLIS_BUILD_ID) separada de la de la app. - Endurecimiento de lo que se procesa como root: rutas de lockfile, capas y config validadas, extracción en streaming, límites en logs y cuerpos HTTP, timeout de build por defecto.
- Códigos de salida tipados (0, 1, 70, 75, 78) y una imagen del builder en Debian 12 en
deploy/builder. - Auditoría de seguridad (D22): pasos de host con su propio namespace de PID, sistema de archivos en solo lectura salvo su directorio de trabajo y la caché de su app,
/proc/sysy/sysen solo lectura,/devmínimo y una allowlist de capabilities; lecturas y escrituras del repo confinadas a la app; límites de tamaño en tar, zips de Go, crates y registry; credenciales del registry enviadas solo a su host.--infoincluyeerrorClassyexitCode. - Binario de release sin símbolos (31 MB) y MSRV 1.96.
Verificación
- 154 de 156 casos de los ejemplos de Railpack, 8/8 de la suite de Next.js y 37 de 73 casos de Nixpacks; snapshots de
acropolis plan --jsonentests/plans.