简介

GitHub Actions是Github提供的一个自动化CI/CD工具,非常强大且易用,这里有一份入门教程可以学习。其本质上相当于GitHub提供一个虚拟机环境,可以在特定条件下触发,执行一些脚本命令等。

明日方舟工具箱中,有人推荐使用这一功能来执行自动编译、自动部署,并帮助实现了一份on push(即推送时触发)的workflow,可以在每次原repo更新后,自动执行Node CLI安装依赖等,并推送到GitHub Pages和Coding Pages服务上,详细配置见这里

工具箱中有部分数据信息依赖拆包数据,因此一开始需要在拆包数据的Repo更新后,手动同步更新并推送。但这样有个问题:如果当时我在忙,忘记更新,就会导致数据的延迟更新。既然GitHub为我们提供了Actions这样一份便利的功能,其实也可以让它来执行自动检查。

初步尝试

最初,考虑到数据Repo和代码Repo同在GitHub上,有没有可能通过内部的WebHook等方式实现。Actions为外部事件提供了repository_dispatch的Trigger,即“当接收到POST请求时触发”。

该方法看上去可行,但在尝试时发现,这要求数据Repo在更新完后(使用该Repo内的Actions Workflow)向我发送一个POST请求,然而我并没有数据Repo的管理权限,因而使用这一方法还需要外部服务器支援,故而可行性不高,尝试其它办法。

最终方案

最后考虑到数据更新频率并不快(约每个月一次更新),而且对时效性要求并不是特别高(当天内更新即可),因此使用on schedule选择每日定点执行。

Actions使用POSIX Cron语法,可以使用crontab guru生成。要注意Actions使用的是UTC时间,也就是说每日0:00对应的是北京时间8:00。例如下面的时间配置,表示每日(北京时间)8:00和20:00自动执行:

on: 
  schedule: 
    - cron: '0 0/12 * * *'

其次是监控数据更新的方式。我们本质上是要监控数据Repo的最新commit的版本号,这可以通过Feed或者API的方式。其实这两者没有本质区别,只是Feed使用的是XML,而API使用JSON,后者更简洁一些。

检测更新的步骤其实很简单:
1. 使用如下命令在Repo的根目录下创建version/data文件,获取到commit信息里最新的含有"CN UPDATE"的一行并保存。grep -m1表示只取第一行数据,> version/data用于直接覆盖掉原文件。

curl -sL https://api.github.com/repos/Kengxxiao/ArknightsGameData/commits |grep -m1 "CN UPDATE" > version/data

2. 将该文件添加到Git Repo中;
3. 在每次定时任务执行时,再次执行1.中的命令,使用git status --porcelain检查是否与之前的存储不同,不同则代表有更新,则下载新数据,执行脚本,并推送。git status --porcelain在没有差异时输出为空,因而若没有更新则直接跳过。

if [[`git status --porcelain`]]; then
  # Do something
fi

4. 由于Repo已经设置好了on push的Trigger,因此推送完成后,会自动触发编译、更新Pages等过程,这样就完成了数据的自动更新。

完整的配置文件可以参考这里

Actions Workflow

Last modification:March 4th, 2020 at 08:22 pm
本文作者:Graue Neko

本文链接:GitHub Actions监控外部数据更新 - https://graueneko.com/archives/35/

版权声明:如无特别声明,本文即为原创文章,仅代表个人观点,版权归 灰格猫的编程日记 所有,未经允许不得转载。