코드 지능 개발 지침

이 문서에서는 코드 지능의 디자인에 대해 설명합니다.

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

다음은 LSIF artifact를 업로드하는 시퀀스 다이어그램입니다:

sequenceDiagram 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 보고서 artifact로 저장되도록 표시됩니다.

  2. Artifact를 저장하기 위한 요청을 받은 후, Workhorse는 GitLab Rails에 업로드를 승인하도록 요청합니다.

  3. GitLab Rails는 업로드가 가능한지를 검증하고, LSIF artifact를 처리할 수 있는 경우 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 artifact로 저장됩니다. Workhorse는 원래의 LSIF 문서를 ZIP artifact의 일련의 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
       }
       ...
     ]