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

Evaluar el cumplimiento de políticas en CI

Tabla de contenidos

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

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

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.