定时任务
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
配置修改为 1h
或 5m
格式的值。
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"
参考
- Documentation need more details about the --schedule Argument #446
- How to use cron scheduling in drone 1.0.0-rc.1
- https://docs.drone.io/cron/
- https://docs.drone.io/cli/cron/drone-cron-add/
- https://docs.drone.io/pipeline/docker/syntax/trigger/#by-cron
- https://docs.drone.io/server/reference/drone-cron-interval/
- https://docs.drone.io/api/cron/cron_trigger/