Compartir comentarios
Las respuestas se generan en base a la documentación.

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:

Dockerfile.rego
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_:

Dockerfile_test.rego
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:

Dockerfile.rego
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:

Dockerfile_test.rego
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.rego

Ejecuta todas las pruebas:

$ docker buildx policy test .

O prueba archivos específicos:

$ docker buildx policy test tests/registries_test.rego