# Evaluar el cumplimiento de políticas en CI


Agregar la evaluación de políticas a tus canalizaciones de integración continua te ayuda
a detectar y prevenir casos en los que los cambios de código provocarían que el cumplimiento de
las políticas empeore en comparación con tu línea de referencia (baseline).

La estrategia recomendada para la evaluación de políticas en un entorno de CI implica
evaluar una imagen local y comparar los resultados con una de referencia. Si el cumplimiento de las
políticas para la imagen local es peor que la de referencia especificada, la ejecución de la CI
falla con un error. Si el cumplimiento de las políticas es mejor o no cambia, la ejecución de la
CI tiene éxito.

Esta comparación es relativa, lo que significa que solo se preocupa por si tu imagen
de CI es mejor o peor que la de referencia. No es una comprobación absoluta para
aprobar o reprobar todas las políticas. Al medir en relación con una línea de referencia que
definas, puedes ver rápidamente si un cambio tiene un impacto positivo o negativo en el cumplimiento
de las políticas.

## Cómo funciona

Cuando realizas la evaluación de políticas en CI, ejecutas una evaluación de política local sobre la
imagen que compilas en tu canalización de CI. Para ejecutar una evaluación local, la imagen que
evalúas debe existir en el almacén de imágenes donde se ejecuta tu flujo de trabajo de CI.
Compila o descarga la imagen y, a continuación, ejecuta la evaluación.

Para ejecutar la evaluación de políticas y activar el fallo si el cumplimiento de tu imagen local
es peor que tu línea de referencia de comparación, debes especificar la versión de la imagen
que se utilizará como referencia. Puedes codificar de forma fija una referencia de imagen específica, pero
una mejor solución es utilizar [entornos](/scout/integrations/environment/)
para inferir automáticamente la versión de la imagen a partir de un entorno. El ejemplo que
sigue utiliza entornos para comparar la imagen de CI con la imagen en el
entorno de `production`.

## Ejemplo

El siguiente ejemplo sobre cómo ejecutar la evaluación de políticas en CI utiliza la [Docker
Scout GitHub Action](https://github.com/marketplace/actions/docker-scout) para
ejecutar el comando `compare` en una imagen compilada en CI. El comando compare tiene
una entrada `to-env`, que ejecutará la comparación frente a un entorno llamado
`production`. La entrada `exit-on` está configurada como `policy`, lo que significa que la
comparación falla únicamente si el cumplimiento de la política ha empeorado.

Este ejemplo no asume que estés utilizando Docker Hub como tu registro de
contenedores. Como resultado, este flujo de trabajo utiliza la acción `docker/login-action` dos veces:

- Una vez para autenticarte en tu registro de contenedores.
- Una vez más para autenticarte en Docker para descargar los resultados del análisis de tu
  imagen de `production`.

Si utilizas Docker Hub como tu registro de contenedores, solo necesitas autenticarte
una vez.

> [!NOTE]
>
> Debido a una limitación en Docker Engine, no se admite la carga de imágenes multiplataforma
> o imágenes con atestaciones en el almacén de imágenes.
>
> Para que la evaluación de políticas funcione, debes cargar la imagen en el almacén de imágenes
> local del runner. Asegúrate de estar compilando una imagen de una sola plataforma
> sin atestaciones y de estar cargando los resultados de la compilación. De lo contrario,
> la evaluación de políticas fallará.

Ten en cuenta también el permiso `pull-requests: write` para el trabajo (job). La Docker Scout
GitHub Action agrega un comentario en la pull request con los resultados de la evaluación
de forma predeterminada, lo que requiere este permiso. Para obtener más detalles, consulta
[Pull Request Comments](https://github.com/docker/scout-action#pull-request-comments).

```yaml
name: Docker

on:
  push:
    tags: ["*"]
    branches:
      - "main"
  pull_request:
    branches: ["**"]

env:
  REGISTRY: docker.io
  IMAGE_NAME: <IMAGE_NAME>
  DOCKER_ORG: <ORG>

jobs:
  build:
    permissions:
      pull-requests: write

    runs-on: ubuntu-latest
    steps:
      - name: Log into registry ${{ env.REGISTRY }}
        uses: docker/login-action@v4
        with:
          registry: ${{ env.REGISTRY }}
          username: ${{ secrets.REGISTRY_USER }}
          password: ${{ secrets.REGISTRY_TOKEN }}

      - name: Setup Docker buildx
        uses: docker/setup-buildx-action@v4

      - name: Extract metadata
        id: meta
        uses: docker/metadata-action@v6
        with:
          images: ${{ env.IMAGE_NAME }}

      - name: Build image
        id: build-and-push
        uses: docker/build-push-action@v7
        with:
          tags: ${{ steps.meta.outputs.tags }}
          labels: ${{ steps.meta.outputs.labels }}
          sbom: ${{ github.event_name != 'pull_request' }}
          provenance: ${{ github.event_name != 'pull_request' }}
          push: ${{ github.event_name != 'pull_request' }}
          load: ${{ github.event_name == 'pull_request' }}

      - name: Authenticate with Docker
        uses: docker/login-action@v4
        with:
          username: ${{ secrets.DOCKER_USER }}
          password: ${{ secrets.DOCKER_PAT }}

      - name: Compare
        if: ${{ github.event_name == 'pull_request' }}
        uses: docker/scout-action@v1
        with:
          command: compare
          image: ${{ steps.meta.outputs.tags }}
          to-env: production
          platform: "linux/amd64"
          ignore-unchanged: true
          only-severities: critical,high
          organization: ${{ env.DOCKER_ORG }}
          exit-on: policy
```

La siguiente captura de pantalla muestra cómo se ve el comentario de la PR de GitHub cuando
falla una comprobación de evaluación de política porque la política ha empeorado en la imagen
de la PR en comparación con la de referencia.

![Comentario de evaluación de política en GitHub PR](/scout/images/scout-policy-eval-ci.webp)

Este ejemplo ha demostrado cómo ejecutar la evaluación de políticas en CI con GitHub
Actions. Docker Scout también es compatible con otras plataformas de CI. Para obtener más
información, consulta las [integraciones de CI de Docker
Scout](/scout/integrations/#integracion-continua-ci).

