# Integrar Docker Scout con GitLab CI/CD


Los siguientes ejemplos se ejecutan en GitLab CI en un repositorio que contiene la definición
y el contenido de una imagen de Docker. Activado por un commit, el pipeline construye la
imagen. Si el commit se realizó en la rama predeterminada, utiliza Docker Scout para obtener un
informe de CVEs. Si el commit se realizó en una rama diferente, utiliza Docker Scout para
comparar la nueva versión con la versión publicada actualmente.

## Pasos

Primero, configura el resto del flujo de trabajo. Hay muchos elementos que no son específicos de
Docker Scout pero que son necesarios para crear las imágenes que se van a comparar.

Añade lo siguiente a un archivo `.gitlab-ci.yml` en la raíz de tu repositorio.

```yaml
docker-build:
  image: docker:latest
  stage: build
  services:
    - docker:dind
  before_script:
    - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY

    # Install curl and the Docker Scout CLI
    - |
      apk add --update curl
      curl -sSfL https://raw.githubusercontent.com/docker/scout-cli/main/install.sh | sh -s -- 
      apk del curl 
      rm -rf /var/cache/apk/*
    # Login to Docker Hub required for Docker Scout CLI
    - echo "$DOCKER_HUB_PAT" | docker login -u "$DOCKER_HUB_USER" --password-stdin
```

Esto configura el flujo de trabajo para construir imágenes de Docker con el modo Docker-in-Docker,
ejecutando Docker dentro de un contenedor.

Luego, descarga `curl` y el plugin de la CLI de Docker Scout, e inicia sesión en el registro de Docker
utilizando las variables de entorno definidas en la configuración de tu repositorio.

Añade lo siguiente al archivo YAML:

```yaml
script:
  - |
    if [[ "$CI_COMMIT_BRANCH" == "$CI_DEFAULT_BRANCH" ]]; then
      tag=""
      echo "Running on default branch '$CI_DEFAULT_BRANCH': tag = 'latest'"
    else
      tag=":$CI_COMMIT_REF_SLUG"
      echo "Running on branch '$CI_COMMIT_BRANCH': tag = $tag"
    fi
  - docker build --pull -t "$CI_REGISTRY_IMAGE${tag}" .
  - |
    if [[ "$CI_COMMIT_BRANCH" == "$CI_DEFAULT_BRANCH" ]]; then
      # Get a CVE report for the built image and fail the pipeline when critical or high CVEs are detected
      docker scout cves "$CI_REGISTRY_IMAGE${tag}" --exit-code --only-severity critical,high    
    else
      # Compare image from branch with latest image from the default branch and fail if new critical or high CVEs are detected
      docker scout compare "$CI_REGISTRY_IMAGE${tag}" --to "$CI_REGISTRY_IMAGE:latest" --exit-code --only-severity critical,high --ignore-unchanged
    fi

  - docker push "$CI_REGISTRY_IMAGE${tag}"
```

Esto crea el flujo mencionado anteriormente. Si el commit se realizó en la rama
predeterminada, Docker Scout genera un informe de CVEs. Si el commit se realizó en una
rama diferente, Docker Scout compara la nueva versión con la versión publicada actualmente.
Solo muestra vulnerabilidades de gravedad crítica o alta e ignora aquellas
vulnerabilidades que no han cambiado desde el último análisis.

Añade lo siguiente al archivo YAML:

```yaml
rules:
  - if: $CI_COMMIT_BRANCH
    exists:
      - Dockerfile
```

Estas líneas finales aseguran que el pipeline solo se ejecute si el commit contiene un
Dockerfile y si el commit se realizó en la rama de CI.

## Videotutorial

A continuación, se muestra un videotutorial del proceso de configuración del flujo de trabajo con GitLab.

<iframe class="border-0 w-full aspect-video mb-8" allow="fullscreen" src="https://www.loom.com/embed/451336c4508c42189532108fc37b2560?sid=f912524b-276d-417d-b44a-c2d39719aa1a"></iframe>

