InfoGrab DocsInfoGrab Docs

GitHub 임포터 개발자 문서

GitHub 임포터의 아키텍처, 단계별 처리 흐름, 사용자 기여 매핑, 속도 제한 처리 등 내부 구현 방식을 설명합니다.

GitHub 임포터는 Sidekiq을 사용하는 병렬 임포터입니다. 전제 조건 # github_importer 및 github_importer_advance_stage 큐를 처리하는 Sidekiq 워커(기본적으로 활성화됨). Octokit(GitHub API와 상호작용하는 데 사용됨). 코드 구조 # 임포터 코드베이스는 다음 디렉터리로 나뉩니다: lib/gitlab/github_import : 리소스 임포트에 사용되는 클래스 등 대부분의 코드가 포함된 디렉터리. app/workers/gitlab/github_import : Sidekiq 워커가 포함된 디렉터리. app/workers/concerns/gitlab/github_import : 다양한 Sidekiq 워커에서 재사용되는 모듈 몇 가지가 포함된 디렉터리. 아키텍처 개요 # GitHub 프로젝트를 임포트할 때 작업은 별도의 단계(Stage)로 나뉩니다. 각 단계는 실행되는 Sidekiq job 집합으로 구성됩니다. 모든 단계 사이에는 현재 단계의 모든 작업이 완료되었는지 주기적으로 확인하는 job이 예약되며, 완료된 경우 다음 단계로 임포트 프로세스를 진행합니다. 이를 처리하는 워커는 Gitlab::GithubImport::AdvanceStageWorker 입니다. 임포트는 POST /import/github 에 대한 API 요청을 통해 시작됩니다. API 엔드포인트는 Import::GitHubService 를 호출합니다. 이것은 Gitlab::LegacyGithubImport::ProjectCreator 를 호출합니다. 이것은 Projects::CreateService 를 호출합니다. 이것은 @project.import_state.schedule 을 호출합니다. 이것은 project.add_import_job 을 호출합니다. 이것은 RepositoryImportWorker 를 호출합니다. 단계(Stages) # 1. RepositoryImportWorker # 이 워커는 Projects::ImportService.new.execute 를 호출하며, 이것은 importer.execute 를 호출합니다. 이 맥락에서 importer 는 Gitlab::ImportSources.importer(project.import_type) 의 인스턴스이며, github 임포트 타입의 경우 ParallelImporter 에 매핑됩니다. ParallelImporter 는 다음 워커의 job을 예약합니다. 2. Stage::ImportRepositoryWorker # 이 워커는 리포지터리와 위키를 임포트하고, 완료되면 다음 단계를 예약합니다. 3. Stage::ImportBaseDataWorker # 이 워커는 라벨, 마일스톤, 릴리스 등의 기본 데이터를 임포트합니다. 이 작업은 충분히 빠르게 수행될 수 있으므로 병렬로 처리할 필요 없이 단일 스레드에서 수행됩니다. 4. Stage::ImportPullRequestsWorker # 이 워커는 모든 Pull Request를 임포트합니다. 각 Pull Re