把代码仓库当做数据库, github action 持久化存储新思路

2022-05-26 10:32:33 +08:00
 moonrailgun

背景

我想做一个 rss 订阅机器人,通过一个定时任务定期将我关注的内容推送到我的 Tailchat 群组。但是我又不想自己去单独搭建一个服务器来部署,因为功能很小、单独部署的成本会被放大,也不容易被其他人很简单的使用。而且长期维护的成本也是比较高的,希望能处于无人值守的运行模式

那么整理一下需求:

可以说是非常理想了,那么有这样成熟的解决方案么?答案是有的。那就是github action

Github action 可以满足我的所有需求,只需要一个简单的定时任务即可实现我的三个需求。唯一的难点在于数据库,也就是持久化存储。

众所周知,rss 机器人的原理就是定时请求 rss 订阅地址,将返回的内容结构化以后与之前存储的数据进行比较,将更新的信息提取出来发送到外部服务。那么为了能够比较差异,一个持久化的数据库是必不可少的。那么github action可以实现数据库么?答案是可以的,我只需要将数据存储在代码仓库中,每次执行 action 之前将数据取出,然后在 action 执行完毕之后将数据存回仓库,那么一个用于低频读写的文件数据库就实现了。

理论存在,实践开始!

开始造轮子

在 github 上搜索了一圈没有发现有现成的轮子,因此就开始自己造一个。

核心流程如下:

准备数据流程

修改数据

持久化存储数据

成果

那么通过上面一系列步骤,我们就成功把 github 当做我们自己的 action 应用的数据库了。

一个简单的示例如下:

name: Tests

on:
  workflow_dispatch:

jobs:
  test:
    timeout-minutes: 60
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    - name: Checkout date
      uses: moonrailgun/branch-filestorage-action@v1.2.2
      with:
        path: date
    - name: Read and show
      run: cat date
    - name: update date
      run: echo $(date) > date

这个 action 表示,每执行一次,我们的actions/filedb中的 date 文件就会更新成最新的.当然也可以加上一些定时任务触发器让他自动执行。当然建议不要滥用哦,可以使用低频一些

在 Github Marketplace 查看: https://github.com/marketplace/actions/branch-filestorage-action

开源地址: moonrailgun/branch-filestorage-action

RSSBot 地址: msgbyte/tailchat-rss-bot

3300 次点击
所在节点    分享创造
14 条回复
wdssmq
2022-05-26 10:53:49 +08:00
贴下我的,运行次数已经破千了 (╯▽╰)

wdssmq/proxy_rsshub: 使用 GitHub Actions 反代 RSSHub + 多实例轮询
https://github.com/wdssmq/proxy_rsshub
zthxxx
2022-05-26 13:56:50 +08:00
ihciah
2022-05-26 14:27:54 +08:00
可以使用 cf worker kv 做存储。
https://github.com/ihciah/cloudflare-kv-proxy 我这有个 rust 版的 sdk 。
moonrailgun
2022-05-26 15:09:02 +08:00
@wdssmq 不好意思没有看懂目的是什么。

看了一下您的项目,就是把 rsshub 的输出在 github 上存了一遍?那为什么不直接访问 rsshub 呢?不好意思没理解

另外就是这种操作其实会污染 commit _(:з」∠)_
moonrailgun
2022-05-26 15:10:47 +08:00
@zthxxx 感谢提醒,不过 rss 不能算是爬虫的一种。至少不是违法的那一种。硬是要说的话如果是通过 rsshub 来产生 rss 订阅的话 rsshub 是一个爬虫的角色。
moonrailgun
2022-05-26 15:14:22 +08:00
@ihciah 感谢告知。我也用 cf 不过没用用的很深入,使用 action 是为了保持更加的纯净减少更多的依赖。

不过还是感谢你的思路,顺便请教一下 cf 的 worker 在国内的表现怎么样?我用 cf 的 dns 服务都不敢开盾_(:з」∠)_
ihciah
2022-05-26 15:49:28 +08:00
@moonrailgun worker 自带域名被墙了,但是绑定的域名还是可以用的。可用性就是 cf 在国内的可用性,半死不活勉强能用。
ps:你这个确实违反 github TOS 了,可以整个迁移到 cf worker 或其他 serverless 服务上(套路云和良心云等都有的)。
moonrailgun
2022-05-26 17:24:22 +08:00
@ihciah 感谢回复与提醒,方便告知违反 TOS 那一条么?因为类似的操作(不论拿 action 的定时任务做别的操作还是通过 action 去提交一些东西)我都看见过不少,其中也有不少上 k 甚至上 10k 的项目。我实在不确定哪一条条款违背了

感谢
ihciah
2022-05-26 18:23:41 +08:00
cai314494687
2022-05-27 10:07:38 +08:00
小心账号被封
moonrailgun
2022-05-27 15:06:30 +08:00
@ihciah
感谢提醒与友善的回复。不过我仔细看了一下你指出的两条跟我造的 github action 轮子(branch-filestorage-action)好像没有任何关系。。。

对于我的使用实例(rssbot) 第二条,我不认为 rss 属于 `unauthorized` 的内容。rss 的内容本身就是网站允许的一种访问方式。如果网站不允许通过 rss 访问可以不添加 rss 协议。。。这个我认为其"允许访问"程度比搜索引擎还要高 —— 搜索引擎是你申明不允许那么就不抓取,rss 是你不主动创造 rss 的 xml 信息就无法使用。。。

第四条的话,在我的实例中,我创建了一个 rss 机器人的项目,然后使用 action 收集 rss 的数据,怎么都不能说这两者是无关的吧?
类似的项目有收集程序员编码时间,生成 gist 的 waka-box(1.1k star,1.5k fork)
定时抓取 ipaddress ,更新 hosts 的 github520(11.5k star, 1.3k fork)
以及更多程序员都会使用的更新到自己项目的 repo 然后动态变更个人首页展示内容(不好意思这种我没用过我没法举出例子)

虽然不是非常认可你的说法,但是还是非常感谢您的回复。 :)
mayli
2022-05-29 06:00:32 +08:00
不推荐用这个方式
你这个 Branch 的内容会一直增长
直到 Checkout 要花好久
Chad0000
2022-05-29 07:55:02 +08:00
@ihciah cf 也出数据库了,还有存储。op 的需求都可以在 cf 那边实现
moonrailgun
2022-06-23 17:46:41 +08:00
@mayli 如果不期望增量的话可以强制只提交一个 commit 。。。。策略都是灵活的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/855377

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX