如何使用 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 容器

在 docker 环境中成功 CI 后如何部署到自定义服务器?

Jenkins分布式与并行