번들 URI

Status: Experiment
자체 관리 GitLab에서는 기본적으로 이 기능을 사용할 수 없습니다. 사용하려면 관리자가 이름이 gitaly_bundle_uri피쳐 플래그를 활성화해야 합니다. GitLab.com 및 전용 GitLab에서는 이 기능을 사용할 수 없습니다. 이 기능은 아직 제품으로 사용하기에 준비되지 않았습니다.

Gitaly는 Git 번들 URI를 지원합니다. 번들 URI는 Git이 원격에서 나머지 개체를 가져오기 전에 개체 데이터베이스를 부트스트랩하기 위해 하나 이상의 번들을 다운로드할 수 있는 위치입니다. 번들 URI는 Git 프로토콜에 내장되어 있습니다.

Bundle 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 저장소 구성

번들 URI를 위해 Azure Blob 저장소를 구성하는 방법은 설치 유형에 따라 다릅니다. 자체 컴파일된 설치에서는 GitLab 외부에서 AZURE_STORAGE_ACCOUNTAZURE_STORAGE_KEY 환경 변수를 설정해야 합니다.

Linux 패키지 (옴니버스)

/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://<bucket>'
    }
}
자체 컴파일 (소스)

/home/git/gitaly/config.toml을 편집하고 go_cloud_url을 구성하세요:

[bundle_uri]
go_cloud_url = "azblob://<bucket>"

Google Cloud 저장소 구성

Google Cloud 저장소 (GCP)는 Application 기본 자격 증명을 사용하여 인증합니다. 각 Gitaly 서버에 Application 기본 자격 증명을 설정하세요:

자세한 정보는 Application 기본 자격 증명 을 참조하세요.

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

Linux 패키지 (옴니버스)

/etc/gitlab/gitlab.rb를 편집하고 go_cloud_url을 구성하세요:

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

/home/git/gitaly/config.toml을 편집하고 go_cloud_url을 구성하세요:

[bundle_uri]
go_cloud_url = "gs://<bucket>"

S3 저장소 구성

S3 저장소 인증을 구성하는 방법은 다음과 같습니다:

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

자세한 정보는 AWS 세션 문서 을 참조하세요.

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

Linux 패키지 (옴니버스)

/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://<bucket>?region=us-west-1'
    }
}
자체 컴파일 (소스)

/home/git/gitaly/config.toml을 편집하고 go_cloud_url을 구성하세요:

[bundle_uri]
go_cloud_url = "s3://<bucket>?region=us-west-1"

S3 호환 서버 구성

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

  • region: AWS 지역.
  • endpoint: 엔드포인트 URL.
  • disabledSSL: true값으로 SSL을 비활성화합니다.
  • s3ForcePathStyle: true값으로 경로 스타일 주소 지정을 강제합니다.
Linux 패키지 (옴니버스)

/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://<bucket>?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://<bucket>?region=minio&endpoint=my.minio.local:8080&disableSSL=true&s3ForcePathStyle=true"

번들 생성

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

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

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

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

번들 URI 예시

다음 예시에서는 gitlab.com/gitlab-org/gitlab.git을 번들 URI를 사용하거나 사용하지 않고 복제하는 경우의 차이를 보여줍니다.

$ git -c transfer.bundleURI=false clone https://gitlab.com/gitlab-org/gitlab.git
'gitlab'으로 복제중...
원격: 개체 나열 중: 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개, 완료.
원격: 개수 세는 중: 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을 지원하는지 확인하려면 저장소 서비스의 문서를 확인하세요.