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

Tier: Ultimate Offering: GitLab.com, 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" \
      "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)
        # JSON이 생성되었을 때 상태는 200입니다.
        # JSON 생성 작업이 실행 중일 때 상태는 202입니다.
        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
    

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

    1. 현재 파이프라인에 대한 CycloneDX SBOM 내보내기를 생성합니다.
    2. 해당 내보내기의 상태를 확인하고, 준비가 되면 중지합니다.
    3. CycloneDX SBOM 파일을 다운로드합니다.
  4. 다음 코드로 .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/<스니펫_ID>/raw"
        - /bin/sh export.sh
      artifacts:
        paths:
          - "gl-sbom-merged-*.cdx.json"
    
  5. Build > Pipelines로 이동하여 최신 파이프라인이 성공적으로 완료되었는지 확인하세요.

작업 아티팩트에 gl-sbom-merged-<파이프라인_ID>.cdx.json 파일이 있어야 합니다.