Bitbucket Server 임포터 개발자 문서
GitLab v19.4요약
임포트를 테스트하려면 로컬에서 실행 중인 Bitbucket Server 인스턴스가 필요합니다. 임포터의 코드베이스는 다음 디렉터리로 구성됩니다. Bitbucket Server 프로젝트를 임포트하면 작업이 여러 스테이지로 나뉘며, 각 스테이지는 실행되는 Sidekiq job의 집합으로 구성됩니다.
사전 요구 사항#
임포트를 테스트하려면 로컬에서 실행 중인 Bitbucket Server 인스턴스가 필요합니다. 로컬 인스턴스 실행 방법은 이 지침을 참고합니다.
코드 구조#
임포터의 코드베이스는 다음 디렉터리로 구성됩니다.
lib/gitlab/bitbucket_server_import: 이 디렉터리에는 리소스 임포트에 사용되는 클래스 등 대부분의 코드가 들어 있습니다.app/workers/gitlab/bitbucket_server_import: 이 디렉터리에는 Sidekiq 워커가 들어 있습니다.
임포트 진행 방식#
Bitbucket Server 프로젝트를 임포트하면 작업이 여러 스테이지로 나뉘며, 각 스테이지는 실행되는 Sidekiq job의 집합으로 구성됩니다.
스테이지와 스테이지 사이에는 Gitlab::BitbucketServerImport::AdvanceStageWorker라는 job이
예약되어 현재 스테이지의 모든 작업이 완료되었는지 주기적으로 확인합니다.
모든 작업이 완료되면 이 job이 임포트 프로세스를 다음 스테이지로 진행시킵니다.
스테이지#
1. Stage::ImportRepositoryWorker#
이 워커는 리포지터리를 임포트하고 완료되면 다음 스테이지를 예약합니다.
2. Stage::ImportPullRequestsWorker#
이 워커는 모든 풀 리퀘스트를 임포트합니다. 풀 리퀘스트마다
Gitlab::BitbucketImport::ImportPullRequestWorker 워커에 대한 job이 예약됩니다.
Bitbucket Server는 열린 풀 리퀘스트의 참조를
refs/heads/pull-requests에서 추적하지만, 닫힌 요청과 머지된 요청은
stash-refs/pull-requests 하위의 숨겨진 내부 ref로 이동합니다.
그 결과 이러한 참조는 기본적으로 fetch되지 않습니다. 머지 리퀘스트에 커밋이 없어
diff가 비는 상황을 막기 위해, 풀 리퀘스트를 임포트하기 전에 영향을 받는 소스 및 대상
커밋을 서버에서 fetch합니다.
fetch한 커밋은 ref로 저장하여 Git이 제거하지 않도록 합니다. 사용되지 않는 커밋은
제거될 수 있기 때문입니다.
소스 커밋은 #{commit}:refs/merge-requests/#{pull_request.iid}/head로 저장하고
대상 커밋은 #{commit}:refs/keep-around/#{commit}으로 저장합니다.
풀 리퀘스트를 생성할 때는 작성자와 리뷰어에 대해 Bitbucket 사용자를 GitLab 사용자와 매칭해야 합니다. 일치하는 사용자를 찾으면 GitLab 사용자 ID를 24시간 동안 캐시하므로 다시 검색할 필요가 없습니다.
3. Stage::ImportNotesWorker#
이 워커는 모든 머지 리퀘스트의 노트(댓글)를 임포트합니다.
머지 리퀘스트마다 Gitlab::BitbucketServerImport::ImportPullRequestNoteWorker
워커에 대한 job이 예약되며, 이 job은 해당 머지 리퀘스트의 모든 독립 댓글, 인라인 댓글, 머지 이벤트,
승인 이벤트를 임포트합니다.
4. Stage::ImportLfsObjectsWorker#
소스 프로젝트에서 LFS 오브젝트를 임포트합니다. LFS 오브젝트마다
Gitlab::BitbucketServerImport::ImportLfsObjectsWorker job을 예약하는 방식입니다.
5. Stage::FinishImportWorker#
이 워커는 임포트를 완료로 표시하는 등의 하우스키핑 작업을 수행하여 임포트 프로세스를 마무리합니다.
사용자 기여 매핑#
Bitbucket Server 임포터는 사용자 기여 매핑을 지원합니다. 이를 통해 임포트가 완료된 뒤 실제 사용자가 할당될 때까지 임포트된 레코드를 플레이스홀더 사용자에게 귀속시킬 수 있습니다.
주요 클래스#
| 클래스 | 목적 |
|---|---|
BitbucketServerImport::UserFinder |
Bitbucket Server API 응답의 사용자 데이터를 GitLab User 레코드로 매핑하기 위해 Import::SourceUserMapper를 호출하는 클래스 |
삭제된 사용자 처리#
Bitbucket Server 임포터는 삭제된 사용자를 별도로 처리하지 않습니다. 사용자 참조에 사용자 이름이 없으면 기여는 project.creator_id로 폴백됩니다.
풀 리퀘스트 멘션#
풀 리퀘스트 설명과 노트에는 사용자 멘션이 포함될 수 있습니다. 같은 이메일을 쓰는 사용자가 GitLab에 없으면 잘못된 사용자가 태그될 수 있습니다.
이를 피하기 위해 Bitbucket 프로젝트에 접근할 수 있는 모든 사용자를 담은 캐시를 만든 다음 풀 리퀘스트 설명과 노트의 멘션을 변환합니다.
백오프 및 재시도#
속도 제한을 처리하기 위해 요청은 BitbucketServer::RetryWithDelay로 래핑합니다.
이 래퍼는 응답이 속도 제한인지 확인하고 응답 헤더에 지정된 지연 시간 후에 한 번 재시도합니다.