运行 具有特定标签的跑步者的特定工作
Run specific jobs on runners with specific tags
上下文
我正在努力学习每个 commit/push/merge 的自动化测试,并开始探索 Gitlab CI。我在我的 MacBook 上安装了 Gitlab Runner。我注册了两个 运行ners,一个执行者是 shell
,另一个是 kubernetes
.
我正在尝试设置一个 Gitlab CI,它适用于这两个 运行ners(或者 运行我同事机器上安装的相同类型的 ners)。
问题描述
我已经按照官方教程设置了管道。流水线有一个构建阶段,几个编排阶段,基本上是做冒烟测试,还有一个最终部署阶段。编排阶段是 运行ner 独立的,但是构建步骤对于 kubernetes
和 shell
运行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
上下文
我正在努力学习每个 commit/push/merge 的自动化测试,并开始探索 Gitlab CI。我在我的 MacBook 上安装了 Gitlab Runner。我注册了两个 运行ners,一个执行者是 shell
,另一个是 kubernetes
.
我正在尝试设置一个 Gitlab CI,它适用于这两个 运行ners(或者 运行我同事机器上安装的相同类型的 ners)。
问题描述
我已经按照官方教程设置了管道。流水线有一个构建阶段,几个编排阶段,基本上是做冒烟测试,还有一个最终部署阶段。编排阶段是 运行ner 独立的,但是构建步骤对于 kubernetes
和 shell
运行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