捆绑 URI (EXPERIMENTAL)

  • 在极狐GitLab 17.0 中引入,使用名为 gitaly_bundle_uri功能标志。默认禁用。
在私有化部署的极狐GitLab 中,默认情况下此功能不可用。要使其可用,管理员可以启用名为 gitaly_bundle_uri 的功能标志。在 JihuLab.com 中,此功能不可用。此功能尚未准备好投入生产使用。

Gitaly 支持 Git 捆绑 URI。捆绑 URI 是 Git 可以下载一个或多个捆绑包以在从远程获取剩余对象之前引导对象数据库的位置。捆绑 URI 内置于 Git 协议中。

使用捆绑 URI 可以:

  • 加速与极狐GitLab 服务器网络连接不佳的用户的克隆和获取。捆绑包可以存储在 CDN 上,使其在全球范围内可用。
  • 减少运行 CI/CD 作业的服务器负载。如果 CI/CD 作业可以从其他地方预加载捆绑包,则增量获取缺失对象和引用的剩余工作会减少服务器的负载。

先决条件

  • 必须在 Git 客户端上启用 Git 配置 transfer.bundleURI
  • 极狐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 环境变量。

::Tabs

:::TabTitle Linux package (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://<bucket>'
    }
}

:::TabTitle Self-compiled (source)

编辑 /home/git/gitaly/config.toml 并配置 go_cloud_url

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

::EndTabs

配置 S3 存储

要配置 S3 存储身份验证:

  • 如果您使用 AWS CLI 进行身份验证,可以使用默认 AWS 会话。
  • 否则,您可以使用 AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY 环境变量。对于自编译安装,请在极狐GitLab 外设置环境变量。

有关更多信息,请参阅AWS 会话文档

目标桶和区域使用 go_cloud_url 选项进行配置。

::Tabs

:::TabTitle Linux package (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://<bucket>?region=us-west-1'
    }
}

:::TabTitle Self-compiled (source)

编辑 /home/git/gitaly/config.toml 并配置 go_cloud_url

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

::EndTabs

配置 S3 兼容服务器

S3 兼容服务器,如 MinIO,配置方式类似于 S3,添加 endpoint 参数。

支持以下参数:

  • region:AWS 区域。
  • endpoint:端点 URL。
  • disabledSSL:值为 true 时禁用 SSL。
  • s3ForcePathStyle:值为 true 时强制路径样式寻址。

::Tabs

:::TabTitle Linux package (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://<bucket>?region=minio&endpoint=my.minio.local:8080&disableSSL=true&s3ForcePathStyle=true'
    }
}

:::TabTitle Self-compiled (source)

编辑 /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"

::EndTabs

生成捆绑包

在 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 示例

在以下示例中,我们演示了使用和不使用捆绑 URI 克隆 jihulab.com/gitlab-cn/gitlab.git 的区别。

$ git -c transfer.bundleURI=false clone https://jihulab.com/gitlab-cn/gitlab.git
Cloning into 'gitlab'...
remote: Enumerating objects: 5271177, done.
remote: Total 5271177 (delta 0), reused 0 (delta 0), pack-reused 5271177
Receiving objects: 100% (5271177/5271177), 1.93 GiB | 32.93 MiB/s, done.
Resolving deltas: 100% (4140349/4140349), done.
Updating files: 100% (71304/71304), done.

$ git -c transfer.bundleURI=true clone https://jihulab.com/gitlab-cn/gitlab.git
Cloning into 'gitlab'...
remote: Enumerating objects: 1322255, done.
remote: Counting objects: 100% (611708/611708), done.
remote: Total 1322255 (delta 611708), reused 611708 (delta 611708), pack-reused 710547
Receiving objects: 100% (1322255/1322255), 539.66 MiB | 22.98 MiB/s, done.
Resolving deltas: 100% (1026890/1026890), completed with 223946 local objects.
Checking objects: 100% (8388608/8388608), done.
Checking connectivity: 1381139, done.
Updating files: 100% (71304/71304), done.

在上述示例中:

  • 在不使用捆绑 URI 时,从极狐GitLab 服务器接收到 5,271,177 个对象。
  • 使用捆绑 URI 时,从极狐GitLab 服务器接收到 1,322,255 个对象。

这种减少意味着极狐GitLab 需要打包的对象数量更少(在上述示例中,大约是对象数量的四分之一),因为客户端首先从存储服务器下载了捆绑包。

保护捆绑包

捆绑包通过签名 URL 提供给客户端访问。签名 URL 是提供有限权限和时间来发出请求的 URL。要查看您的存储服务是否支持签名 URL,请参阅存储服务的文档。