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 프로젝트를 임포트하면 작업이 여러 단계로 나뉘며, 각 단계는 실행되는 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 를 호출합니다 단계 # 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 # 이 워커는 모든 풀 리퀘스트를 임포트합니다. 풀