Github Actions 执行Python定时任务(时区及缓存问题处理)

Github Actions

文档地址:https://docs.github.com/en/actions

这两天一直在学习Github Actions,很是兴奋,才发现这么好的东西,相见恨晚。

它是什么呢,简单讲,就是让你的Github项目具备持续集成的能力,类似于传统工具jenkins,Gitlab的CI/CD功能等,但Github Actions更加强大。

我尝试简单实践了一下,将前几天写的python包加了一下这个功能,用起来很简单,只要在代码里,创建一个.github/workflows的文件夹,里边加.yml文件就可以了,代码量很少,更多的是需要理解。

name: Python package
on:
  push:
    tags:
      - "v*.*.*"
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Build and publish to pypi
        uses: JRubics/poetry-publish@v1.13
        with:
          pypi_token: ${{ secrets.PYPI_TOKEN }}
      - name: release
        uses: softprops/action-gh-release@v1
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

上面是我给pywencai配置的,具体的功能为:在一个tag推送到仓库时,自动执行发布pypi和发布 github release的功能,相当方便。

定时任务

除了执行一些测试或发布的任务,Github Actions 还可以执行定时任务,而且是免费的(虽然有一定配额限制),这不得赶紧白嫖一下。

核心的能力在于触发工作流里的事件,具备schedule这种类型,下面我们具体设置它

schedule具体文档: https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#schedule

name: Schedule Worker
on:
  schedule:
    - cron: '40 3,9 * * *' #每日11点40,17点40,两个时间点执行任务
jobs:
  work:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: szenius/set-timezone@v1.0 # 设置执行环境的时区
        with:
          timezoneLinux: "Asia/Shanghai"
      - uses: actions/setup-python@v4 # 使用python装配器
        with:
          python-version: '3.10' # 指定python版本
          cache: 'poetry' # 设置缓存

      - run: poetry install --without dev # 安装
      - run: poetry run python .\bin.py # 执行

上边是我最终的配置,下面着重解释两个问题:时区 和 缓存策略

时区

schedule时区

Github是国际网站,默认时区肯定不是中国时区,而是UTC时间(协调世界时间),大概是冰岛和英国的时区。

在这里插入图片描述

UTC时间在线演示:https://time.is/UTC

最终的结论就是,比北京时间慢8小时,用目标时间减8就可以了。

注意,对于schedulecron字段,Github官方并没有提供更改时间的配置,只能自己算UTC时间,关于这个问题,也有人反馈,不过一直也没人解决。

关于schedule时区问题的讨论:https://github.com/community/community/discussions/13454

schedule延迟问题

我尝试跑了一天的schedule,发现执行任务的时间,跟我设置的时间有差别,少则几十分钟,多则几个小时,相当不准时(官方文档也明确写了,就是不准时,无奈)。所以,如果需要精准时间的定时任务无法用它来执行。

虚拟环境的时区

虽然,我们无法更改cron字段的时区,但虚拟环境的时区,是有方法可以改的,因为在程序中,很可能用到时间,我们当然希望是国内时间。set-timezone是一个可以设置环境时区的action,使用它就可以了,具体参考上边的代码示例。

set-timezone: https://github.com/szenius/set-timezone

缓存策略

由于想要执行的是定时任务,所以其实不希望每次执行都重新安装依赖,除非有依赖更新再重新安装。这个问题Github Actions也已经替我们想到了,具体参看官方文档。

使用缓存: https://docs.github.com/en/actions/using-workflows/caching-dependencies-to-speed-up-workflows

总结一下,就是可以通过配置,将指定目录的文件缓存下来,并记录一个key与其对应。如果下次执行,提供的还是这个key,那么就启用这个缓存,如果不是,就不适用缓存,重新安装依赖。

目前的大部分语言的包管理器(至少node.js和python),都具备lock文件。所以,就可以根据lock文件的哈希值,创建缓存的key,如果哈希值不变,就说明依赖没变,使用缓存,如果变了,就重新安装。

就以上这个过程,其实也不需要我们一步一步做,以python程序为例,官方已经为我们提供了setup-python,并封装好了缓存策略,只要简单的配置就可以使用,具体参看官方文档和我上边的示例。

setup-python: https://github.com/actions/setup-python

其他语言也有,每种语言都有自己的缓存策略配置,参见上文使用缓存文档连接。

结语

Github Actions的玩法很丰富,应该混Github社区必备技能之一,值得深度学习和使用。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AI量化投资

支持一下

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值