运行 具有特定标签的跑步者的特定工作

Run specific jobs on runners with specific tags

上下文

我正在努力学习每个 commit/push/merge 的自动化测试,并开始探索 Gitlab CI。我在我的 MacBook 上安装了 Gitlab Runner。我注册了两个 运行ners,一个执行者是 shell,另一个是 kubernetes.

我正在尝试设置一个 Gitlab CI,它适用于这两个 运行ners(或者 运行我同事机器上安装的相同类型的 ners)。

问题描述

我已经按照官方教程设置了管道。流水线有一个构建阶段,几个编排阶段,基本上是做冒烟测试,还有一个最终部署阶段。编排阶段是 运行ner 独立的,但是构建步骤对于 kubernetesshell 运行ners 是不同的,因为前者需要镜像构建而后者需要在之后设置虚拟环境车轮建筑。 运行ners 分别工作(如果我评论不适用于 运行ners 的工作),但我希望他们都能够使用相同的配置文件,以便 运行ners 不是问题,但似乎无法使其正常工作。

这是我创建的虚拟表示:

...  # default section

build_job_kubernetes:
    stage: build
    image:
        name: gcr.io/kaniko-project/executor:debug
        entrypoint: [""]
    script: ...  # commands
    rules:
        - if: '$CI_RUNNER_TAGS =~ /*kubernetes*/'
    tags:
        - kubernetes-executor

build_job_shell:
    stage: build
    script: ...  # commands
    rules:
        - if: '$CI_RUNNER_TAGS =~ /*shell*/'
    tags:
        - shell-executor

... # other sections

如果我在两个 运行ner 都可用时尝试 运行 管道,它会完全忽略这两个作业。如果我删除规则,两个作业将开始在不同的 运行ners 上执行,这是不必要的。如果 运行 中的一个被暂停,它不会进入下一阶段说它卡住了,即使我已经指定 needs 是可选的。

问题

为什么我写的正则表达式条件不起作用?它不需要仅使用这些规则,但我希望有一个配置,其中只需要作业 运行,并且如果 运行 不同类型的 ner 丢失,它不会卡住。


我可以想到一个选项,我基本上有两组独立的管道,一个用于每种类型的 运行ner,并且这两个将 运行 并行。我想避免这种不需​​要的情况。我希望我的管道根据可用性选择 运行ner。显然,必须确保在 kubernetes 上的 运行 构建阶段之后编排阶段不会在 shell 运行ner 上运行,因为那时它可能运行 在过时的存储库上。与此相比,拥有两个并行管道当然是一个更好的选择,但我想尽可能避免它。

之所以rules:条件对$CI_RUNNER_TAGS不起作用是因为rules:是在创建管道时进行评估的,只是简单地确定是否包含该作业在创建的管道中。因为runner创建后才能pick job,所以这个条件无法评估。

want my pipeline to pick up the runner based on availability

不幸的是,您可以控制所使用的运行程序的唯一机制是作业标签。管道无法选择他们的跑步者,部分原因是跑步者通过“拉”机制接收工作——所有跑步者定期轮询 GitLab 以获取可用的工作(匹配他们自己的标签,如果适用)——跑步者选择工作,而不是相反。所以这是不可能的。

然而,您可以做的是将两个运行器分配给您的项目作为共享运行器,允许他们选择未标记的作业(或使用共享标签)。可以根据接任务的runner修改脚本逻辑。

例如,您可以在 script: 中使用 $CI_RUNNER_TAGS 的值来确定作业应该做什么,这取决于哪个跑步者是 运行 作业。那么你可以只做一份工作,而不是两份。

my_job:
  script: |
    if [[ "${CI_RUNNER_TAGS}" == "kubernetes-executor" ]]; then
        ./run_kube_build.sh
    else
        ./run_shell_build.sh
    fi