チュートリアル: SBOM形式で依存関係リストをエクスポート
- プラン: Ultimate
- 提供形態: GitLab.com、GitLab Self-Managed、GitLab Dedicated
依存関係スキャンの出力をCycloneDX JSON形式にエクスポートできます。
このチュートリアルでは、パイプラインのCycloneDX JSON SBOMを生成し、それをCIジョブアーティファクトとしてアップロードする方法を説明します。
はじめる前
依存関係スキャンをセットアップします。詳細な手順については、依存関係スキャンのチュートリアルに従ってください。
設定ファイルを作成する
apiスコープとDeveloperロールを持つプライベートアクセストークンを作成します。トークン値を
PRIVATE_TOKENという名前のCI/CD変数として追加します。次のコードでスニペットを作成します。
ファイル名:
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スクリプトは、次の手順で動作します:- 現在のパイプラインのCycloneDX SBOMエクスポートを作成します。
- そのエクスポートのステータスを確認し、準備ができたら停止します。
- CycloneDX SBOMファイルをダウンロードします。
次のコードで
.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"ビルド > パイプラインに移動し、最新のパイプラインが正常に完了したことを確認します。
ジョブアーティファクトでは、gl-sbom-merged-<pipeline_id>.cdx.jsonファイルが存在する必要があります。