最近撸GitHub Action有点上瘾了。决定把夕阳红的定时发送迁移到GitHub Action上面来了。这里记录一下相关的内容,将来好重复使用。
官方的GitHub文档在这里可以找到
夕阳红的触发是定时,所以我选择使用 `schedule` 事件来触发。对于这个,在官方有一个非常确定的说法要注意一下:
注意: schedule 事件在 GitHub Actions 工作流程运行期间负载过高时可能会延迟。 高负载时间包括每小时的开始时间。 为了降低延迟的可能性,将您的工作流程安排在不同时间运行。
我认为这个非常合理,原因也很简单,就是GitHub在云上的成本是固定的,这时如果完全都实时,会有一个非常高的瞬间峰值,对于资源的使用非常不合理。所以你有两个方法:一是对时间要求不精确,二就是使用自己的云资源。夕阳红并不是一个实时要求非常高的服务,所以我们自然要薅这个羊毛咯~(从2008年起就认为云化势不可挡,到今天越来越认为不云化自己的基础服务的都是傻瓜了)
所有的定时的定义使用cron语法,时区是UTC,所以一定要想清时间点,不要定义错了,有关cron语法的五个字段,这时记录一下:
┌───────────── minute (0 - 59)
│ ┌───────────── hour (0 - 23)
│ │ ┌───────────── day of the month (1 - 31)
│ │ │ ┌───────────── month (1 - 12 or JAN-DEC)
│ │ │ │ ┌───────────── day of the week (0 - 6 or SUN-SAT)
│ │ │ │ │
│ │ │ │ │
│ │ │ │ │
* * * * *
内容说明如下:
我们的夕阳红是每周一到周五晚上20:30运行,而这个时间是美东时间,时区偏移是UTC/GMT -4(夏令时)、UTC/GMT -5(标准时区/冬令时),我还没想好如何解决夏令时和冬令时的问题,回头再思考一下吧。所以最终我们会是这样的定义:
接下来需要配置一个Python的运行环境,GitHub官方维护了一个Setup Python的Github Action:
在官方专门还有一个如何构建和测试Python的章节:
以下step就是初始化Python环境和升级pip并安装运行所依赖的软件包:
在初始化环境之后,我们需要从stooq下载离线数据进行计算,我们可以使用Github Action的run来执行所有的脚本:
运行Python时需要通过环境变量给程序传递参数,Github官方也特别给出了一个解决方案:
可以直接把环境变量写到yaml中去,也可以将一些不公开的放到你的仓库的secrets里去,比如BOT_TOKEN这样的信息:
以下为运行时的yaml:
其中所有的secrets的环境变量均是在Secrets中设置的。其它的因为并不是需要隐藏的信息,所以直接就写在了yaml里。需要注意的是[]这样的序列,需要加上双引号,因为Github Action只支持字符串,并不支持序列化的数组这样的内容。