如何使用 docker executor 在同一个 gitlab 运行器上禁用并发作业?
Posted
技术标签:
【中文标题】如何使用 docker executor 在同一个 gitlab 运行器上禁用并发作业?【英文标题】:How can I disable concurrent jobs on the same gitlab runner with docker executor? 【发布时间】:2022-01-01 15:35:14 【问题描述】:我正在使用 gitlab 社区版 14.4.1 以及一个 14.4.0 版的单个 gitlab 运行器。其配置如下:
concurrent = 1
check_interval = 0
[session_server]
session_timeout = 1800
[[runners]]
name = "My runner"
limit = 1
url = "https://my-gitlab-instance.com"
token = "my-gitlab-token"
executor = "docker"
[runners.custom_build_dir]
enabled = true
[runners.cache]
[runners.cache.s3]
[runners.cache.gcs]
[runners.cache.azure]
[runners.docker]
tls_verify = false
image = "gitlab/dind:latest"
privileged = false
disable_entrypoint_overwrite = false
oom_kill_disable = false
disable_cache = false
volumes = ["/var/run/docker.sock:/var/run/docker.sock", "/builds:/builds:rw", "/cache"]
shm_size = 1000000000
特别注意这两个选项
concurrent = 1
和
[[runners]]
limit = 1
现在,我有一个管道,其中某些阶段有多个作业。从上面的运行器配置中,我希望每个作业将一个接一个地依次运行。但是,这些作业在同一个 runner 上同时运行,导致它们中的大多数因为 git 锁而失败。
为什么会这样?我怎样才能真正禁用跑步者中的并发性?似乎禁用并发是我唯一的选择。事实上,我试图研究如何使其以并发方式工作,例如在我的.gitlab-ci.yml
中定义GIT_CLONE_PATH
像这样
variables:
GIT_CLONE_PATH: $CI_BUILDS_DIR/$CI_CONCURRENT_ID/$CI_PROJECT_NAME
但这不起作用,因为 gitlab 未正确填充 $CI_CONCURRENT_ID
(无论发生什么,它始终为 0)。
增加跑步者的数量不是解决方案,因为我仍然可以观察到同样的效果。有时,多个作业仍然会同时在同一个运行器上运行。不可能没有变通办法,对吧?我该如何解决这个问题?
最后,我想使用多个跑步者,但当然最多分配一个作业/跑步者,否则我的管道不可靠(即它们可能会因为那些烦人的 git 锁定错误而失败)。为此,我需要禁用跑步者中的并发性。
【问题讨论】:
您的配置看起来正确。如果您只有 1 名跑步者,则一次只能运行 1 份工作。听起来您可能有超过 1 名跑步者意外注册并运行。在 UI 中检查您的注册跑步者,以确认只有 1 名注册跑步者。仔细检查您的运行器配置文件,它完全包含只一个运行器,然后重新启动运行器以确保它使用的是最新配置。在您的工作中回显$CI_RUNNER_ID
以确认您的工作使用相同的单数跑步者。
好吧,他们使用相同的单数运行器,因为大多数情况下,作业会因为 git locks 错误而崩溃,因为它们都在同一个运行器上同时运行。在 gitlab 上查看这些作业时,我可以清楚地看到它们都运行在同一个 runner 上(右侧显示 runner 的名称)。
【参考方案1】:
如果您希望一次在第一阶段运行作业,您可以使用resource groups 选项。
job1:
resource_group: team
script:
- echo "Hello"
job2:
resource_group: team
script:
- echo "hai"
在这种情况下,job1 将运行,只有在它完成后,另一个作业才会运行。
【讨论】:
我想在给定的跑步者上一次运行一个。如果我只有一个跑步者,我想按顺序运行所有作业。如果我有 2 个跑步者,我希望每个跑步者都并行执行作业。在这种情况下,我不希望同一个跑步者一次接一份以上的工作。以上是关于如何使用 docker executor 在同一个 gitlab 运行器上禁用并发作业?的主要内容,如果未能解决你的问题,请参考以下文章
gitlab-runner 的 executors 之 docker
Gitlab CI/CD 之 Gitlab Runner Docker Executor 缓存问题
Gitlab docker executor - 在 before_script 之后缓存图像
GitLab Runner Docker Executor 中的缓存层 - 长时间 DinD 容器