# Integrar Docker Scout con GitHub Actions


El siguiente ejemplo muestra cómo configurar un flujo de trabajo de Docker Scout con GitHub
Actions. Activada por una pull request, la acción construye la imagen y utiliza
Docker Scout para comparar la nueva versión con la versión de esa imagen que se está ejecutando en
producción.

Este flujo de trabajo utiliza la GitHub Action
[docker/scout-action](https://github.com/docker/scout-action) para
ejecutar el comando `docker scout compare` y visualizar cómo se comparan las imágenes de la pull request
con la imagen que ejecutas en producción.

## Requisitos previos

- Este ejemplo asume que tienes un repositorio de imágenes existente, en Docker Hub
  o en otro registro, donde hayas habilitado Docker Scout.
- Este ejemplo hace uso de [entornos](/scout/integrations/environment/) para comparar
  la imagen construida en la pull request con una versión diferente de la misma imagen
  en un entorno llamado `production`.

## Pasos

Primero, configura el flujo de trabajo de GitHub Actions para construir una imagen. Esto no es específico
de Docker Scout aquí, pero necesitarás construir una imagen para tener
algo con qué comparar.

Añade lo siguiente a un archivo YAML de GitHub Actions:

```yaml
name: Docker

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

env:
  # Hostname of your registry
  REGISTRY: docker.io
  # Image repository, without hostname and tag
  IMAGE_NAME: ${{ github.repository }}
  SHA: ${{ github.event.pull_request.head.sha || github.event.after }}

jobs:
  build:
    runs-on: ubuntu-latest
    permissions:
      pull-requests: write

    steps:
      # Authenticate to the container registry
      - name: Authenticate to 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

      # Extract metadata (tags, labels) for Docker
      - name: Extract Docker metadata
        id: meta
        uses: docker/metadata-action@v6
        with:
          images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
          labels: |
            org.opencontainers.image.revision=${{ env.SHA }}
          tags: |
            type=edge,branch=$repo.default_branch
            type=semver,pattern=v{{version}}
            type=sha,prefix=,suffix=,format=short

      # Build and push Docker image with Buildx
      # (don't push on PR, load instead)
      - name: Build and push Docker image
        id: build-and-push
        uses: docker/build-push-action@v7
        with:
          sbom: ${{ github.event_name != 'pull_request' }}
          provenance: ${{ github.event_name != 'pull_request' }}
          push: ${{ github.event_name != 'pull_request' }}
          load: ${{ github.event_name == 'pull_request' }}
          tags: ${{ steps.meta.outputs.tags }}
          labels: ${{ steps.meta.outputs.labels }}
          cache-from: type=gha
          cache-to: type=gha,mode=max
```

Esto crea pasos en el flujo de trabajo para:

1. Configurar Docker Buildx.
2. Autenticarse en el registro.
3. Extraer metadatos de la referencia de Git y de los eventos de GitHub.
4. Construir y cargar la imagen de Docker en el registro.

> [!NOTE]
>
> Este flujo de trabajo de CI ejecuta un análisis y evaluación local de tu imagen. Para
> evaluar la imagen localmente, debes asegurarte de que la imagen se cargue en el
> almacenamiento local de imágenes de tu runner.
>
> Esta comparación no funciona si subes la imagen a un registro, o si
> construyes una imagen que no se puede cargar en el almacenamiento de imágenes local del runner. Por
> ejemplo, las imágenes multiplataforma o las imágenes con atestación SBOM o de procedencia
> no se pueden cargar en el almacenamiento local de imágenes.

Con esta configuración lista, puedes añadir los siguientes pasos para ejecutar la
comparación de imágenes:

```yaml
# You can skip this step if Docker Hub is your registry
# and you already authenticated before
- name: Authenticate to Docker
  uses: docker/login-action@v4
  with:
    username: ${{ secrets.DOCKER_USER }}
    password: ${{ secrets.DOCKER_PAT }}

# Compare the image built in the pull request with the one in production
- name: Docker Scout
  id: docker-scout
  if: ${{ github.event_name == 'pull_request' }}
  uses: docker/scout-action@v1
  with:
    command: compare
    image: ${{ steps.meta.outputs.tags }}
    to-env: production
    ignore-unchanged: true
    only-severities: critical,high
    github-token: ${{ secrets.GITHUB_TOKEN }}
```

El comando `compare` analiza la imagen y evalúa el cumplimiento de las políticas, y
cruza los resultados con la imagen correspondiente en el entorno `production`. Este ejemplo solo incluye vulnerabilidades de gravedad crítica y alta, y excluye las vulnerabilidades que existen en ambas imágenes,
mostrando solo lo que ha cambiado.

GitHub Action muestra los resultados de la comparación en un comentario de la pull request de forma
predeterminada.

![Captura de pantalla que muestra los resultados de la salida de Docker Scout en una GitHub Action](/scout/images/gha-output.webp)

Expande la sección **Policies** para ver la diferencia en el cumplimiento de políticas
entre las dos imágenes. Ten en cuenta que, aunque la nueva imagen de este ejemplo no es
completamente conforme, la salida muestra que la situación de la nueva imagen ha
mejorado en comparación con la línea base.

![Salida de evaluación de políticas de GHA](/scout/images/gha-policy-eval.webp)

