코드 인텔리전스 개발 가이드라인

이 문서는 코드 인텔리전스의 디자인을 설명합니다.

GitLab의 내장 코드 인텔리전스는 LSIF에 의해 제공되며, CI 작업에서 프로젝트에 대한 LSIF 문서를 생성하고, 데이터를 처리하고, 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)의 문서를 생성합니다. 이 형식은 method 또는 function과 그 정의 또는 참조 간의 상호작용을 설명합니다. 문서는 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
       }
       ...
     ]