Github 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就可以了。
注意,对于schedule
的cron
字段,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社区必备技能之一,值得深度学习和使用。