튜토리얼: SBOM 형식으로 의존성 디렉터리 내보내기
Tier: Ultimate
Offering: GitLab.com, Self-Managed형, GitLab Dedicated
의존성 스캔 출력물은 CycloneDX JSON 형식으로 내보낼 수 있습니다.
이 튜토리얼에서는 파이프라인용 CycloneDX JSON SBOM을 생성한 다음 CI 작업 artifact로 업로드하는 방법을 보여줍니다.
시작하기 전에
의존성 스캐닝을 설정합니다. 자세한 지침은 의존성 스캐닝 튜토리얼을 참고하세요.
구성 파일 생성
-
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" \ "http://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 \ http://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" \ "http://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) # 상태가 200이면 JSON이 생성된 것입니다. # 상태가 202이면 JSON 생성 작업이 실행 중입니다. if [ $STATUS -eq "200" ]; then download $ID exit 0 elif [ $STATUS -ne "202" ]; then exit 1 fi echo "JSON 생성 완료 대기 중" sleep 5 done exit 1 } export_sbom
위 스크립트는 다음 단계에서 작동합니다.
- 현재 파이프라인용 CycloneDX SBOM 내보내기를 생성합니다.
- 해당 내보내기의 상태를 확인하고 완료되면 중지합니다.
- CycloneDX SBOM 파일을 다운로드합니다.
-
다음 코드를 사용하여
.gitlab-ci.yml
을 업데이트합니다.export-merged-sbom: 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"
- Build > Pipelines로 이동하여 최신 파이프라인이 성공적으로 완료되었는지 확인합니다.
작업 artifact에서 gl-sbom-merged-<pipeline_id>.cdx.json
파일이 있어야 합니다.