使用 Gitlab CI 在每次成功作业后终止 Spot 实例

问题描述

我几天来一直在研究 Gitlab CI。我已将 EC2 -ASG 设置为带有 Spot 实例的运行程序。

我想知道我们有没有什么解决方案可以在作业成功后立即删除现货实例。

以下是 gitlab 运行器配置。

concurrent = 2
check_interval = 3

[session_server]
  session_timeout = 1800

[[runners]]
  name = "shell-runner"
  url = "https://gitlab.com/"
  token = "xxxx-xxxx"
  executor = "shell"
  limit = 1
  [runners.custom_build_dir]
  [runners.cache]
    [runners.cache.s3]
    [runners.cache.gcs]
    [runners.cache.azure]

[[runners]]
  name = "docker-machine-runner"
  url = "https://gitlab.com/"
  token = "xxxx-xyxyxyxy"
  executor = "docker+machine"
  limit = 1
  [runners.custom_build_dir]
  [runners.cache]
    [runners.cache.s3]
    [runners.cache.gcs]
    [runners.cache.azure]
  [runners.docker]
    tls_verify = false
    image = "docker:latest"
    privileged = false
    disable_entrypoint_overwrite = false
    oom_kill_disable = false
    disable_cache = false
    volumes = ["/cache"]
    shm_size = 0
  [runners.machine]
    IdleCount = 0
    IdleTime = 1800
    MaxBuilds = 100
    MachineDriver = "amazonec2"
    MachineName = "gitlab-docker-machine-%s"
    MachineOptions = [
    "amazonec2-region=us-west-2","amazonec2-ssh-user=ubuntu","amazonec2-vpc-id=vpc-xxxx","amazonec2-subnet-id=subnet-xxx","amazonec2-use-private-address=true","amazonec2-instance-type=t3a.medium","amazonec2-ami=ami-xxx","amazonec2-zone=a","amazonec2-security-group=gitlab-runner-sg","amazonec2-request-spot-instance=true","amazonec2-spot-price=0.025"
    ]

我在上述配置中有两个运行器,即 shell 和 docker-machine。

目前,它根本不会删除 Spot 队列,如果我设置了 amazonec2-block-duration-minutes=20 标志,我猜它会将 Spot 实例保留 20 分钟,然后将其删除

我正在寻找一种解决方案,以便在每个作业成功后删除 Spot 实例和/或它可以等待其他作业并被终止。

在上面的 docker-machine-runner 中,需要更改什么配置才能实现这一点?

或者我们可以做任何其他自动化来实现它吗?

如果需要更多信息,请告诉我。

提前致谢。

解决方法

我昨天回答了一个类似的问题,关于我如何监控我的跑步者平台。完整帖子在这里:Start build on a windows ec2 with gitlab runner

我在某处运行了一个小应用程序,它不断轮询各种 Gitlab API 以检索待处理作业的数量和可用运行程序的数量。然后,根据我定义的一些阈值,我将增加或减少跑步者的数量,直至达到一个阈值。

例如,假设我一次最多需要 5 个跑步者,并且在增加跑步者数量(最多 5 个)之前,我希望队列中的作业不超过 5 个。这是我要做的(从链接的帖子中复制):

  1. 点击 Runners API 获取跑步者的数量。
  2. 点击项目 API 以获取所有项目并对其进行过滤以仅保留启用了管道/CI 的项目。您也可以存储此号码,这样您就不必每次都拨打此电话。
  3. 为每个项目点击 Pipelines API 以获取所有待处理/进行中的 Pipelines。
  4. 为每个管道点击 Jobs API 以获取所有待处理的作业。
  5. 如果没有跑步者但有待处理的作业,请添加 1 个跑步者。
  6. 如果有超过 1 个跑步者但少于最大跑步者,并且超过了作业阈值,则将 1 个跑步者添加到最大值。
  7. 如果有 1 个或多个 runners 并且没有待处理的作业,则销毁一个休眠的 runner(并从 Gitlab 中取消注册,以便 Runners API 调用保持干净)。 睡一两分钟,然后从顶部循环。

使用的各种 API 是: