Bitbucket Server importer developer documentation

전제 조건

가져오기를 테스트하려면 로컬에서 실행 중인 Bitbucket Server 인스턴스가 필요합니다. 로컬 인스턴스 실행에 대한 정보는 다음 지침을 참조하세요.

코드 구조

가져오기 코드는 다음 디렉토리로 구성됩니다.

  • lib/gitlab/bitbucket_server_import: 이 디렉토리에는 가져오기 리소스에 사용되는 클래스와 같은 대부분의 코드가 포함되어 있습니다.
  • app/workers/gitlab/bitbucket_server_import: 이 디렉토리에는 Sidekiq 워커가 포함되어 있습니다.

가져오기 진행 방식

Bitbucket Server 프로젝트가 가져오기되면 작업이 별도의 단계로 나뉘며, 각 단계는 실행되는 일련의 Sidekiq 작업으로 구성됩니다.

각 단계 간에는 현재 단계의 모든 작업이 완료되었는지를 주기적으로 확인하는 Gitlab::BitbucketServerImport::AdvanceStageWorker 작업이 예약됩니다. 모든 작업이 완료되면 작업이 가져오기 프로세스를 다음 단계로 진행시킵니다.

단계

1. Stage::ImportRepositoryWorker

이 작업자는 저장소를 가져오고 완료될 때 다음 단계를 예약합니다.

2. Stage::ImportPullRequestsWorker

이 작업자는 모든 풀 리퀘스트를 가져옵니다. 각 풀 리퀘스트마다 Gitlab::BitbucketImport::ImportPullRequestWorker 작업자를 위한 작업이 예약됩니다.

Bitbucket Server는 열린 풀 리퀘스트에 대한 참조를 refs/heads/pull-requests에 유지하지만, 닫힌 및 병합된 요청은 stash-refs/pull-requests의 숨겨진 내부 참조로 이동됩니다.

그러므로 기본적으로 가져오지 않습니다. 병합 요청이 커밋이 없어서 빈 차이점이 있는 것을 방지하려면 가져오기 전에 영향을 받는 소스 및 대상 커밋을 서버에서 가져옵니다. 가져온 커밋을 참조로 저장하여 사용되지 않을 경우 Git이 제거하지 않도록 합니다. 소스 커밋은 #{commit}:refs/merge-requests/#{pull_request.iid}/head로 저장되며 대상 커밋은 #{commit}:refs/keep-around/#{commit}로 저장됩니다.

풀 리퀘스트를 생성할 때 Bitbucket 사용자와 GitLab 사용자를 작성자 및 리뷰어에 매핑해야 합니다. 매칭된 사용자가 발견되면 GitLab 사용자 ID가 24시간 동안 캐시에 저장되어 다시 검색할 필요가 없도록 합니다.

3. Stage::ImportNotesWorker

이 작업자는 모든 병합 요청에 대한 노트(댓글)를 가져옵니다.

모든 병합 요청에 대해 Gitlab::BitbucketServerImport::ImportPullRequestNotesWorker 작업자를 위한 작업이 예약됩니다. 이는 모든 독립적인 코멘트, 인라인 코멘트, 병합 이벤트 및 승인된 이벤트를 가져옵니다.

4. Stage::ImportLfsObjectsWorker

소스 프로젝트에서 LFS 객체를 가져와 매 LFS 객체마다 Gitlab::BitbucketServerImport::ImportLfsObjectsWorker 작업을 예약합니다.

5. Stage::FinishImportWorker

이 작업자는 가져오기 프로세스를 완료하기 위해 가져오기를 완료로 표시하는 등 몇 가지 유지 관리를 수행합니다.

풀 리퀘스트 멘션

풀 리퀘스트 설명 및 노트에는 사용자에 대한 @멘션을 포함할 수 있습니다. GitLab에 해당 이메일이 있는 사용자가 존재하지 않으면 잘못된 사용자가 태그될 수 있습니다.

이를 해결하기 위해 Bitbucket 프로젝트에 액세스 권한이 있는 모든 사용자를 포함하는 캐시를 작성하고 그런 다음 풀 리퀘스트 설명과 노트에서 멘션을 변환합니다.

백오프 및 재시도

요청을 처리하기 위해 rate limiting을 다루기 위해 요청은 BitbucketServer::RetryWithDelay로 랩핑됩니다. 이 래퍼는 응답이 속도 제한된 경우 확인하고 응답 헤더에서 지정된 지연 시간 후에 한 번 다시 시도합니다.