Help us learn about your current experience with the documentation. Take the survey.

教程:以 SBOM 格式导出依赖项列表

  • Tier: Ultimate
  • Offering: GitLab.com, GitLab Self-Managed, GitLab Dedicated

依赖扫描输出可以导出为 CycloneDX JSON 格式。

本教程将向您展示如何为流水线生成 CycloneDX JSON SBOM,然后将其作为 CI 作业构建产物上传。

开始之前

设置依赖扫描。详细说明请遵循依赖扫描教程

创建配置文件

  1. 创建一个具有 api 范围和 Developer 角色的私有访问令牌。

  2. 将令牌值添加为名为 PRIVATE_TOKEN 的 CI/CD 变量。

  3. 使用以下代码创建一个 代码片段

    Filename: export.sh

    #! /bin/sh
    
    function create_export {
      curl --silent \
      --header "PRIVATE-TOKEN: $PRIVATE_TOKEN" \
      -X 'POST' --data "export_type=sbom" \
      "https://gitlab.com/api/v4/pipelines/$CI_PIPELINE_ID/dependency_list_exports" \
      | jq '.id'
    }
    
    function check_status {
      curl --silent \
        --header "PRIVATE-TOKEN: $PRIVATE_TOKEN" \
        --write-out "%{http_code}" --output /dev/null \
        https://gitlab.com/api/v4/dependency_list_exports/$1
    }
    
    function download {
      curl --header "PRIVATE-TOKEN: $PRIVATE_TOKEN" \
        --output "gl-sbom-merged-$CI_PIPELINE_ID.cdx.json" \
        "https://gitlab.com/api/v4/dependency_list_exports/$1/download"
    }
    
    function export_sbom {
      local ID=$(create_export)
    
      for run in $(seq 0 3); do
        local STATUS=$(check_status $ID)
        # Status is 200 when JSON is generated.
        # Status is 202 when generate JSON job is running.
        if [ $STATUS -eq "200" ]; then
          download $ID
    
          exit 0
        elif [ $STATUS -ne "202" ]; then
          exit 1
        fi
    
        echo "Waiting for JSON to be generated"
        sleep 5
      done
    
      exit 1
    }
    
    export_sbom

    这个 export.sh 脚本按以下步骤工作:

    1. 为当前流水线创建 CycloneDX SBOM 导出。
    2. 检查该导出的状态,并在准备就绪时停止。
    3. 下载 CycloneDX SBOM 文件。
  4. 使用以下代码更新 .gitlab-ci.yml

    export-merged-sbom:
      image: alpine
      before_script:
        - apk add --update jq curl
      stage: .post
      script:
        - |
          curl --header "Authorization: Bearer $PRIVATE_TOKEN" --output export.sh --url "https://gitlab.com/api/v4/snippets/<SNIPPET_ID>/raw"
        - /bin/sh export.sh
      artifacts:
        paths:
          - "gl-sbom-merged-*.cdx.json"
  5. 转到 构建 > 流水线,并确认最新的流水线已成功完成。

在作业构建产物中,应该存在 gl-sbom-merged-<pipeline_id>.cdx.json 文件。