> For the complete documentation index, see [llms.txt](https://stablebuild.gitbook.io/stablebuild-documentation/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://stablebuild.gitbook.io/stablebuild-documentation/docs/fr/product/sbom.md).

# Nomenclature logicielle (SBOM)

StableBuild peut générer une nomenclature logicielle (SBOM, Software Bill of Materials) pour chacun de vos builds. La SBOM liste chaque image Docker, paquet OS, paquet Python et fichier que le build a récupéré via StableBuild, avec sa version exacte et son SHA-256. C'est un document JSON au format [CycloneDX 1.7](https://cyclonedx.org/docs/1.7/json/), que vous pouvez donc importer dans l'outil de conformité de votre choix.

{% hint style="info" %}
La SBOM est disponible avec le forfait Enterprise. Si cela vous intéresse, faites-le nous savoir à <support@stablebuild.com>.
{% endhint %}

Comme toutes les dépendances sont distribuées par StableBuild, la SBOM enregistre tout ce que votre process de build a téléchargé, et non ce qu'un scanner déduit de l'image finale.

### Enregistrer les téléchargements d'un build

Pour indiquer à StableBuild à quel build appartient un téléchargement, ajoutez `--` et un identifiant de build (une chaîne de votre choix) après votre clé d'API dans l'URL du miroir. Par exemple, `your-prefix.pypimirror.stablebuild.com` devient `your-prefix--build-1234.pypimirror.stablebuild.com`. Cela fonctionne avec tous les miroirs, et vous pouvez utiliser le même identifiant de build d'un miroir à l'autre :

{% code overflow="wrap" %}

```docker
FROM your-prefix--build-1234.dockermirror.stablebuild.com/python:3.12-slim

ARG SB_API_KEY=your-prefix--build-1234
ARG APT_PIN_DATE=2026-09-29T08:40:01Z

COPY ./sb-apt.sh /opt/sb-apt.sh
RUN bash /opt/sb-apt.sh load-apt-sources debian
RUN apt update && apt install -y curl

RUN pip install -i https://your-prefix--build-1234.pypimirror.stablebuild.com/2026-09-01/ requests==2.32.3

RUN curl -O "https://your-prefix--build-1234.httpcache.stablebuild.com/my-cache-key/https://bootstrap.pypa.io/get-pip.py"
```

{% endcode %}

Tout le reste du fonctionnement des miroirs est inchangé : vos dates d'épinglage, vos clés de cache et vos fichiers en cache restent les mêmes lorsque vous ajoutez un identifiant de build. Les téléchargements sans identifiant de build ne sont pas enregistrés dans une SBOM.

#### Utiliser un identifiant de build unique en CI

Donnez à chaque exécution de CI son propre identifiant de build, pour que chaque SBOM décrive exactement un build. Dans un Dockerfile, vous pouvez le passer en argument de build :

{% code overflow="wrap" %}

```docker
ARG BUILD_ID
FROM your-prefix--${BUILD_ID}.dockermirror.stablebuild.com/python:3.12-slim

ARG BUILD_ID
RUN pip install -i https://your-prefix--${BUILD_ID}.pypimirror.stablebuild.com/2026-09-01/ requests==2.32.3
```

{% endcode %}

Puis définissez-le depuis votre système de CI, par exemple dans GitHub Actions :

```yaml
- name: Build container
  run: docker build --build-arg BUILD_ID=gh-${{ github.run_id }} .
```

{% hint style="info" %}
L'identifiant de build fait partie d'un nom d'hôte : il ne peut donc contenir que des lettres minuscules, des chiffres et des tirets (`-`). Votre clé d'API, `--` et l'identifiant de build ne doivent pas dépasser 63 caractères au total.
{% endhint %}

### Générer une SBOM

1. Ouvrez le [tableau de bord](https://dashboard.stablebuild.com) et cliquez sur **Rapports > SBOM**.
2. Sélectionnez l'un de vos builds récents, ou saisissez un identifiant de build.
3. Cliquez sur **Générer la SBOM**. Votre navigateur télécharge la SBOM sous le nom `sbom-<identifiant de build>.cdx.json`.

<figure><img src="https://3692775141-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fq2rcaL74coCkWoi6NPK7%2Fuploads%2Fgit-blob-66985259fbbc546b6502aec33eab9dc5422092a2%2Fsbom-page.png?alt=media" alt=""><figcaption><p>Générer la SBOM d'un build</p></figcaption></figure>

### Contenu du SBOM

Chaque artefact devient un composant CycloneDX doté d'une [URL de paquet (purl)](https://github.com/package-url/purl-spec) :

| Miroir              | Type de composant | Exemple de purl                                                | Empreinte SHA-256 |
| ------------------- | ----------------- | -------------------------------------------------------------- | ----------------- |
| Miroir Docker       | `container`       | `pkg:docker/library/python@sha256:f77ac9e4…`                   | Oui               |
| Dépôt de paquets OS | `library`         | `pkg:deb/ubuntu/curl@7.81.0-1?arch=amd64`, `pkg:apk/alpine/…`  | Oui               |
| Miroir PyPI         | `library`         | `pkg:pypi/requests@2.32.3`                                     | Oui               |
| Miroir de fichiers  | `file`            | `pkg:generic/get-pip.py?download_url=https%3A%2F%2Fbootstrap…` | Non               |

Voici, par exemple, un extrait d'une SBOM :

{% code overflow="wrap" %}

```json
{
  "bomFormat": "CycloneDX",
  "specVersion": "1.7",
  "serialNumber": "urn:uuid:dc670615-4035-453f-8cf3-fbdbffb1328d",
  "version": 1,
  "metadata": {
    "timestamp": "2026-09-30T02:37:08.754Z",
    "properties": [
      { "name": "stablebuild:build-id", "value": "build-1234" },
      { "name": "stablebuild:coverage", "value": "Lists only the artifacts this build fetched through StableBuild." }
    ]
  },
  "components": [
    {
      "type": "container",
      "bom-ref": "pkg:docker/library/python@sha256:f77ac9e44ae96ef2c90b8053ea08c31f8be030f824196b0ae4db6d462c84e51f",
      "name": "library/python",
      "purl": "pkg:docker/library/python@sha256:f77ac9e44ae96ef2c90b8053ea08c31f8be030f824196b0ae4db6d462c84e51f",
      "hashes": [ { "alg": "SHA-256", "content": "f77ac9e44ae96ef2c90b8053ea08c31f8be030f824196b0ae4db6d462c84e51f" } ]
    },
    {
      "type": "library",
      "bom-ref": "2026-09-29T08:40:01Z/archive.ubuntu.com/ubuntu/pool/main/c/curl/curl_7.81.0-1_amd64.deb",
      "name": "curl",
      "version": "7.81.0-1",
      "purl": "pkg:deb/ubuntu/curl@7.81.0-1?arch=amd64",
      "hashes": [ { "alg": "SHA-256", "content": "db4d0fbae50d3bb80754342615e242c73460dc5d59bdd41f08de19b26472d821" } ]
    },
    {
      "type": "library",
      "bom-ref": "2026-09-01/requests/requests-2.32.3-py3-none-any.whl",
      "name": "requests",
      "version": "2.32.3",
      "purl": "pkg:pypi/requests@2.32.3",
      "hashes": [ { "alg": "SHA-256", "content": "70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6" } ]
    },
    {
      "type": "file",
      "bom-ref": "https://bootstrap.pypa.io/get-pip.py",
      "name": "get-pip.py",
      "purl": "pkg:generic/get-pip.py?download_url=https%3A%2F%2Fbootstrap.pypa.io%2Fget-pip.py"
    }
  ]
}
```

{% endcode %}
