令人困惑的 Drone Cron [已解惑]

Published: 2023-04-07

Tags: Drone CI/CD

本文总阅读量

定时任务

Drone UI 上 Settings Cron Jobs 提供了定时任务创建面板,但是只能使用预置的几种:@hourly、@daily 等。

如果你计划使用 Cron,那么它肯定是不满足需求的,想要创建更灵活的 Cron 任务,需要借助 CLI 工具。

通过 Drone CLI 添加 Cron

安装 CLI

$ curl -L https://github.com/harness/drone-cli/releases/latest/download/drone_linux_amd64.tar.gz | tar zx
$ sudo install -t /usr/local/bin drone

认证

$ export DRONE_SERVER=http://drone2.yasking.org
$ export DRONE_TOKEN=H4hHLlS2jv73Db3LLXx7G4LCo1we40qb
$ drone info

Drone CLI 命令

注意事项:当前版本的 Drone 使用的 cron 库是老版本,即 6 位的 cron 表达式,第一位是秒。

# 添加
drone cron add --branch main sincerefly/cron-jobs minutes "* * * * *"

# 删除
drone cron rm sincerefly/cron-jobs minutes

# 查看
drone cron ls sincerefly/cron-jobs

# INFO
drone cron info sincerefly/cron-jobs minutes

# 启用
drone cron enable sincerefly/cron-jobs minutes

drone cron disable sincerefly/cron-jobs minutes

# 执行
drone cron exec sincerefly/cron-jobs minutes

Drone 配置

kind: pipeline
type: docker
name: the-cron

clone:
  depth: 1

steps:
- name: gold
  image: python:3.7-alpine
  commands:
  - /bin/sh prepare.sh
  - python3 -v

trigger:
  event:
  - push
  - cron
  cron:
  - minutes

这里 cron 指定的 “minutes” 就是通过 CLI 创建的定时器。

困惑与原因

添加定时器后,任务并没有按我预想的每分钟执行一次,我觉得是 .drone.yml 编写的有问题,改了几次都不符合预期,很让人困惑,所以战略性放弃了调试,隔了些天,偶然发现定时任务其实在运行,间隔半小时!

此时,使用搜索很容易在配置文档及问答网站找到了原因:Drone 的 Cron 并不是一个精准的定时触发器,它会间隔一段时间扫描一下待执行任务,看有没有到时间需要执行的,如果有,就执行这些任务,如果没有,继续等待下次扫描。

这个扫描间隔默认是 30 分钟,可以通过 DRONE_CRON_INTERVAL 配置修改为 1h5m 格式的值。

Please note even when you reduce the cron interval, you should not expect high levels of accuracy. Our primary design goal was to create a safe, efficient cron scheduler that prevents users from overloading the system; this comes at the expense of accuracy.

简单翻译就是我们不应该依赖 Drone Cron 的准确定,这样的设计是提供定时功能,同时最大可能保障系统性能及稳定的折中方案。

从 Drone 前端以及 DRONE_CRON_INTERVAL 配置来看,Drone 的设计并没有提供一个准确的 Cron 任务,如果你的任务对时间要求比较高,那么可以通过 API 调用触发:Build Create

补充:通过 API 触发 Cron 执行

$ curl -X POST -H "Authorization: Bearer H4hHLlS2jv73Db3LLXx7G4LCo1we40qb" "http://drone2.yasking.org/api/repos/sincerefly/cron-jobs/cron/minutes"

参考