튜토리얼: SBOM 형식으로 종속성 목록 내보내기

Tier: Ultimate Offering: GitLab.com, Self-managed, GitLab Dedicated

의존성 스캔 출력물을 CycloneDX JSON 형식으로 내보낼 수 있습니다.

이 튜토리얼에서는 파이프라인을 위한 CycloneDX JSON SBOM을 생성한 다음 CI 작업 artefact로 업로드하는 방법을 보여줍니다.

시작하기 전에

의존성 스캔을 설정합니다. 자세한 지침은 의존성 스캔 튜토리얼을 참고하세요.

구성 파일 생성

  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
    

    위 스크립트는 다음 단계에서 작동합니다:

    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. 빌드 > 파이프라인으로 이동하고 최신 파이프라인이 성공적으로 완료되었는지 확인합니다.

작업 artefact에서 gl-sbom-merged-<pipeline_id>.cdx.json 파일이 있어야 합니다.