번들 URI

상태: 실험
  • GitLab 17.0에 도입되었으며 기본적으로 gitaly_bundle_uri라는 플래그와 함께 도입되었습니다. 기본적으로 비활성화되어 있습니다.

플래그: Self-Managed형 GitLab에서는 기본적으로 이 기능을 사용할 수 없습니다. 사용하려면 관리자가 gitaly_bundle_uri라는 feature flag를 활성화할 수 있습니다. GitLab.com 및 전용 GitLab에서는이 기능을 사용할 수 없습니다. 이 기능은 프로덕션 환경에서 사용하도록 준비되지 않았습니다.

Gitaly는 Git 번들 URI를 지원합니다. 번들 URI는 Git이 남은 객체를 원격 리포지터리로부터 가져오기 전에 객체 데이터베이스를 부트스트랩하는 데 사용할 수있는 위치입니다. 번들 URI는 Git 프로토콜에 내장되어 있습니다.

번들 URI를 사용하면 다음을 할 수 있습니다.

  • 네트워크 연결이 떨어져있는 사용자의 굴곡을 피하고 GitLab 서버에서 복제 및 가져오기를 빠르게 할 수 있습니다. 번들은 CDN에 저장되어 전 세계 어디에서든 사용할 수 있습니다.
  • CI/CD 작업을 실행하는 서버의 부하를 줄일 수 있습니다. CI/CD 작업이 다른 곳에서 번들을 미리로드 할 수 있으면 누락 된 객체 및 참조를 증분적으로 가져오는 나머지 작업으로 인해 서버에 훨씬 적은 부하가 생깁니다.

전제 조건

  • Git 구성 transfer.bundleURI는 Git 클라이언트에서 활성화되어 있어야 합니다.
  • GitLab Runner 16.6 이상부터 사용할 수 있습니다.
  • CI/CD 파이프라인 구성에서 기본 Git 전략git clone으로 설정되어 있어야 합니다.

서버 구성

번들이 저장되는 위치를 구성해야합니다. Gitaly는 다음 리포지터리 서비스를 지원합니다.

  • Google Cloud Storage
  • AWS S3(또는 호환 가능)
  • Azure Blob Storage
  • 로컬 파일 저장(권장하지 않음)

Azure Blob 리포지터리 구성

Azure Blob 리포지터리를 번들 URI에 대해 구성하는 방법은 설치 유형에 따라 다릅니다. 사용자 지정 설치의 경우 AZURE_STORAGE_ACCOUNTAZURE_STORAGE_KEY 환경 변수를 GitLab 외부에서 설정해야합니다.

Linux 패키지(Omnibus)

/etc/gitlab/gitlab.rb를 편집하고 bundle_uri.go_cloud_url을 구성합니다:

gitaly['env'] = {
    'AZURE_STORAGE_ACCOUNT' => 'azure_storage_account',
    'AZURE_STORAGE_KEY' => 'azure_storage_key' #또는 'AZURE_STORAGE_SAS_TOKEN'
}
gitaly['configuration'] = {
    bundle_uri: {
        go_cloud_url: 'azblob://gitaly-bundleuri'
    }
}
자체 컴파일 (소스)

/home/git/gitaly/config.toml을 편집하고 go_cloud_url을 구성합니다:

[bundle_uri]
go_cloud_url = "azblob://gitaly-bundleuri"

Google Cloud 리포지터리 구성

Google Cloud 리포지터리(GCP)는 Application Default Credentials를 사용하여 인증합니다. 각 Gitaly 서버에 Application Default Credentials를 설정하려면 다음 중 하나를 사용하십시오.

자세한 정보는 Application Default Credentials를 참조하십시오.

대상 버킷은 go_cloud_url 옵션을 사용하여 구성합니다.

Linux 패키지(Omnibus)

/etc/gitlab/gitlab.rb를 편집하고 go_cloud_url을 구성합니다:

gitaly['env'] = {
    'GOOGLE_APPLICATION_CREDENTIALS' => '/path/to/service.json'
}
gitaly['configuration'] = {
    bundle_uri: {
        go_cloud_url: 'gs://gitaly-bundleuri'
    }
}
자체 컴파일 (소스)

/home/git/gitaly/config.toml을 편집하고 go_cloud_url을 구성합니다:

[bundle_uri]
go_cloud_url = "gs://gitaly-bundle_uri"

S3 리포지터리 구성

S3 리포지터리 인증을 구성하는 방법은 다음과 같습니다.

  • AWS CLI로 인증하는 경우 기본 AWS 세션을 사용할 수 있습니다.
  • 그렇지 않은 경우 AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY 환경 변수를 사용할 수 있습니다. 사용자 지정 설치의 경우 GitLab 외부에서 환경 변수를 설정합니다.

자세한 정보는 AWS Session documentation을 참조하십시오.

대상 버킷 및 지역은 go_cloud_url 옵션을 사용하여 구성합니다.

Linux 패키지(Omnibus)

/etc/gitlab/gitlab.rb를 편집하고 go_cloud_url을 구성합니다:

gitaly['env'] = {
    'AWS_ACCESS_KEY_ID' => 'aws_access_key_id',
    'AWS_SECRET_ACCESS_KEY' => 'aws_secret_access_key'
}
gitaly['configuration'] = {
    bundle_uri: {
        go_cloud_url: 's3://gitaly-bundle_uri?region=us-west-1'
    }
}
자체 컴파일 (소스)

/home/git/gitaly/config.toml을 편집하고 go_cloud_url을 구성합니다:

[bundle_uri]
go_cloud_url = "s3://gitaly-bundle_uri?region=us-west-1"

S3 호환 서버 구성

S3 호환 서버(예: MinIO)는 S3와 유사하게 구성됩니다. 다음 추가 매개변수를 지원합니다.

  • region: AWS 지역
  • endpoint: 엔드포인트 URL
  • disabledSSL: true로 설정하면 SSL을 비활성화합니다.
  • s3ForcePathStyle: true로 설정하면 path-style 주소 지정을 강제합니다.
Linux 패키지(Omnibus)

/etc/gitlab/gitlab.rb를 편집하고 go_cloud_url을 구성합니다:

gitaly['env'] = {
    'AWS_ACCESS_KEY_ID' => 'minio_access_key_id',
    'AWS_SECRET_ACCESS_KEY' => 'minio_secret_access_key'
}
gitaly['configuration'] = {
    bundle_uri: {
        go_cloud_url: 's3://gitaly-bundleuri?region=minio&endpoint=my.minio.local:8080&disableSSL=true&s3ForcePathStyle=true'
    }
}
자체 컴파일 (소스)

/home/git/gitaly/config.toml을 편집하고 go_cloud_url을 구성합니다:

[bundle_uri]
go_cloud_url = "s3://gitaly-bundleuri?region=minio&endpoint=my.minio.local:8080&disableSSL=true&s3ForcePathStyle=true"

번들 생성

Gitaly가 올바르게 구성된 후 Gitaly는 번들을 생성할 수 있으며,이는 매뉴얼 프로세스입니다. 번들 URI의 번들을 생성하려면 다음을 실행하십시오.

sudo /opt/gitlab/embedded/bin/gitaly bundle-uri \
                                     --config=<config-file> \
                                     --storage=<storage-name> \
                                     --repository=<relative-path>

이 명령은 번들을 생성하고 구성된 리포지터리 서비스에 저장합니다. Gitaly는 생성된 번들을 자동으로 새로 고치지 않습니다. 번들의 더 최신 버전을 생성하려면 명령을 다시 실행해야합니다.

이 명령을 cron(8)과 같은 도구로 예약할 수 있습니다.

번들 URI 예시

다음 예에서는 번들 URI를 사용하여 gitlab.com/gitlab-org/gitlab.git을 복제하는 방법과 그렇지 않은 방법 사이의 차이를 보여줍니다.

$ git -c transfer.bundleURI=false clone https://gitlab.com/gitlab-org/gitlab.git
'gitlab'으로 복제중...
원격 리포지터리: 객체 나열 중: 5271177/5271177, 완료.
원격 리포지터리: 총 5271177 (델타 0), 재사용 0 (델타 0), 팩 재사용 5271177
객체 수신 중: 100% (5271177/5271177), 1.93 GiB | 32.93 MiB/s, 완료.
델타 해결 중: 100% (4140349/4140349), 완료.
파일 업데이트 중: 100% (71304/71304), 완료.

$ git -c transfer.bundleURI=true clone https://gitlab.com/gitlab-org/gitlab.git
'gitlab'으로 복제중...
원격 리포지터리: 객체 나열 중: 1322255/1322255, 완료.
원격 리포지터리: 객체 세는 중: 100% (611708/611708), 완료.
원격 리포지터리: 총 1322255 (델타 611708), 재사용 611708 (델타 611708), 팩 재사용 710547
객체 수신 중: 100% (1322255/1322255), 539.66 MiB | 22.98 MiB/s, 완료.
델타 해결 중: 100% (1026890/1026890), 223946 로컬 객체로 완료.
개체 확인 중: 100% (8388608/8388608), 완료.
연결 확인 중: 1381139, 완료.
파일 업데이트 중: 100% (71304/71304), 완료.

위 예에서:

  • 번들 URI를 사용하지 않았을 때, GitLab 서버에서 5,271,177개의 객체를 수신했습니다.
  • 번들 URI를 사용했을 때, GitLab 서버에서 1,322,255개의 객체를 수신했습니다.

이러한 감소는 GitLab에서 더 적은 객체를 함께 묶어야 하기 때문입니다(위 예에서는 대략 객체 수의 1/4). 이는 클라이언트가 먼저 스토리지 서버에서 번들을 다운로드했기 때문입니다.

번들 보안

번들은 서명된 URL을 사용하여 클라이언트에게 접근 가능하게 만듭니다. 서명된 URL은 요청을하는 데 제한된 권한과 시간을 제공하는 URL입니다. 리포지터리 서비스가 서명된 URL을 지원하는지 확인하려면 리포지터리 서비스의 문서를 참조하세요.