{{< 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 可以:

  1. 加速与极狐GitLab 服务器连接较差的用户的克隆和获取。软件包可以存储在 CDN 上,使其在全球范围内可用。
  2. 减轻运行 CI/CD 作业的服务器负载。如果 CI/CD 作业可以预加载来自其他地方的软件包,则增量获取缺失对象和引用的剩余工作对服务器的负载会少得多。

前提条件

  1. Git 客户端必须启用 Git 配置 transfer.bundleURI
  2. 极狐GitLab Runner 16.6 或更高版本。
  3. 在 CI/CD 流水线配置中,默认 Git 策略 设置为 git clone

服务器配置

您必须配置软件包存储位置。Gitaly 支持以下存储服务:

  1. AWS S3(或兼容)
  2. Azure Blob Storage
  3. 本地文件存储(不推荐

配置 Azure Blob 存储

如何为 Bundle URI 配置 Azure Blob 存储取决于您的安装类型。对于自编译安装,必须在极狐GitLab 之外设置 AZURE_STORAGE_ACCOUNTAZURE_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 存储身份验证:

  1. 如果您使用 AWS CLI 进行身份验证,可以使用默认的 AWS 会话。
  2. 否则,您可以使用 AWS_ACCESS_KEY_IDAWS_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 参数。

支持以下参数:

  1. region:AWS 区域。
  2. endpoint:端点 URL。
  3. disabledSSL:值为 true 时禁用 SSL。
  4. 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.

在上述示例中:

  1. 不使用 Bundle URI 时,从极狐GitLab 服务器接收了 5,271,177 个对象。
  2. 使用 Bundle URI 时,从极狐GitLab 服务器接收了 1,322,255 个对象。

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

软件包安全

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