V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
moonrailgun
V2EX  ›  分享创造

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

  •  
  •   moonrailgun ·
    moonrailgun · 2022-05-26 10:32:33 +08:00 · 3306 次点击
    这是一个创建于 912 天前的主题,其中的信息可能已经有所发展或是发生改变。

    背景

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

    那么整理一下需求:

    • 定时任务
    • 简单部署
    • 不需要运维

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

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

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

    理论存在,实践开始!

    开始造轮子

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

    核心流程如下:

    准备数据流程

    • 通过 git worktree 创建一个独立的工作区
    • 指定工作区的分支为一个独立分支用于存储数据
    • 如果该分支之前不存在,跳过准备过程
    • 如果分支已存在,拉取分支代码,将存储分支的指定目录文件复制到主工作空间的指定目录文件

    修改数据

    • 在后续的 action 中执行脚本
    • 脚本读取文件数据库,在这里使用的是lowdb,当然也可以使用 sqlite ,看个人喜好
    • 更新数据库并写入

    持久化存储数据

    • action 执行完毕进入 post 阶段
    • 执行 post action 将主工作区的数据库文件覆盖到存储工作区中
    • 存储工作区通过 github action 的 token 或者传入参数的 token 提交变更到 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/[email protected]
          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

    14 条回复    2022-06-23 17:46:41 +08:00
    wdssmq
        1
    wdssmq  
       2022-05-26 10:53:49 +08:00
    贴下我的,运行次数已经破千了 (╯▽╰)

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

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

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

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

    感谢
    cai314494687
        10
    cai314494687  
       2022-05-27 10:07:38 +08:00
    小心账号被封
    moonrailgun
        11
    moonrailgun  
    OP
       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
        12
    mayli  
       2022-05-29 06:00:32 +08:00 via Android
    不推荐用这个方式
    你这个 Branch 的内容会一直增长
    直到 Checkout 要花好久
    Chad0000
        13
    Chad0000  
       2022-05-29 07:55:02 +08:00 via iPhone
    @ihciah cf 也出数据库了,还有存储。op 的需求都可以在 cf 那边实现
    moonrailgun
        14
    moonrailgun  
    OP
       2022-06-23 17:46:41 +08:00
    @mayli 如果不期望增量的话可以强制只提交一个 commit 。。。。策略都是灵活的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1243 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 18:10 · PVG 02:10 · LAX 10:10 · JFK 13:10
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.