프로젝트 리포지터리 이동

이 문서는 프로젝트 리포지터리 이동에 대한 코드 디자인을 이해하는 데 도움을 주기 위해 작성되었습니다. 이 기능의 코드를 변경하기 전에이 문서를 읽어보세요.

이 문서는 코드가 자주 변경될 수 있기 때문에 코드가 어떻게 작동하는지 이해하기 위해서는 코드와 명세를 확인해야 합니다. 여기에는 Code Owners 기능의 주요 컴포넌트가 어떻게 작동하는지에 대한 설명이 포함되어 있습니다.

note
이 문서는이 문서에서 참조 된 코드 베이스의 부분이 업데이트되거나 제거되거나 새로운 부분이 추가 될 때 업데이트해야합니다.

비즈니스 로직

  • Projects::RepositoryStorageMove: 상태 머신을 포함한 이동을 추적합니다.
    • app/models/projects/repository_storage_move.rb에 정의되어 있습니다.
  • RepositoryStorageMovable: 상태 머신 로직, 유효성 검사기 및 일부 도우미 메서드가 포함되어 있습니다.
    • app/models/concerns/repository_storage_movable.rb에 정의되어 있습니다.
  • Project: 프로젝트 모델입니다.
    • app/models/project.rb에 정의되어 있습니다.
  • CanMoveRepositoryStorage: Project에 속하는 도우미 메서드가 포함되어 있습니다.
    • app/models/concerns/can_move_repository_storage.rb에 정의되어 있습니다.
  • API::ProjectRepositoryStorageMoves: 프로젝트 리포지터리 이동을위한 API 클래스입니다.
    • lib/api/project_repository_storage_moves.rb에 정의되어 있습니다.
  • Entities::Projects::RepositoryStorageMove: Projects::RepositoryStorageMove 모델을 직렬화하는 API 엔터티입니다.
    • lib/api/entities/projects/repository_storage_moves.rb에 정의되어 있습니다.
  • Projects::ScheduleBulkRepositoryShardMovesService: 대량 이동을 예약하는 서비스입니다.
    • app/services/projects/schedule_bulk_repository_shard_moves_service.rb에 정의되어 있습니다.
  • ScheduleBulkRepositoryShardMovesMethods: 대량 이동을위한 일반 메서드입니다.
    • app/services/concerns/schedule_bulk_repository_shard_moves_methods.rb에 정의되어 있습니다.
  • Projects::ScheduleBulkRepositoryShardMovesWorker: 대량 이동을 처리하는 워커입니다.
    • app/workers/projects/schedule_bulk_repository_shard_moves_worker.rb에 정의되어 있습니다.
  • Projects::UpdateRepositoryStorageWorker: 리포지터리 이동을 찾은 후 업데이트 리포지터리 서비스를 호출합니다.
    • app/workers/projects/update_repository_storage_worker.rb에 정의되어 있습니다.
  • UpdateRepositoryStorageWorker: Projects::UpdateRepositoryStorageWorker에 포함 된 일반 로직을 포함하는 모듈입니다.
    • app/workers/concerns/update_repository_storage_worker.rb에 정의되어 있습니다.
  • Projects::UpdateRepositoryStorageService: 이동을 수행합니다.
    • app/services/projects/update_repository_storage_service.rb에 정의되어 있습니다.
  • UpdateRepositoryStorageMethods: Projects::UpdateRepositoryStorageService에 포함 된 일반 메서드를 포함하는 모듈입니다.
    • app/services/concerns/update_repository_storage_methods.rb에 정의되어 있습니다.
  • Projects::UpdateService: 전달 된 매개 변수가 이동을 요청하는 경우 이동을 예약합니다.
    • app/services/projects/update_service.rb에 정의되어 있습니다.
  • PoolRepository: Gitaly ObjectPool을 나타내는 Ruby 객체입니다.
    • app/models/pool_repository.rb에 정의되어 있습니다.
  • ObjectPool::CreateWorker: Gitaly를 통해 ObjectPool을 생성하는 워커입니다.
    • app/workers/object_pool/create_worker.rb에 정의되어 있습니다.
  • ObjectPool::JoinWorker: Gitaly를 통해 ObjectPool에 가입하는 워커입니다.
    • app/workers/object_pool/join_worker.rb에 정의되어 있습니다.
  • ObjectPool::ScheduleJoinWorker: ObjectPool::JoinWorker를 예약하는 워커입니다.
    • app/workers/object_pool/schedule_join_worker.rb에 정의되어 있습니다.
  • ObjectPool::DestroyWorker: Gitaly를 통해 ObjectPool을 파괴하는 워커입니다.
    • app/workers/object_pool/destroy_worker.rb에 정의되어 있습니다.
  • ObjectPoolQueue: ObjectPool 워커를 구성하는 모듈입니다.
    • app/workers/concerns/object_pool_queue.rb에 정의되어 있습니다.
  • Repositories::ReplicateService: 데이터를 다른 리포지터리로 복제 처리합니다.
    • app/services/repositories/replicate_service.rb에 정의되어 있습니다.

흐름

이 플로우 차트들은 다른 기능에 대한 엔드 포인트에서부터 모델까지의 흐름을 설명하는 데 도움이 될 것입니다.

API를 통한 리포지터리 이동 예약

graph TD A[<code>POST /api/:version/project_repository_storage_moves</code>] --> C B[<code>POST /api/:version/projects/:id/repository_storage_moves</code>] --> D C[각 프로젝트에 대한 이동 예약] --> D[상태 설정: 예약됨] D --> E[<code>after_transition callback</code>] E --> F{<code>set_repository_read_only!</code>} F -->|success| H[리포지터리 업데이트 워커 예약] F -->|error| G[상태 설정: 실패]

예약된 후 리포지터리 이동

graph TD A[리포지터리 업데이트 워커 예약] --> B{상태가 예약됨인가?} B -->|예| C[상태 설정: 시작 됨] B -->|아니요| D[성공 반환] C --> E{동일한 파일 시스템인가?} E -.-> G[프로젝트 리포지터리를 쓰기 가능 상태로 설정] E -->|예| F["리포지터리를 미러링 (프로젝트, 위키, 디자인 및 풀)"] G --> H[리포지터리 값 업데이트] H --> I[상태 설정: 완료됨] I --> J[새로운 풀 리포지터리와 프로젝트 연결] J --> K[이전 풀 리포지터리 링크 제거] K --> L[프로젝트 리포지터리 저장 값 업데이트] L --> N[동일한 파일 시스템인 경우 이전 경로 제거] N --> M[상태 설정: 완료됨]