通过使用直接转移来迁移极狐GitLab 项目

  • Tier: 基础版, 专业版, 旗舰版
  • Offering: JihuLab.com, 私有化部署
History
    • 在极狐GitLab 15.6 中,在 JihuLab.com 上启用。
    • 新应用程序设置引入于极狐GitLab 15.8,bulk_import 功能标志被移除。
    • bulk_import_projects 功能标志在极狐GitLab 15.10 中被移除。

你可以迁移极狐GitLab 群组:

  1. 从极狐GitLab 私有化部署到 JihuLab.com
  2. 从 JihuLab.com 到极狐GitLab 私有化部署
  3. 从一个极狐GitLab 私有化部署到另一个实例
  4. 在同一个极狐GitLab 实例上

通过直接传输进行迁移会创建群组的新副本。如果你想移动群组而不是复制群组,可以在群组处于同一个极狐GitLab 实例时转移群组。与迁移群组相比,转移群组是一个更快和更完整的选项。

你可以通过两种方式迁移群组:

  1. 通过直接传输(推荐)。
  2. 通过上传导出文件

如果你从 JihuLab.com 迁移到极狐GitLab 私有化部署或极狐GitLab Dedicated 实例,管理员可以在实例上创建用户。

在极狐GitLab 私有化部署和极狐GitLab Dedicated 上,默认情况下迁移群组项 是不可用的。为了显示该功能,管理员可以在应用程序设置中启用它

通过直接传输迁移群组会将群组从一个地方复制到另一个地方。你可以:

  1. 一次复制许多群组。
  2. 在极狐GitLab UI 中,复制顶级群组到:
    • 另一个顶级群组。
    • 任何现有顶级群组的子群组。
    • 另一个极狐GitLab 实例,包括 JihuLab.com。
  3. API 中,复制顶级群组和子群组到这些位置。
  4. 复制带有项目的群组(处于beta阶段,未准备好用于生产使用)或不带项目的群组。复制带有群组的项目可用:
    • 在 JihuLab.com 上默认可用。

并非所有群组和项目资源都会被复制。请参阅下面的复制资源列表:

  1. 迁移的群组项
  2. 迁移的项目项

开始迁移后,你不应该对源实例上的导入群组或项目进行任何更改,因为这些更改可能不会复制到目标实例。

导入带有项目的群组处于beta阶段。此功能尚未准备好用于生产使用。

迁移特定项目#

在极狐GitLab UI 中使用直接传输迁移群组会迁移群组中的所有项目。如果你只想通过使用直接传输迁移群组中的特定项目,你必须使用 API

已知问题#

  1. 文件名超过 255 个字符的文件不会被迁移。
  2. 在极狐GitLab 16.1 及更早版本中,你不应该与计划的扫描执行策略一起使用直接传输。
  3. 在极狐GitLab 16.9 及更早版本中,你可能会看到 DiffNote::NoteDiffFileCreationError 错误。当此错误发生时,合并请求的差异上的备注的差异丢失,但备注和合并请求仍然会被导入。
  4. 当从源实例映射时,共享成员会被映射为目标实例上的直接成员,除非这些成员关系已经存在于目标实例上。这意味着在源实例上导入顶级群组到目标实例上的顶级群组时,始终映射到项目中的直接成员,即使源顶级群组包含必要的共享成员关系层次结构详细信息。
  5. 在极狐GitLab 17.0、17.1 和 17.2 中,导入的史诗和工作项会映射到导入用户而不是原始作者。

估计迁移时长#

估计通过直接传输迁移的时长是困难的。以下因素影响迁移时长:

  1. 源和目标极狐GitLab 实例上可用的硬件和数据库资源。源和目标实例上更多的资源可能会导致较短的迁移时长,因为:
    • 源实例接收 API 请求,并提取和序列化要导出的实体。
    • 目标实例运行作业并在其数据库中创建实体。
  2. 要导出的数据的复杂性和大小。例如,假设你想迁移两个不同的项目,每个项目有 1000 个合并请求。两个项目的迁移时间可能会非常不同,如果其中一个项目在合并请求上有更多的附件、评论和其他项目。因此,项目上的合并请求数量是预测项目迁移所需时间的一个较差的指标。

没有准确的公式可以可靠地估计迁移。然而,每个流水线工作者导入项目关系的平均持续时间可以帮助你了解导入项目可能需要多长时间:

项目资源类型导入记录的平均时间(以秒为单位)
空项目2.4
仓库20
项目属性1.5
成员0.2
标签0.1
里程碑0.07
徽章0.1
议题0.1
代码片段0.05
代码片段仓库0.5
看板0.1
合并请求1
外部拉取请求0.5
受保护分支0.1
项目功能0.3
容器过期策略0.3
服务台设置0.3
发布0.1
CI 流水线0.2
提交备注0.05
Wiki10
上传0.5
LFS 对象0.5
设计0.1
Auto DevOps0.1
流水线计划0.5
引用5
推送规则0.1

虽然预测迁移时长很困难,但我们已经看到:

  • 100 个项目(19.9k 议题,83k 合并请求,100k+ 流水线)在 8 小时内迁移完成。
  • 1926 个项目(22k 议题,160k 合并请求,110 万 流水线)在 34 小时内迁移完成。

如果你正在迁移大型项目并遇到超时或迁移时间过长的问题,请参阅减少迁移时长

减少迁移时长#

以下是一些减少使用直接传输进行迁移时长的策略。

为目标实例添加 Sidekiq 工作者#

单次直接传输迁移每次运行五个实体(群组或项目)进行导入, 无论目标实例上有多少可用的工作者。 目标实例上更多的 Sidekiq 工作者可以减少导入每个实体所需的时间, 只要实例有足够的资源来处理额外的并发作业。 在极狐GitLab 16.8 及更高版本中,随着关系的批量导入和导出引入, 目标实例上的可用工作者数量变得更加重要。

有关如何向目标实例添加 Sidekiq 工作者的更多信息,请参阅 Sidekiq 配置

重新分配大型项目或启动单独的迁移#

源实例上的工作者数量应该足够以并行导出 5 个并发实体(对于每个正在运行的导入)。否则,当目标等待导出数据变得可用时,可能会出现延迟和潜在的超时。

将项目分布在不同的群组中有助于避免超时。如果几个大型项目在同一个群组中,你可以:

  1. 将大型项目移到不同的群组或子群组。
  2. 为每个群组和子群组启动单独的迁移。

极狐GitLab UI 只能迁移顶级群组。使用 API,你也可以迁移子群组。

限制#

History
    • 极狐GitLab 16.7 中移除了迁移的八小时时间限制。

在通过直接传输进行迁移时适用硬编码限制。

限制描述
6每分钟每个用户由目标极狐GitLab 实例允许的最大迁移次数。引入于极狐GitLab 15.9。
210 秒等待解压归档文件的最大秒数。
50 MBNDJSON 行可以具有的最大长度。
5 分钟源实例上空导出状态被引发的最大秒数。

可配置限制也可用。

在极狐GitLab 16.3 及更高版本中,以下先前硬编码的设置是可配置的:

  • 可以从源实例下载的最大关系大小(设置为 5 GiB)。
  • 解压缩归档的最大大小(设置为 10 GiB)。

你可以使用这些 API 测试最大关系大小限制:

  1. 群组关系导出 API
  2. 项目关系导出 API

如果任一 API 生成的文件大于最大关系大小限制,通过直接传输迁移群组会失败。

可见性规则#

迁移后:

  1. 私有群组和项目保持私有。
  2. 内部群组和项目:
    • 在内部群组中复制时保持内部,除非内部可见性被限制。在这种情况下,群组和项目变为私有。
    • 在私有群组中复制时变为私有。
  3. 公共群组和项目:
    • 在公共群组中复制时保持公共,除非公共可见性被限制。在这种情况下,群组和项目变为内部。
    • 在内部群组中复制时变为内部,除非内部可见性被限制。在这种情况下,群组和项目变为私有。
    • 在私有群组中复制时变为私有。

如果你在源实例上使用了私有网络以隐藏内容不被公众查看, 请确保在目标实例上有类似的设置,或者导入到一个私有群组。

通过直接传输进行迁移的过程#

请参阅通过直接传输迁移群组和项目