Probar políticas de compilación
El comando
docker buildx policy test
ejecuta pruebas unitarias para políticas de compilación utilizando el marco de
pruebas estándar de OPA.
$ docker buildx policy test <ruta>
Esto valida la lógica de la política con entradas simuladas (mocked).
Para realizar pruebas con fuentes reales (metadatos de imágenes reales, repositorios
de Git), utiliza
docker buildx policy eval en su lugar.
Puedes usar la opción eval --print para resolver la entrada de una fuente específica
al escribir un caso de prueba.
Ejemplo básico
Comienza con una política simple que solo permita imágenes de alpine:
package docker
default allow = false
allow if {
input.image.repo == "alpine"
}
decision := {"allow": allow}Crea un archivo de prueba con el sufijo *_test.rego. Las funciones de prueba deben
comenzar con test_:
package docker
test_alpine_allowed if {
decision.allow with input as {"image": {"repo": "alpine"}}
}
test_ubuntu_denied if {
not decision.allow with input as {"image": {"repo": "ubuntu"}}
}Ejecuta las pruebas:
$ docker buildx policy test .
test_alpine_allowed: PASS (allow=true)
test_ubuntu_denied: PASS (allow=false)
PASS indica que las pruebas definidas en Dockerfile_test.rego se ejecutaron con
éxito y se cumplieron todas las aserciones.
Opciones del comando
Filtra las pruebas por nombre con --run:
$ docker buildx policy test --run alpine .
test_alpine_allowed: PASS (allow=true)
Prueba políticas con nombres de archivo no predeterminados utilizando --filename:
$ docker buildx policy test --filename app.Dockerfile .
Esto carga app.Dockerfile.rego y ejecuta los archivos *_test.rego con él.
Salida de pruebas
Las pruebas aprobadas muestran el estado de permiso y cualquier mensaje de denegación:
test_alpine_allowed: PASS (allow=true)
test_ubuntu_denied: PASS (allow=false, deny_msg=only alpine images are allowed)
Las pruebas fallidas muestran la entrada, la salida de la decisión y los campos que faltan:
test_invalid: FAIL (allow=false)
input:
{
"image": {}
}
decision:
{
"allow": false,
"deny_msg": [
"only alpine images are allowed"
]
}
missing_input: input.image.repo
Probar mensajes de denegación
Para probar mensajes de error personalizados, captura el resultado completo de la
decisión y realiza la aserción sobre el campo deny_msg.
Para una política con mensajes de denegación:
package docker
default allow = false
allow if {
input.image.repo == "alpine"
}
deny_msg contains msg if {
not allow
msg := "only alpine images are allowed"
}
decision := {"allow": allow, "deny_msg": deny_msg}Prueba el mensaje de denegación:
test_deny_message if {
result := decision with input as {"image": {"repo": "ubuntu"}}
not result.allow
"only alpine images are allowed" in result.deny_msg
}Patrones de prueba
Probar reglas específicas de entorno:
test_production_requires_digest if {
decision.allow with input as {
"env": {"target": "production"},
"image": {"isCanonical": true}
}
}
test_development_allows_tags if {
decision.allow with input as {
"env": {"target": "development"},
"image": {"isCanonical": false}
}
}Probar múltiples registros:
test_dockerhub_allowed if {
decision.allow with input as {
"image": {
"ref": "docker.io/library/alpine",
"host": "docker.io",
"repo": "alpine"
}
}
}
test_ghcr_allowed if {
decision.allow with input as {
"image": {
"ref": "ghcr.io/myorg/myapp",
"host": "ghcr.io",
"repo": "myorg/myapp"
}
}
}Para conocer los campos de entrada disponibles, consulta la Referencia de inputs.
Organizar archivos de prueba
El ejecutor de pruebas busca todos los archivos *_test.rego de forma recursiva:
build-policies/
├── Dockerfile.rego
├── Dockerfile_test.rego
└── tests/
├── registries_test.rego
├── signatures_test.rego
└── environments_test.regoEjecuta todas las pruebas:
$ docker buildx policy test .
O prueba archivos específicos:
$ docker buildx policy test tests/registries_test.rego