InfoGrab DocsInfoGrab Docs

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

요약

이 문서는 코드 인텔리전스의 설계를 설명합니다. GitLab에 내장된 코드 인텔리전스는 LSIF를 기반으로 동작하며, CI job에서 프로젝트의 LSIF 문서를 생성하고, 데이터를 처리한 뒤 CI 아티팩트로 업로드하여 프로젝트 파일에 해당 정보를 표시하는 방식으로 구현됩니다.

이 문서는 코드 인텔리전스의 설계를 설명합니다.

GitLab에 내장된 코드 인텔리전스는 LSIF를 기반으로 동작하며, CI job에서 프로젝트의 LSIF 문서를 생성하고, 데이터를 처리한 뒤 CI 아티팩트로 업로드하여 프로젝트 파일에 해당 정보를 표시하는 방식으로 구현됩니다.

다음은 LSIF 아티팩트 업로드에 대한 시퀀스 다이어그램입니다:

%%{init: { "fontFamily": "GitLab Sans" }}%% sequenceDiagram accTitle: Sequence diagram for LSIF artifact uploads accDescr: The process of how Runner, Workhorse, Rails, and object storage work together to upload an 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: Respond with ProcessLsif header
Note right of Workhorse: Process LSIF file
Workhorse->>+Object Storage: Put file
Object Storage-->>-Workhorse: request results
Workhorse->>+Rails: POST /:id/artifacts
Rails-->>-Workhorse: request results
Workhorse-->>-Runner: request results
  • CI/CD job은 프로젝트 언어에 맞는 인덱서를 사용하여 LSIF 형식의 문서(보통 dump.lsif)를 생성합니다. 이 형식은 메서드 또는 함수와 해당 정의(definition) 또는 참조(reference) 간의 상호 작용을 설명합니다. 해당 문서는 LSIF 리포트 아티팩트로 저장되도록 표시됩니다.

  • 아티팩트 저장 요청을 수신한 후, Workhorse는 GitLab Rails에 업로드 인가를 요청합니다.

  • GitLab Rails는 아티팩트가 업로드될 수 있는지 유효성을 검사하고, LSIF 아티팩트를 처리할 수 있는 경우 ProcessLsif: true 헤더를 전송합니다.

  • Workhorse는 LSIF 문서를 한 줄씩 읽어 프로젝트의 각 파일에 대한 코드 인텔리전스 데이터를 생성합니다. 출력 결과는 프로젝트 구조를 모방한 JSON 파일들의 압축(zip) 디렉터리입니다:

프로젝트:

app
  controllers
    application_controller.rb
  models
    application.rb

생성된 데이터:

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

  • 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
   }
   ...
 ]

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

GitLab v19.1
원문 보기
요약

이 문서는 코드 인텔리전스의 설계를 설명합니다. GitLab에 내장된 코드 인텔리전스는 LSIF를 기반으로 동작하며, CI job에서 프로젝트의 LSIF 문서를 생성하고, 데이터를 처리한 뒤 CI 아티팩트로 업로드하여 프로젝트 파일에 해당 정보를 표시하는 방식으로 구현됩니다.

이 문서는 코드 인텔리전스의 설계를 설명합니다.

GitLab에 내장된 코드 인텔리전스는 LSIF를 기반으로 동작하며, CI job에서 프로젝트의 LSIF 문서를 생성하고, 데이터를 처리한 뒤 CI 아티팩트로 업로드하여 프로젝트 파일에 해당 정보를 표시하는 방식으로 구현됩니다.

다음은 LSIF 아티팩트 업로드에 대한 시퀀스 다이어그램입니다:

%%{init: { "fontFamily": "GitLab Sans" }}%% sequenceDiagram accTitle: Sequence diagram for LSIF artifact uploads accDescr: The process of how Runner, Workhorse, Rails, and object storage work together to upload an 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: Respond with ProcessLsif header
Note right of Workhorse: Process LSIF file
Workhorse->>+Object Storage: Put file
Object Storage-->>-Workhorse: request results
Workhorse->>+Rails: POST /:id/artifacts
Rails-->>-Workhorse: request results
Workhorse-->>-Runner: request results
  • CI/CD job은 프로젝트 언어에 맞는 인덱서를 사용하여 LSIF 형식의 문서(보통 dump.lsif)를 생성합니다. 이 형식은 메서드 또는 함수와 해당 정의(definition) 또는 참조(reference) 간의 상호 작용을 설명합니다. 해당 문서는 LSIF 리포트 아티팩트로 저장되도록 표시됩니다.

  • 아티팩트 저장 요청을 수신한 후, Workhorse는 GitLab Rails에 업로드 인가를 요청합니다.

  • GitLab Rails는 아티팩트가 업로드될 수 있는지 유효성을 검사하고, LSIF 아티팩트를 처리할 수 있는 경우 ProcessLsif: true 헤더를 전송합니다.

  • Workhorse는 LSIF 문서를 한 줄씩 읽어 프로젝트의 각 파일에 대한 코드 인텔리전스 데이터를 생성합니다. 출력 결과는 프로젝트 구조를 모방한 JSON 파일들의 압축(zip) 디렉터리입니다:

프로젝트:

app
  controllers
    application_controller.rb
  models
    application.rb

생성된 데이터:

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

  • 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
   }
   ...
 ]