为什么不使用 Github Action 自带的 schedule

Github

官方对与 schedule 的定义

Scheduled events(预定事件) The Schedule event allows you to trigger a workflow at a scheduled time.(该Schedule事件允许您在预定时间触发工作流。)
Note: The Schedule event can be delayed during periods of high loads of GitHub Actions workflow runs. High load times include the start of every hour. To decrease the chance of delay, schedule your workflow to run at a different time of the hour.

注意:Schedule在 GitHub 操作工作流运行的高负载期间,事件可能会延迟。高负载时间包括每小时开始。为了减少延迟的可能性,请安排您的工作流在不同的时间运行。

从官方的定义可以看出,schedule 是到了设置的时间把你的任务加入一个待执行队列,如果这时队列出现了拥堵的情况,最糟糕的可能是超过定时时间 1-2 小时还没有执行。也就是说对于执行时间比较敏感的任务,建议使用第三方 cron 平台。

如何使用 cron-job 实现精确的定时任务

repository_dispatch 是 GitHub Actions 中的一个事件类型,它允许您通过使用 GitHub API 手动触发存储库中的工作流程运行。所以我们可以使用 cron-job 定时调用 Github 的 API,实现精准的定时执行。

1. 更改action文件的触发条件

添加repository_dispatch

on:
workflow_dispatch:
repository_dispatch:
types: [schedule-run]

2. 获取 Personal access tokens

在个人 Github 的 Settings/Developer Settings 创建 token

image-20240323101856723

选择创建经典的 token

image-20240323101931254

选择 token 权限为 repo

image-20240323102220951

此时就获得了你的 token,保存好。

3. 配置 cron-job

注册完成后进入控制台,可以在右上角设置中文

需要填写改为下图内容,需要定时执行哪一个工作流就把对应内容粘贴到网址中

image-20240323102803464

https://api.github.com/repos/需要填写/dispatches

image-20240323102550509

然后在进阶选项中添加标头和请求内容

标头键为 Authorization 值为 token 刚才获取的token

请求体为

{
"ref": "main"
}

image-20240323103023142

此时保存后进行测试,显示 204 即为成功,此时你对应的 Github Action 便就执行成功了

image-20240323103556994


关于我