코드 지능 개발 가이드라인

이 문서는 코드 지능 뒤에 있는 디자인을 설명합니다.

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

다음은 LSIF artifact를 업로드하는 순서도입니다:

%%{init: { "fontFamily": "GitLab Sans" }}%% sequenceDiagram accTitle: LSIF artifact 업로드를 위한 순서도 accDescr: Runner, Workhorse, Rails 및 객체 리포지터리가 어떻게 협력하여 artifact를 업로드할 지 설명합니다. 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는 artifact를 업로드할 수 있는지 유효성을 검사하고, 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
       }
       ...
     ]