IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发工具 -> Github Actions 执行Python定时任务(时区及缓存问题处理) -> 正文阅读

[开发工具]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社区必备技能之一,值得深度学习和使用。

  开发工具 最新文章
Postman接口测试之Mock快速入门
ASCII码空格替换查表_最全ASCII码对照表0-2
如何使用 ssh 建立 socks 代理
Typora配合PicGo阿里云图床配置
SoapUI、Jmeter、Postman三种接口测试工具的
github用相对路径显示图片_GitHub 中 readm
Windows编译g2o及其g2o viewer
解决jupyter notebook无法连接/ jupyter连接
Git恢复到之前版本
VScode常用快捷键
上一篇文章      下一篇文章      查看所有文章
加:2022-10-08 21:02:36  更:2022-10-08 21:06:39 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/18 10:46:17-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码