如何使用 docker 执行器禁用同一个 gitlab 运行器上的并发作业?

Lau*_*hel 8 gitlab docker gitlab-ci gitlab-ci-runner

我正在使用 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
Run Code Online (Sandbox Code Playgroud)

特别注意两个选项

concurrent = 1
Run Code Online (Sandbox Code Playgroud)

和

[[runners]]
  limit = 1
Run Code Online (Sandbox Code Playgroud)

现在,我有一个管道,其中某些阶段有多个作业。从上面的运行器配置来看,我希望每个作业都会按顺序一个接一个地运行。然而,这些作业在同一个运行器上同时运行,导致大多数作业由于 git 锁而失败。

为什么会这样?如何真正禁用运行器中的并发?似乎禁用并发是我唯一的选择。事实上,我试图研究如何使其以并发方式工作,例如在我的.gitlab-ci.yml类似中GIT_CLONE_PATH定义

variables:
  GIT_CLONE_PATH: ${CI_BUILDS_DIR}/${CI_CONCURRENT_ID}/${CI_PROJECT_NAME}
Run Code Online (Sandbox Code Playgroud)

但这不起作用,因为$CI_CONCURRENT_IDgitlab 没有正确填充(它始终为 0,无论发生什么)。

增加跑步者的数量并不是一个解决方案,因为我仍然可以观察到完全相同的效果。有时,多个作业仍会在同一时间在同一个运行器上运行。不可能没有解决办法吧?我该如何解决这个问题?

最后,我想使用多个运行程序,但当然要分配最多一个作业/运行程序,否则我的管道不可靠(即它们可能会因为那些烦人的 git 锁错误而失败)。为了实现这一点,我需要禁用运行程序中的并发性。

Ori*_*gin 1

如果您希望一次在第一阶段运行作业,您可以使用资源组选项。

job1:
 resource_group: team
 script:
   - echo "Hello"

job2:
 resource_group: team
 script:
   - echo "hai"
Run Code Online (Sandbox Code Playgroud)

在这种情况下,job1 将运行,并且只有在它完成后,其他作业才会运行。

  • 我想在给定的跑步者上一次运行一个。如果我只有一个运行程序,我想按顺序运行所有作业。如果我有 2 个运行程序,我希望每个运行程序并行执行作业。在这种情况下,我不希望同一个跑步者一次承担超过 1 份工作。 (3认同)