Merge Request 차이점 리포지터리

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

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

기본적으로 Merge Request 차이점은 데이터베이스의 merge_request_diff_files 테이블에 저장됩니다. 그러나 대형 설치에서는 이 테이블이 너무 커진다는 문제가 발생할 수 있으며, 이 경우 외부 리포지터리로 전환하는 것이 권장됩니다.

Merge Request 차이점은 디스크에 또는 객체 리포지터리에 저장할 수 있습니다. 일반적으로 차이점을 데이터베이스에 저장하는 것이 디스크에 저장하는 것보다 나은데, 데이터베이스 외에 오래된 차이점만 저장하는 대안이 가능합니다.

외부 리포지터리 사용

Linux 패키지 (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 (소스)
  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 패키지 (Omnibus)
  1. /etc/gitlab/gitlab.rb 파일을 편집하고 다음 줄을 추가합니다.

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

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

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

객체 리포지터리 설정

GitLab 13.2 이상에서는 통합된 객체 리포지터리 설정을 사용해야 합니다. 이 섹션은 이전 구성 형식을 설명합니다.

자체 컴파일된 설치에서 이러한 설정은 external_diffs: 밑에 있고, object_store: 아래에 중첩되어 있습니다. Linux 패키지 설치에서는 이러한 설정은 external_diffs_object_store_로 시작됩니다.

설정 설명 기본값
enabled 객체 리포지터리 사용/미사용 false
remote_directory 외부 차이점이 저장된 버킷 이름  
proxy_download 모든 파일 서비스를 프록시하는 경우 true로 설정. 이 옵션을 사용하면 클라이언트가 모든 데이터를 프록시하는 대신 원격 리포지터리에서 직접 다운로드할 수 있도록 하여 이그레스 트래픽을 줄일 수 있음 false
connection 아래에 설명된 여러 연결 옵션  

S3 호환 연결 설정

다양한 제공 업체에 대한 사용 가능한 연결 설정은 여기에서 확인할 수 있습니다.

Linux 패키지 (Omnibus)
  1. /etc/gitlab/gitlab.rb 파일을 편집하고 다음 줄을 추가합니다. 값을 원하는 값으로 대체합니다.

    gitlab_rails['external_diffs_enabled'] = true
    gitlab_rails['external_diffs_object_store_enabled'] = true
    gitlab_rails['external_diffs_object_store_remote_directory'] = "external-diffs"
    gitlab_rails['external_diffs_object_store_connection'] = {
      'provider' => 'AWS',
      'region' => 'eu-central-1',
      'aws_access_key_id' => 'AWS_ACCESS_KEY_ID',
      'aws_secret_access_key' => 'AWS_SECRET_ACCESS_KEY'
    }
    

    AWS IAM 프로필을 사용하는 경우에는 AWS 액세스 키 및 비밀 액세스 키/값을 생략합니다. 예:

    gitlab_rails['external_diffs_object_store_connection'] = {
      'provider' => 'AWS',
      'region' => 'eu-central-1',
      'use_iam_profile' => true
    }
    
  2. 변경 사항이 적용되려면 파일을 저장하고 GitLab을 다시 구성합니다.

Self-compiled (소스)
  1. /home/git/gitlab/config/gitlab.yml 파일을 편집하고 다음 줄을 추가하거나 수정합니다.

    external_diffs:
      enabled: true
      object_store:
        enabled: true
        remote_directory: "external-diffs" # 버킷 이름
        connection:
          provider: AWS # 현재 AWS만 지원됨
          aws_access_key_id: AWS_ACCESS_KEY_ID
          aws_secret_access_key: AWS_SECRET_ACCESS_KEY
          region: eu-central-1
    
  2. 변경 사항이 적용되려면 파일을 저장하고 GitLab을 다시 시작합니다.

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

외부 차이점을 활성화하면 Merge Request의 성능이 저하될 수 있습니다. 외부 차이점은 다른 데이터와 별도의 작업으로 검색해야 하기 때문입니다. 현재 차이점은 데이터베이스에 유지하면서 오래된 차이점만 외부에 저장하는 방법으로 타협점을 찾을 수 있습니다.

::Tabs

Linux 패키지 (Omnibus)
  1. /etc/gitlab/gitlab.rb 파일을 편집하고 아래 라인을 추가합니다:

    gitlab_rails['external_diffs_when'] = 'outdated'
    
  2. 파일을 저장하고 변경 사항이 적용되도록 GitLab을 다시 구성합니다.

Self-compiled (소스)
  1. /home/git/gitlab/config/gitlab.yml 파일을 편집하고 아래의 줄을 추가하거나 수정합니다:

    external_diffs:
      enabled: true
      when: outdated
    
  2. 파일을 저장하고 변경 사항이 적용되도록 GitLab을 다시 시작합니다.

:::EndTab

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

  • Merge Request 차이점의 새 버전이 존재함
  • Merge Request이 7일 이상 전에 Merge됨
  • Merge Request이 7일 이상 전에 닫혔음

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

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

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

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

    Linux 패키지 설치의 경우:

    sudo gitlab-rake gitlab:external_diffs:force_object_storage
    

    Self-compiled 설치의 경우:

    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로 설정해야 합니다.