Bitbucket Server 가져오기 개발 문서
필수 조건
가져오기를 테스트하려면 로컬에서 실행 중인 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
로 감싸집니다. 이 래퍼는 응답이 비율 제한인지 확인하고 응답 헤더에 지정된 지연 이후에 한 번 재시도합니다.