코드 지능 개발 지침

이 문서는 코드 지능에 대한 설계를 설명합니다.

GitLab의 내장 코드 지능은 LSIF를 기반으로 하며, 프로젝트의 LSIF 문서를 CI 작업에서 생성하고 데이터를 처리한 후 CI 아티팩트로 업로드하여 프로젝트 파일에 대한 정보를 표시하는 것으로 이어집니다.

다음은 LSIF 아티팩트를 업로드하는 시퀀스 다이어그램입니다.

%%{init: { "fontFamily": "GitLab Sans" }}%% sequenceDiagram accTitle: LSIF 아티팩트 업로드를 위한 시퀀스 다이어그램 accDescr: Runner, Workhorse, Rails 및 객체 저장소가 함께 작업하여 아티팩트를 업로드하는 프로세스입니다. participant Runner participant Workhorse participant Rails participant Object Storage Runner->>+Workhorse: POST /v4/jobs/:id/artifacts Workhorse->>+Rails: POST /:id/artifacts/authorize Rails-->>-Workhorse: ProcessLsif 헤더로 응답 Note right of Workhorse: LSIF 파일 처리 Workhorse->>+Object Storage: 파일 추가 Object Storage-->>-Workhorse: 결과 요청 Workhorse->>+Rails: POST /:id/artifacts Rails-->>-Workhorse: 결과 요청 Workhorse-->>-Runner: 결과 요청
  1. CI/CD 작업은 프로젝트의 언어에 대한 색인기를 사용하여 LSIF 형식의 문서(일반적으로 dump.lsif)를 생성합니다. 이 형식은 메서드 또는 함수와 해당 정의 또는 참조 사이의 상호 작용을 설명합니다. 이 문서는 LSIF 보고서 아티팩트로 저장되기로 표시됩니다.

  2. 아티팩트 저장 요청을 받은 후, Workhorse는 아티팩트 업로드를 위해 GitLab Rails에 권한을 요청합니다.

  3. GitLab Rails는 아티팩트를 업로드할 수 있는지를 검증하고, LSIF 아티팩트를 처리할 수 있는 경우 ProcessLsif: true 헤더를 보냅니다.

  4. Workhorse는 LSIF 문서를 한 줄씩 읽고, 프로젝트의 각 파일에 대한 코드 지능 데이터를 생성합니다. 출력물은 프로젝트 구조를 모방하는 JSON 파일들의 압축된 디렉토리입니다:

    프로젝트:

    app
      controllers
        application_controller.rb
      models
        application.rb

    생성된 데이터:

    app
      controllers
        application_controller.rb.json
      models
        application.rb.json
  5. 압축된 디렉토리가 ZIP 아티팩트로 저장됩니다. Workhorse는 원본 LSIF 문서를 ZIP 아티팩트의 일련의 JSON 파일로 대체하고, 이에 대한 메타데이터를 생성합니다. 메타데이터를 통해 전체 파일을 압축 해제하거나 로드하지 않고도 ZIP 파일 내의 단일 파일을 볼 수 있습니다. 이를 통해 단일 파일에 대한 코드 지능 데이터에 액세스할 수 있습니다.

  6. GitLab 애플리케이션에서 파일을 보는 경우, 프론트엔드는 해당 파일에 대한 코드 지능 데이터를 객체 저장소에서 직접 가져옵니다. 이 파일은 파일 내의 코드 단위에 대한 정보를 포함합니다. 예를 들어:

    [
        {
         "definition_path": "cmd/check/main.go#L4",
         "hover": [
             {
                 "language": "go",
                 "tokens": [
                     [
                         {
                             "class": "kn",
                             "value": "package"
                         },
                         {
                             "value": " "
                         },
                         {
                             "class": "s",
                             "value": "\"fmt\""
                         }
                     ]
                 ]
             },
             {
                 "value": "Package fmt implements formatted I/O with functions analogous to C's printf and scanf.  The format 'verbs' are derived from C's but are simpler. \n\n### hdr-PrintingPrinting\nThe verbs: \n\nGeneral: \n\n```\n%v\tthe value in a default format\n\twhen printing st..."
             }
         ],
         "start_char": 2,
         "start_line": 33
       }
       ...
     ]