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
로 래핑됩니다.
이 래퍼는 응답이 속도 제한되었는지 확인하고 응답 헤더에서 지정된 지연 후 한 번 다시 시도합니다.