Bitbucket Server importer 개발 문서

전제 조건

가져오기를 테스트하려면 로컬에서 실행 중인 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에 유지하지만, 닫힌 및 Merge된 요청은 stash-refs/pull-requests 아래 숨겨진 내부 참조로 이동됩니다.

결과적으로 이러한 요청은 기본적으로 가져오지 않습니다. Merge Request이 커밋을 보유하지 않고 결과적으로 빈 차이가 있는 것을 방지하기 위해 가져오기 전에 영향을 받는 소스 및 타겟 커밋을 서버에서 가져옵니다. 가져온 커밋을 refs로 저장하여 Git이 사용되지 않으면 제거되는 문제를 방지합니다. 소스 커밋은 #{commit}:refs/merge-requests/#{pull_request.iid}/head로, 타겟 커밋은 #{commit}:refs/keep-around/#{commit}로 저장됩니다.

풀 리퀘스트를 생성할 때, 작성자 및 리뷰어를 Bitbucket 사용자와 GitLab 사용자와 일치시켜야 합니다. 일치하는 사용자가 찾아지면 24시간 동안 GitLab 사용자 ID가 캐시에 저장되어 다시 검색할 필요가 없도록 합니다.

3. Stage::ImportNotesWorker

이 워커는 모든 Merge Request에 대한 노트(코멘트)를 가져옵니다.

각 Merge Request에 대해 Gitlab::BitbucketServerImport::ImportPullRequestNotesWorker 워커의 작업이 예약되며, 이는 Merge Request에 대한 모든 독립형 코멘트, 인라인 코멘트, Merge 이벤트 및 승인된 이벤트를 가져옵니다.

4. Stage::ImportLfsObjectsWorker

원본 프로젝트에서 LFS 오브젝트를 가져와 각 LFS 오브젝트마다 Gitlab::BitbucketServerImport::ImportLfsObjectsWorker 작업이 예약됩니다.

5. Stage::FinishImportWorker

이 워커는 가져오기 프로세스를 완료하기 위해 가져오기를 완료로 표시하는 등 일부 정리 작업을 수행합니다.

풀 리퀘스트 언급

풀 리퀘스트 설명과 노트에는 사용자에 대한 @mentions가 포함될 수 있습니다. GitLab에 해당 이메일이 존재하지 않는 경우, 잘못된 사용자가 태그될 수 있습니다.

이를 해결하기 위해 Bitbucket 프로젝트에 액세스 권한이 있는 모든 사용자를 포함하는 캐시를 구축한 다음, 풀 리퀘스트 설명과 노트에서 언급을 변환합니다.

백오프 및 재시도

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