配置 Runners
在 GitCode CI/CD 中,runners 运行.codechina-ci.yml
定义的代码。Runner 是一种轻量级,高度可扩展的代理,它通过 CI/CD 的协调器 API 提取 CI 流水线任务,运行该流水线任务,并将结果发送回 GitCode 实例。
Runners 由管理员创建,并在 GitCode UI 中可见。
Runners 可以特定于某些项目,也可以适用于所有项目。
Runners 类型
Runners 共有三种类型:
- 共享 runners 对于所有组织和项目。
- 组 runners 对于组中的所有项目和子组织。
- 特定 runners 针对特定项目。
共享 Runners
GitCode 实例中的每个项目都可以使用共享 Runners 。
当你有多个要求相似的流水线任务时,请使用共享 Runners。 你可以让几个 Runner 处理多个项目,而不是在许多项目中有多个 Runner 空闲。
如果你使用的是 GitCode 的自我管理实例:
- 你的管理员可以通过查看此处的说明来安装和注册共享 runner。
- 管理员还可以为每个组配置最大的共享 Runner 流水线分钟数。
如果你使用的是 GitCode:
- 你可以从 GitCode 维护的共享 runners 列表中进行选择。
- 共享 runners 消耗你帐户中包含的流水线分钟数 。
共享 Runners 如何选择流水线任务
共享 runners 通过使用合理使用队列来处理流水线任务。 此队列可防止项目创建数百个流水线任务并使用所有可用的共享 Runners 资源。
合理使用队列算法根据已在共享 Runners 上运行的流水线任务数量最少的项目分配流水线任务。
示例 1
如果这些流水线任务在队列中:
- 项目 1 的工作 1
- 项目 1 的工作 2
- 项目 1 的工作 3
- 项目 2 的工作 4
- 项目 2 的工作 5
- 项目 3 的工作 6
合理使用算法按以下顺序分配流水线任务:
- 首先选择流水线任务 1,因为它在没有正在运行的流水线任务的项目(即所有项目)中具有最低的流水线任务编号。
- 接下来是流水线任务 4,因为现在 4 是来自没有正在运行的流水线任务的项目中最低的流水线任务编号(项目 1 有正在运行的流水线任务)。
- 接下来是流水线任务 6,因为 6 现在是没有正在运行的流水线任务的项目中最低的流水线任务编号(项目 1 和 2 有正在运行的流水线任务)。
- 接下来是流水线任务 2,因为在运行的流水线任务数量最少的项目(每个都有 1)中,它是最低的流水线任务数量。
- 接下来是流水线任务 5,因为项目 1 现在有 2 个正在运行的流水线任务,而流水线任务 5 是项目 2 和项目 3 之间剩余的最低编号。
- 最后是工作 3…,因为这是剩下的唯一工作。
示例 2
如果这些流水线任务在队列中:
- 项目 1 的工作 1
- 项目 1 的工作 2
- 项目 1 的工作 3
- 项目 2 的工作 4
- 项目 2 的工作 5
- 项目 3 的工作 6
合理使用算法按以下顺序分配流水线任务:
- 首先选择流水线任务 1,因为它在没有正在运行的流水线任务的项目(即所有项目)中具有最低的流水线任务编号。
- 我们完成工作 1。
- 接下来是流水线任务 2,因为完成流水线任务 1 后,所有项目都再次运行 0 个流水线任务,而 2 是最低的可用流水线任务号。
- 接下来是流水线任务 4,因为在项目 1 运行流水线任务的情况下,项目 4 在没有运行流水线任务的项目(项目 2 和 3)中是最低的。
- 我们完成工作 4。
- 接下来是流水线任务 5,因为完成了流水线任务 4,所以项目 2 没有再次运行的流水线任务。
- 接下来是流水线任务 6,因为项目 3 是唯一没有运行流水线任务的项目。
- 最后,我们选择流水线任务 3…,因为它再次是唯一剩下的流水线任务。
启用共享 Runners
在 GitCode 上,默认情况下在所有项目中启用共享 runners 。
你还可以为单个项目启用共享 runners。
要启用共享 runners:
- 转到项目的 设置> DevOps,然后展开 Runners部分。
- 点击 为此项目启用共享 runners。
禁用共享 Runners
你可以为单个项目禁用共享 runners。 你必须具有项目或组织的所有者权限。
要为项目禁用共享 runners:
- 转到项目的 设置> DevOps, 然后展开 Runners部分。
- 在 共享 runners区域中,单击 为此项目启用共享 runners 使开关变灰。
组织 Runners
当你希望组中的所有项目都可以访问一组 runners 时,请使用" 组 runners" 。
组 runners 使用先进先出 (FIFO) 队列处理流水线任务。
创建组 Runner
你可以为自己管理的 GitCode 实例或 GitCode.com 创建一个组 Runner。 你必须具有该组的所有者权限 。
创建组 runner:
- 安装 Runner。
- 转到你要使 Runner 运行的组。
- 去 设置> DevOps,然后展开 Runners 部分。
- 记下 URL 和令牌。
- 注册 Runner。
查看和管理组 Runners
你可以查看和管理组,其子组和项目的所有 runners。 你可以为自己管理的 GitCode 实例或 gitcode.net 执行此操作。 你必须具有该组的所有者权限 。
-
转到要查看 runners 的组。
-
去 设置> DevOps,然后展开 Runners 部分。
-
显示以下字段。
Attribute Description 类型 以下一种或多种状态:共享,组,特定,锁定或暂停 Runner 令牌 令牌用于标识 Runner,并且 Runner 用于与 GitCode 实例进行通信 描述 创建 runner 时的描述 版本 Runner 版本 IP 地址 注册了运行程序的主机的 IP 地址 项目 Runner 分配到的项目数 流水线任务 Runner所从事的流水线任务总数 标签 与 Runner 相关的标签 最后联络人 指示 GitCode 实例最后一次与 Runner 联系的时间戳
在此页面上,你可以从组、其子组和项目中编辑、暂停和删除 runners。
暂停或移除组 runner
你可以为自己管理的 GitCode 实例或 gitcode.net 暂停或删除组 runner。 你必须具有该组的所有者权限 。
- 转到你要删除或暂停 Runner 的组。
- 去 设置> DevOps,然后展开 Runners部分。
- 点击 暂停 或 移除 runner。
- 如果你暂停由多个项目使用的组 Runner,则 Runner 会暂停所有项目。
- 从组视图中,你无法删除分配给多个项目的 runner。 你必须先从每个项目中将其删除。
- 在确认对话框中,单击确定 。
特定 Runners
当你想为特定项目使用 runners 时,可使用特定 runners 。 例如,当你拥有:
- 有特定要求的流水线任务,例如需要凭据的部署流水线任务。
- 具有大量CI 活动的项目可以从与其他 runners 分离中受益。
你可以设置一个特定的 Runner,以供多个项目使用。 必须为每个项目明确启用特定的 runner。
特定 runner 通过使用先进先出( FIFO )队列来处理流水线任务。
注意:特定 runners 不会自动与 fork 项目共享。 fork 确实会复制克隆存储库的 CI/CD 设置。
创建一个特定的 Runner
你可以为自己管理的 GitCode 实例或 gitcode.net 创建特定的 Runner。 你必须具有项目的所有者权限 。
要创建特定的 runner:
- 安装 Runner。
- 转到项目的 设置> DevOps,然后展开 Runners 部分。
- 记下 URL 和令牌。
- 注册 Runner。
为特定项目启用特定 Runner
在为其创建的项目中提供了特定的 Runner。 管理员可以使特定的 Runner 应用于其他项目。
- 你必须具有项目的所有者权限。
- 特定的跑步者一定不能被锁定 。
要为项目启用或禁用特定的 runners:
- 转到项目的 设置> DevOps,然后展开 Runners 部分。
- 点击 为此项目启用 或 为此项目禁用。
防止为其他项目启用特定 Runner
你可以配置一个特定的 runner,使其"锁定"并且不能为其他项目启用。 首次注册 Runner时可以启用此设置,但以后也可以更改。
锁定或解锁 runner:
- 转到项目的 设置> DevOps,然后展开 Runners 部分。
- 找到你想要锁定或解锁的 runner。 确保已启用。
- 单击铅笔按钮。
- 选中 锁定到当前项目选项。
- 点击 保存更改。
为 Runner 设置最大流水线任务超时
对于每个 runner,你可以指定最大流水线任务超时时间 。 如果此超时时间小于项目定义的超时时间 ,则优先。
此功能可用于防止共享的 Runner 被具有较长超时(例如,一个星期)的工作的项目淹没。
未配置时,Runner 将不会覆盖项目超时。
此功能的工作原理:
示例 1- Runner 超时大于项目超时
- 你将 runner 的最大流水线任务超时 设置为 24 小时
- 你将项目的CI/CD 超时 设置为2 小时
- 你开始一个流水线任务
- 如果流水线任务时间更长,则2 小时后将超时
示例 2-未配置 Runner 超时
- 你从 runner 中删除最大流水线任务超时 配置
- 你将项目的CI/CD 超时 设置为2 小时
- 你开始一个流水线任务
- 如果流水线任务时间更长,则2 小时后将超时
示例 3- Runner 超时小于项目超时
- 你将 runner 的最大流水线任务超时 设置为30 分钟
- 你将项目的CI/CD 超时 设置为 2 小时
- 你开始一个流水线任务
- 如果流水线任务时间更长,则30 分钟后将超时
小心敏感信息
使用某些Runner Executors ,如果可以在 Runner 上运行流水线任务,则可以完全访问文件系统,从而可以运行该文件的任何代码以及 Runner 的令牌。 使用共享的 runner ,这意味着在 runner 上运行流水线任务的任何人都可以访问在 runner 上运行的任何其他人的代码。
另外,由于你可以访问 Runner 令牌,因此可以创建 Runner 的克隆并提交错误的流水线任务。
通过限制在大型公共 GitCode 实例上共享Runner 的使用、控制对 GitCode 实例的访问以及使用更安全的 Runner Executor ,可以轻松避免上述情况。
防止 Runners 泄露敏感信息
你可以保护 runners ,使他们不会泄露敏感信息。 当 runner 受到保护时,runner 仅选择在受保护分支或受保护标签上创建的流水线任务,而忽略其他流水线任务。
保护或取消保护 runner:
- 转到项目的 设置> DevOps,然后展开 Runner 部分。
- 找到你要保护或取消保护的 runner。 确保已启用。
- 单击铅笔按钮。
- 检查受保护的选项。
- 点击 保存更改。
Forks
每当 fork 一个项目时,它都会复制与其相关的流水线任务的设置。 这意味着,如果你已经为项目设置了共享的 Runners,并且有人 fork 了该项目,则共享的 Runners 也将为该项目的工作提供服务。
Runners 中的攻击向量
前面已经简要提到过,但是可以利用 Runners 的以下功能。 我们一直在寻找可以减轻这些安全注意事项的因素 。
重置项目的 Runner 注册令牌
如果你认为某个项目的注册令牌已公开,则应将其重置。 令牌可用于为该项目注册另一个 Runner。 然后可以使用该新 Runner 来获取秘密变量的值或克隆项目代码。
重置令牌:
- 转到项目的 设置> DevOps 。
- 展开流水线通用设置部分。
- 找到 Runner 令牌表单字段,然后单击 显示值按钮。
- 删除值并保存表单。
- 刷新页面后,展开 Runners 设置部分并检查注册令牌-应该更改它。
从现在开始,旧令牌将不再有效,并且不会在项目中注册任何新的 runner。 如果你使用任何工具来供应和注册新的 runner,则应更新这些工具中使用的令牌以反映新令牌的价值。
确定 Runner 的 IP 地址
知道 Runner 的 IP 地址可能很有用,以便你可以解决该 Runner 的问题。 GitCode 通过在轮询流水线任务时查看向 GitCode 发出的 HTTP 请求的源来存储和显示 IP 地址。 IP 地址始终保持最新,因此,如果 Runner IP 更改,它将在 GitCode 中自动更新。
共享 runners 和特定 runners 的 IP 地址可以在不同位置找到。
确定共享 Runner 的 IP 地址
要查看共享运 runner 的 IP 地址,你必须具有对 GitCode 实例的管理员访问权限。 要确定这一点:
- 访问 管理区域>概述> Runner。
- 在表中查找 Runner,你应该会看到IP Address列。
确定特定 Runner 的 IP 地址
若要查找特定项目的 runner 的 IP 地址,你必须具有该项目的所有者权限 。
- 转到项目的 设置> DevOps,然后展开 Runners部分。
- 在详细信息页面上,你应该看到IP 地址行。
使用标签来限制使用 Runner 的流水线任务数量
你必须设置一个 Runner 才能运行它在共享项目上可能遇到的所有不同类型的流水线任务。 如果不是标签,这对于大量项目将是有问题的。
通过将 Runner 标记为它可以处理的流水线任务类型,可以确保共享的 Runners 仅运行其能够运行的流水线任务 。
例如,在 GitCode 上,如果 Runners 包含运行 Rails 测试套件的适当依赖项,我们会将它们标记为rails
。
注册 Runner 时 ,其默认行为是仅选择带 标签的流水线任务 。 要更改此设置,你必须具有项目的所有者权限 。
要使 runner 选择无标签的工作,请执行以下操作:
- 转到项目的 设置> DevOps,然后展开 Runners部分。
- 找到你要选择未加标签的流水线任务的 Runner,并确保已启用它。
- 单击铅笔按钮。
- 选中运行未加标签的流水线任务选项。
- 单击保存更改按钮以使更改生效。
注意:不允许选择未标记的流水线任务时,runner 标签列表不能为空。
以下是一些不同变化的示例场景。
Runner 只运行标记的流水线任务
以下示例说明了将 Runner 设置为仅运行带标签的流水线任务的潜在影响。
示例 1:
- Runner 配置为仅运行带标签的流水线任务,并具有
docker
标签。 - 具有
hello
标签的流水线任务将被执行并卡住。
示例 2:
- Runner 配置为仅运行带标签的流水线任务,并具有
docker
标签。 - 具有
docker
标签的流水线任务将被执行并运行。
示例 3:
- Runner 配置为仅运行带标签的流水线任务,并具有
docker
标签。 - 没有定义标签的流水线任务将被执行并卡住。
Runner 可以运行未标记的流水线任务
以下示例说明了将 Runner 设置为运行带标签和未带标签的流水线任务的潜在影响。
示例 1:
- Runner 配置为运行未加标签的流水线任务,并具有
docker
标签。 - 没有定义标签的流水线任务将被执行并运行。
- 执行并运行定义了
docker
标签的第二项流水线任务。
示例 2:
- Runner 配置为运行未加标签的流水线任务,并且未定义标签。
- 没有定义标签的流水线任务将被执行并运行。
- 卡有定义了
docker
标签的第二项流水线任务。