正式なドキュメントは英語版であり、この日本語訳はAI支援翻訳により作成された参考用のものです。日本語訳の一部の内容は人間によるレビューがまだ行われていないため、翻訳のタイミングにより英語版との間に差異が生じることがあります。最新かつ正確な情報については、英語版をご参照ください。

チュートリアル: SBOM形式で依存関係リストをエクスポート

  • プラン: Ultimate
  • 提供形態: GitLab.com、GitLab Self-Managed、GitLab Dedicated

依存関係スキャンの出力をCycloneDX JSON形式にエクスポートできます。

このチュートリアルでは、パイプラインのCycloneDX JSON SBOMを生成し、それをCIジョブアーティファクトとしてアップロードする方法を説明します。

はじめる前

依存関係スキャンをセットアップします。詳細な手順については、依存関係スキャンのチュートリアルに従ってください。

設定ファイルを作成する

  1. apiスコープとDeveloperロールを持つプライベートアクセストークンを作成します。

  2. トークン値をPRIVATE_TOKENという名前のCI/CD変数として追加します。

  3. 次のコードでスニペットを作成します。

    ファイル名: 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ファイルが存在する必要があります。