⚠️ Traduction non officielle - Cette documentation est une traduction communautaire non officielle de Docker.

Intégrer Docker Scout avec GitHub Actions

Table des matières

L'exemple suivant montre comment configurer un workflow Docker Scout avec GitHub Actions. Déclenché par une pull request, l'action construit l'image et utilise Docker Scout pour comparer la nouvelle version à la version de cette image en cours d'exécution en production.

Ce workflow utilise l'Action GitHub docker/scout-action pour exécuter la commande docker scout compare pour visualiser comment les images des pull requests se comparent à l'image que vous exécutez en production.

Prérequis

  • Cet exemple suppose que vous avez un dépôt d'images existant, dans Docker Hub ou dans un autre registre, où vous avez activé Docker Scout.
  • Cet exemple utilise les environnements, pour comparer l'image construite dans la pull request avec une version différente de la même image dans un environnement appelé production.

Étapes

D'abord, configurez le workflow GitHub Action pour construire une image. Ceci n'est pas spécifique à Docker Scout ici, mais vous devrez construire une image pour avoir quelque chose à comparer.

Ajoutez ce qui suit à un fichier YAML GitHub Actions :

name: Docker

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

env:
  # Nom d'hôte de votre registre
  REGISTRY: docker.io
  # Dépôt d'images, sans nom d'hôte et 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:
      # S'authentifier auprès du registre de conteneurs
      - name: Authenticate to registry ${{ env.REGISTRY }}
        uses: docker/login-action@v3
        with:
          registry: ${{ env.REGISTRY }}
          username: ${{ secrets.REGISTRY_USER }}
          password: ${{ secrets.REGISTRY_TOKEN }}
      
      - name: Setup Docker buildx
        uses: docker/setup-buildx-action@v3

      # Extraire les métadonnées (tags, labels) pour Docker
      - name: Extract Docker metadata
        id: meta
        uses: docker/metadata-action@v5
        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

      # Construire et pousser l'image Docker avec Buildx
      # (ne pas pousser sur PR, charger à la place)
      - name: Build and push Docker image
        id: build-and-push
        uses: docker/build-push-action@v6
        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

Ceci crée des étapes de workflow pour :

  1. Configurer Docker buildx.
  2. S'authentifier auprès du registre.
  3. Extraire les métadonnées de la référence Git et des événements GitHub.
  4. Construire et pousser l'image Docker vers le registre.
Note

Ce workflow CI exécute une analyse et évaluation locale de votre image. Pour évaluer l'image localement, vous devez vous assurer que l'image est chargée dans le magasin d'images local de votre runner.

Cette comparaison ne fonctionne pas si vous poussez l'image vers un registre, ou si vous construisez une image qui ne peut pas être chargée dans le magasin d'images local du runner. Par exemple, les images multi-plateformes ou les images avec attestation SBOM ou de provenance ne peuvent pas être chargées dans le magasin d'images local.

Avec cette configuration terminée, vous pouvez ajouter les étapes suivantes pour exécuter la comparaison d'images :

      # Vous pouvez ignorer cette étape si Docker Hub est votre registre
      # et que vous vous êtes déjà authentifié avant
      - name: Authenticate to Docker
        uses: docker/login-action@v3
        with:
          username: ${{ secrets.DOCKER_USER }}
          password: ${{ secrets.DOCKER_PAT }}

      # Comparer l'image construite dans la pull request avec celle en 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 }}

La commande compare analyse l'image et évalue la conformité des politiques, et croise les résultats avec l'image correspondante dans l'environnement production. Cet exemple inclut seulement les vulnérabilités de gravité critique et élevée, et exclut les vulnérabilités qui existent dans les deux images, montrant seulement ce qui a changé.

L'Action GitHub affiche les résultats de comparaison dans un commentaire de pull request par défaut.

Une capture d'écran montrant les résultats de la sortie Docker Scout dans une GitHub Action

Développez la section Politiques pour voir la différence de conformité des politiques entre les deux images. Notez que bien que la nouvelle image dans cet exemple ne soit pas entièrement conforme, la sortie montre que la position de la nouvelle image s'est améliorée comparée à la ligne de base.

Sortie d'évaluation de politique GHA