{{< details >}}
- Status: Experiment
{{< /details >}}
{{< history >}}
- 引入于极狐GitLab 17.0,使用名为
gitaly_bundle_uri
的功能标志。默认禁用。
{{< /history >}}
{{< alert type=”flag” >}}
在极狐GitLab 私有化部署实例上,此功能默认不可用。要启用此功能,管理员 可以启用名为 gitaly_bundle_uri
的功能标志。在 JihuLab.com 上,此功能还不可用。此功能还未生产就绪。
{{< /alert >}}
极狐GitLab 支持 Git bundle URIs。Bundle URI 是 Git 可以下载一个或多个软件包的位置,以在从远程获取剩余对象之前引导对象数据库。Bundle URI 内置于 Git 协议中。
使用 Bundle URI 可以:
- 加速与极狐GitLab 服务器连接较差的用户的克隆和获取。软件包可以存储在 CDN 上,使其在全球范围内可用。
- 减轻运行 CI/CD 作业的服务器负载。如果 CI/CD 作业可以预加载来自其他地方的软件包,则增量获取缺失对象和引用的剩余工作对服务器的负载会少得多。
前提条件
- Git 客户端必须启用 Git 配置
transfer.bundleURI
。 - 极狐GitLab Runner 16.6 或更高版本。
- 在 CI/CD 流水线配置中,默认 Git 策略 设置为
git clone
。
服务器配置
您必须配置软件包存储位置。Gitaly 支持以下存储服务:
- AWS S3(或兼容)
- Azure Blob Storage
- 本地文件存储(不推荐)
配置 Azure Blob 存储
如何为 Bundle URI 配置 Azure Blob 存储取决于您的安装类型。对于自编译安装,必须在极狐GitLab 之外设置 AZURE_STORAGE_ACCOUNT
和 AZURE_STORAGE_KEY
环境变量。
{{< tabs >}}
{{< tab title=”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' # or 'AZURE_STORAGE_SAS_TOKEN'
}
gitaly['configuration'] = {
bundle_uri: {
go_cloud_url: 'azblob://<bucket>'
}
}
{{< /tab >}}
{{< tab title=”Self-compiled (source)” >}}
编辑 /home/git/gitaly/config.toml
并配置 go_cloud_url
:
[bundle_uri]
go_cloud_url = "azblob://<bucket>"
{{< /tab >}}
{{< tab title=”Self-compiled (source)” >}}
编辑 /home/git/gitaly/config.toml
并配置 go_cloud_url
:
[bundle_uri]
go_cloud_url = "gs://<bucket>"
{{< /tab >}}
{{< /tabs >}}
配置 S3 存储
要配置 S3 存储身份验证:
- 如果您使用 AWS CLI 进行身份验证,可以使用默认的 AWS 会话。
- 否则,您可以使用
AWS_ACCESS_KEY_ID
和AWS_SECRET_ACCESS_KEY
环境变量。对于自编译安装,在极狐GitLab 之外设置环境变量。
有关更多信息,请参阅 AWS 会话文档。
目标存储桶和区域使用 go_cloud_url
选项进行配置。
{{< tabs >}}
{{< tab title=”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'
}
}
{{< /tab >}}
{{< tab title=”Self-compiled (source)” >}}
编辑 /home/git/gitaly/config.toml
并配置 go_cloud_url
:
[bundle_uri]
go_cloud_url = "s3://<bucket>?region=us-west-1"
{{< /tab >}}
{{< /tabs >}}
配置 S3 兼容服务器
S3 兼容服务器(如 MinIO)配置类似于 S3,但增加了 endpoint
参数。
支持以下参数:
-
region
:AWS 区域。 -
endpoint
:端点 URL。 -
disabledSSL
:值为true
时禁用 SSL。 -
s3ForcePathStyle
:值为true
时强制使用路径样式寻址。
{{< tabs >}}
{{< tab title=”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'
}
}
{{< /tab >}}
{{< tab title=”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"
{{< /tab >}}
{{< /tabs >}}
生成软件包
正确配置 Gitaly 后,Gitaly 可以生成软件包,这是一个手动过程。要为 Bundle URI 生成软件包,请运行:
sudo -u git -- /opt/gitlab/embedded/bin/gitaly bundle-uri \
--config=<config-file> \
--storage=<storage-name> \
--repository=<relative-path>
此命令生成软件包并将其存储在配置的存储服务上。Gitaly 不会自动刷新生成的软件包。当您想生成更新版本的软件包时,必须再次运行该命令。
您可以使用 cron(8)
等工具调度此命令。
Bundle URI 示例
在以下示例中,我们演示了使用和不使用 Bundle URI 克隆 gitlab.com/gitlab-org/gitlab.git
的区别。
$ git -c transfer.bundleURI=false clone https://gitlab.com/gitlab-org/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://gitlab.com/gitlab-org/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.
在上述示例中:
- 不使用 Bundle URI 时,从极狐GitLab 服务器接收了 5,271,177 个对象。
- 使用 Bundle URI 时,从极狐GitLab 服务器接收了 1,322,255 个对象。
这种减少意味着极狐GitLab 需要打包较少的对象(在上述示例中,大约是对象数量的四分之一),因为客户端首先从存储服务器下载了软件包。
软件包安全
软件包通过签名 URL 使客户端可以访问。签名 URL 是提供有限权限和时间来发出请求的 URL。要查看您的存储服务是否支持签名 URL,请参阅您的存储服务文档。