코드 인텔리전스 개발 가이드라인
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
}
...
]