Gitlab Runner Shell 执行器用于在多个服务器中运行作业

问题描述 投票:0回答:1

我将 gitlab-runner 安装到 3 台服务器上,并将其配置为 shell 执行器。我的跑步者是特定跑步者而不是共享跑步者。我没有使用标签。我的目的是,我想同时在 3 个服务器中执行 .gitlab-ci.yml 指令。我的模板 yaml 如下。

stages:
  - test
test:
  stage:
    - hostname

执行此 yml 时,我希望此 yaml 在 3 个服务器中执行,但它仅在我的 1 个服务器中执行,当我再次触发运行器时,它会在我的另一台服务器中执行。 shell执行器有能力做到这一点吗?怎么做?我应该改变我的方法吗?

注意:发布此内容后,我尝试使用标签方法。当我注册运行程序时,我为服务器创建了特定标签,并在 gitlab-ci.yaml 文件中使用这些标签来运行作业。使用这种方法,所有作业都在相关标签中运行,但它们不会同时运行。此外,此方法会导致 gitlab-ci.yaml 中出现重复的行,因为我将在所有服务器中执行大部分相同的操作。

linux gitlab gitlab-ci gitlab-ci-runner
1个回答
0
投票

在 GitLab CI 中,当执行管道时,所有能够运行的作业都被放置在 FIFO(先进先出)队列中。如果 gitlab-runner 当前没有运行作业,它会不断轮询该队列,以查看是否有该运行程序可以处理的可用作业(基于标签、它来自的项目、可用配额(如果使用 gitlab.com)等.) 如果是这样,则取消该作业并开始执行它。

每个作业都是队列中的一个对象,因此一旦一个运行程序抓住它并开始工作,其他运行程序就无法从队列中抓取它,因此单个作业不可能在多个运行程序上运行。

您需要的是并行运行多个相同的作业,幸运的是,只要您在 15.9 或更高版本上使用 GitLab,GitLab CI 就有一个功能可以做到这一点。

如果您只是希望同一个作业运行多次,而不同作业之间没有任何变化,您只需将

parallel
关键字添加到您的作业定义中,并向其传递一个整数值,表示您希望它运行的次数:

# Using the example from https://docs.gitlab.com/ee/ci/yaml/#parallel
test:
  script: rspec
  parallel: 5

当此管道运行时,GitLab 将创建 5 个名为“test”的作业,每个作业运行命令

rspec
,并将它们放入队列中。

关于

parallel
关键工作需要注意的一件事是,在创建作业并将其放入队列后,它们实际上可能不会并行运行。作业的运行方式取决于您可用的 gitlab-runner 进程的数量以及您使用的配置。为了简单起见,假设您有一个 gitlab-runner 进程,并且它被配置为一次仅运行一项作业。在这种情况下,运行程序将拉下第一个作业并运行它,但其他四个作业必须等到第一个作业完成,而第五个作业则必须等待队列中前面的所有四个作业。

但是,如果您有 5 个 gitlab-runner,或者您的运行程序配置为能够并行运行多个作业(有关如何配置运行程序以运行多个作业的更多信息,请参阅此处的文档,所有 5 个作业都将运行立刻。

现在,如果您希望每个作业并行运行,但在不同区域的不同运行器上运行,则应通过作业上以及所有这三个运行器上的特定标签来限制该作业可以在哪些运行器中运行,并且它们应该是配置为一次仅运行一个作业(

concurrent
字段应为
1
)。如果这些运行程序一次可以运行 1 个以上作业,则其中一个可能会从队列中获取多个作业。

© www.soinside.com 2019 - 2024. All rights reserved.