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에 보관하지만, 닫힌 및 병합된 요청은 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 프로젝트에 액세스 권한이 있는 모든 사용자를 포함하는 캐시를 구축한 후 풀 리퀘스트 설명과 노트의 멘션을 변환합니다.

백오프 및 재시도

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