Merge Request 차이저장

자세한 정보:

Tier: Free, Premium, Ultimate
Offering: Self-Managed

Merge Request 차이는 Merge Request과 관련된 차이의 크기가 제한된 복사본입니다. Merge Request을 보는 경우, 성능 최적화를 위해 가능한 경우 차이가 이러한 복사본에서 가져옵니다.

기본적으로 Merge Request 차이는 데이터베이스의 merge_request_diff_files 테이블에 저장됩니다. 그러나 대형 설치에서는 해당 테이블이 너무 커지는 경우에는 외부 리포지터리로 전환하는 것이 권장됩니다.

Merge Request 차이를 디스크에 또는 객체 리포지터리에 저장할 수 있습니다. 일반적으로 디스크가 아닌 데이터베이스에 차이를 저장하는 것이 더 나은데, 데이터베이스 바깥에서만 오래된 차이를 저장하는 대안도 가능합니다.

외부 리포지터리 사용

Linux package (Omnibus)
  1. /etc/gitlab/gitlab.rb를 편집하고 다음 라인을 추가합니다:

    gitlab_rails['external_diffs_enabled'] = true
    
  2. 외부 차이는 /var/opt/gitlab/gitlab-rails/shared/external-diffs에 저장됩니다. 예를 들어 경로를 /mnt/storage/external-diffs로 변경하려면, /etc/gitlab/gitlab.rb를 편집하고 다음 라인을 추가하세요:

    gitlab_rails['external_diffs_storage_path'] = "/mnt/storage/external-diffs"
    
  3. 변경 사항이 적용되려면 파일을 저장하고 GitLab을 재구성하세요. 그러면 GitLab이 기존의 Merge Request 차이를 외부 리포지터리로 이전합니다.

Self-compiled (source)
  1. /home/git/gitlab/config/gitlab.yml를 편집하고 다음 라인을 추가하거나 수정하세요:

    external_diffs:
      enabled: true
    
  2. 외부 차이는 /home/git/gitlab/shared/external-diffs에 저장됩니다. 예를 들어 경로를 /mnt/storage/external-diffs로 변경하려면, /home/git/gitlab/config/gitlab.yml를 편집하고 다음 라인을 추가하거나 수정하세요:

    external_diffs:
      enabled: true
      storage_path: /mnt/storage/external-diffs
    
  3. 변경 사항이 적용되려면 파일을 저장하고 GitLab을 다시 시작하세요. 그러면 GitLab이 기존의 Merge Request 차이를 외부 리포지터리로 이전합니다.

객체 리포지터리 사용

caution
객체 리포지터리로 마이그레이션하는 것은 되돌릴 수 없습니다.

외부 차이를 디스크에 저장하는 대신, AWS S3와 같은 객체 리포지터리의 사용을 권장합니다. 이 구성은 유효한 AWS 자격 증명에 이미 구성되어 있다고 가정합니다.

Linux package (Omnibus)
  1. /etc/gitlab/gitlab.rb를 편집하고 다음 라인을 추가합니다:

    gitlab_rails['external_diffs_enabled'] = true
    
  2. 객체 리포지터리 설정을 지정하세요.
  3. 변경 사항이 적용되려면 파일을 저장하고 GitLab을 재구성하세요. 그러면 GitLab이 기존의 Merge Request 차이를 외부 리포지터리로 이전합니다.
Self-compiled (source)
  1. /home/git/gitlab/config/gitlab.yml를 편집하고 다음 라인을 추가하거나 수정하세요:

    external_diffs:
      enabled: true
    
  2. 객체 리포지터리 설정을 지정하세요.
  3. 변경 사항이 적용되려면 파일을 저장하고 GitLab을 다시 시작하세요. 그러면 GitLab이 기존의 Merge Request 차이를 외부 리포지터리로 이전합니다.

GitLab과 객체 리포지터리 사용에 대해 자세히 알아보기.

객체 리포지터리 설정

객체 유형에 대한 단일 리포지터리 연결 설정을 사용해야 합니다.

데이터베이스 내 대체 리포지터리

외부 차이를 활성화하면 Merge Request의 성능이 저하될 수 있습니다. 외부 차이를 다른 데이터와 별도로 검색해야 하기 때문입니다. 현재 차이를 데이터베이스에 유지하면서 오래된 차이만 외부에 저장하는 대안이 있습니다.

이 기능을 활성화하려면 다음 단계를 수행하세요:

Linux package (Omnibus)
  1. /etc/gitlab/gitlab.rb를 편집하고 다음 라인을 추가합니다:

    gitlab_rails['external_diffs_when'] = 'outdated'
    
  2. 변경 사항이 적용되려면 파일을 저장하고 GitLab을 재구성하세요.

Self-compiled (source)
  1. /home/git/gitlab/config/gitlab.yml를 편집하고 다음 라인을 추가하거나 수정하세요:

    external_diffs:
      enabled: true
      when: outdated
    
  2. 변경 사항이 적용되려면 파일을 저장하고 GitLab을 다시 시작하세요.

이 기능을 활성화하면 차이는 처음에는 데이터베이스에 저장되며, 다음 조건 중 하나가 충족되면 외부 리포지터리로 이동됩니다:

  • Merge Request 차이의 새로운 버전이 있는 경우
  • Merge Request이 7일 이상 전에 Merge되었을 경우
  • Merge Request이 7일 이상 전에 닫혔을 경우

이러한 규칙은 데이터베이스에 자주 액세스되는 차이만 저장함으로써 공간과 성능 사이의 균형을 유지합니다. 자주 액세스되지 않을 가능성이 덜한 차이는 대신 외부 리포지터리로 이동됩니다.

외부 리포지터리에서 객체 리포지터리로 전환

자동 마이그레이션은 데이터베이스에 저장된 차이를 이동시키지만, 리포지터리 유형 간에 차이를 이동하지는 않습니다. 외부 리포지터리에서 객체 리포지터리로 전환하려면:

  1. 로컬 또는 NFS 리포지터리에 저장된 파일을 매뉴얼으로 객체 리포지터리로 이동합니다.
  2. 데이터베이스에서 파일의 위치를 변경하려면 이 Rake 작업을 실행하세요.

    Linux 패키지 설치의 경우:

    sudo gitlab-rake gitlab:external_diffs:force_object_storage
    

    소스로 컴파일한 설치의 경우:

    sudo -u git -H bundle exec rake gitlab:external_diffs:force_object_storage RAILS_ENV=production
    

    기본적으로 sudo는 기존 환경 변수를 유지하지 않습니다. 기존 환경 변수를 접두사로 하는 것이 아니라 추가해야 합니다. 다음과 같이 처리하세요:

    sudo gitlab-rake gitlab:external_diffs:force_object_storage START_ID=59946109 END_ID=59946109 UPDATE_DELAY=5
    

이러한 환경 변수는 Rake 작업의 동작을 수정합니다:

이름 기본값 목적
ANSI true ANSI 이스케이프 코드를 사용하여 출력을 이해하기 쉽게 만듭니다.
BATCH_SIZE 1000 이 크기의 일괄 처리 단위로 테이블을 반복 처리합니다.
START_ID nil 설정된 경우, 이 ID에서 스캔을 시작합니다.
END_ID nil 설정된 경우, 이 ID에서 스캔을 중단합니다.
UPDATE_DELAY 1 업데이트 간의 대기 시간(초)입니다.
  • START_IDEND_ID를 사용하여 테이블의 서로 다른 부분에 대해 다른 프로세스에 할당함으로써 업데이트를 병렬로 실행할 수 있습니다.
  • BATCHUPDATE_DELAY를 사용하여 마이그레이션의 속도를 테이블에 대한 동시 액세스와 교환할 수 있습니다.
  • 터미널이 ANSI 이스케이프 코드를 지원하지 않는 경우 ANSIfalse로 설정해야 합니다.