Producción
Un build por contenedor, la imagen del builder, privilegios, red, cachés y cómo tiene que reaccionar una plataforma a cada código de salida.
Un build por contenedor
Acropolis corre como root porque usa namespaces de mount y de PID, y overlayfs. El sandbox del build no es un límite de VM: para builds de clientes distintos, usá un contenedor (o una VM) descartable por build.
La imagen del builder está hecha para esto. Necesita CAP_SYS_ADMIN y ningún perfil de seccomp o AppArmor que bloquee mount/unshare. --privileged funciona; también --cap-add SYS_ADMIN --security-opt seccomp=unconfined --security-opt apparmor=unconfined. /var/lib/acropolis/work no puede estar sobre overlayfs: la imagen lo declara como VOLUME, y en otros runtimes ahí hace falta un volumen, un emptyDir o un tmpfs.
El contrato para una plataforma
ACROPOLIS_BUILD_ID=<deploy id> ACROPOLIS_CACHE_KEY=<app id> ACROPOLIS_BUILD_TIMEOUT=1800 \
acropolis --events json build "/src/$ROOT_DIR" -e KEY=VALUE... --oci /out/image.tar --info /out/info.json
- Configuración. La configuración del operador sale del entorno del proceso; las variables del cliente van por
-e. Mirá Configuración. - Salida.
--ociescribe un tar que aceptanregctl image import,skopeoodocker load;-tlo sube a un registry. Las capas van en zstd por defecto. - Logs.
--events jsonimprime un evento JSON por línea de stderr, y termina conbuild_failedsi falla. Mirá eventos. - Códigos de salida.
1: mostrá el log, no reintentes.75: reintentá una vez.78: pasá a otro builder o mostrá el error.70: pasá a otro builder y reportalo. Mirá códigos de salida. - Cachés.
acropolis cache importantes del build yacropolis cache exportdespués, con el mismoACROPOLIS_CACHE_KEY. - Watch paths.
info.jsontienewatchPaths, las rutas del repo cuyos cambios pueden cambiar la imagen (para un miembro de un workspace: el miembro, los miembros de los que depende, y el lockfile y los archivos de instalación de la raíz). Vale["."]cuando Acropolis no puede acotarlo.
Red
Los pasos del build con red (instalaciones con scripts, next build) pueden llegar a cualquier host al que llegue el contenedor. Bloqueá el endpoint de metadata de la nube (169.254.169.254) y las redes internas desde fuera del contenedor. Acropolis solo rechaza registries privados y http:// para lo que descarga él mismo (ACROPOLIS_ALLOW_PRIVATE_REGISTRY=1 los permite).
Apps con Dockerfile
Los builds con Dockerfile siguen en BuildKit. Para servir los dos desde una sola imagen, extendé la imagen del builder con BuildKit y sobrescribí el entrypoint, como se explica en deploy/builder.