登录
  • 人们都希望被别人需要 却往往事与愿违
  • C语言诡异离奇, 缺陷重重, 但却获得了巨大的成功@Dennis Ritchie (C语言之父 Unix之父)

使用GitHub Actions跑Celery worker

瞎搞 Benny小土豆 622次浏览 2955字 2个评论
文章目录[显示]
这篇文章在 2022年01月26日20:09:17 更新了哦~

自从有了GitHub Actions之后,TravisCI、DockerHub Autobuild等都可以歇菜了。

集成测试

通常来说我会写好Makefile,actions里安装好依赖之后直接make test就可以了。

使用GitHub Actions跑Celery worker

可以在actions的界面创建badge,加到README.md里,彻底取代TravisCI

自动构建Docker image

可以直接用Actions构建Multi-Arch的Docker image,然后push到docker hub,就是不给docker hub交钱。甚至我们还可以同步push到ghcr.io 虽说也没什么人用就是了。相关的workflow可以参考这个

https://github.com/tgbot-collection/ytdlbot/blob/master/.github/workflows/builder.yaml

基本上已经做到拿来配置好secrets就能用了。

自动部署代码

image也构建完了,部署的话可以用ssh action,直接ssh到机器docker pull一波走起。记得把private key放到secret里就好。可以参考这个workflow

https://github.com/tgbot-collection/ytdlbot/blob/master/.github/workflows/upgrade.yml

其他应用

GitHub Actions的机器性能还不错,2C 7G RAM,大概总共……官方说14G SSD,其实有办法弄出来更多磁盘空间的。

每个job能跑6小时,每个workflow能跑72小时。缺点是没有入网,所有的inbound traffic都被防火墙挡住了(而且不是iptables搞的),因此想当web server、梯子这种需要暴露端口的就不行了。

但是如果是celery worker这种不需要暴露端口的就没问题。

配置WireGuard

我的celery worker需要连接到broker,因此需要加密的通道。可以用WireGuard,可以用ssh隧道,以及各种神奇的加密隧道。

ssh隧道比较简单,run里执行一下如下命令:

ssh -L 6379:localhost:6379 [email protected]

以后访问本地的6379就像访问服务器的6379一样了。

WireGuard的话,比较麻烦,先安装 直接sudo apt install -y wireguard-tools就可以了。

然后配置好peer,比如说我给GitHub Actions的peer是这样的:

[Interface]
PrivateKey = 12345241
Address = 192.168.6.111/24

[Peer]
PublicKey = 322331
AllowedIPs = 192.168.6.0/24
Endpoint = 1.1.1.1:443
PersistentKeepalive = 60

这个东西肯定不能明文写到workflow里,因此需要用到secret,又因为是带了换行的,所以有至少两种办法。

 

base64法

跑一遍base64之后得到了这么个东西,然后把这个东西加到secret里:

CltJbnRlcmZhY2VdClByaXZhdGVLZXkgPSAxMjM0NTI0MQpBZGRyZXNzID0gMTkyLjE2OC42LjExMS8yNAoKW1BlZXJdClB1YmxpY0tleSA9IDMyMjMzMQpBbGxvd2VkSVBzID0gMTkyLjE2OC42LjAvMjQKRW5kcG9pbnQgPSAxLjEuMS4xOjQ0MwpQZXJzaXN0ZW50S2VlcGFsaXZlID0gNjAK

需要在shell script中用到这个base64字符串,echo到/etc/wireguard/wg0.conf 中。

要注意的是, sudo echo $WG > /etc/wireguard/wg0.conf 是不行的,因为 >是shell的重定向操作符,当前shell还是普通用户,这种用法只是echo有了root而已。方法之一是用tee

echo $WG |base64 -d | sudo tee -a /etc/wireguard/wg0.conf

tee完之后wg-quick up wg0 然后ping下peer就可以了。整段yaml是这样的:

- name: Set up WireGuard
  env:
    WG: ${{ secrets.WG }}
  run: |
    sudo apt install -y wireguard-tools
    echo $WG |base64 -d | sudo tee -a /etc/wireguard/wg0.conf
    sudo wg-quick up wg0
    ping 192.168.6.1 -c 2

第二行的env可选,要不就env成WG这个变量,要不就直接echo ${{secrets.WG}}

注意:

由于用了base64,所以workflow的日志中会看到明文key,因此建议private repository。毕竟用了tee一份标准输出一份文件。如果不想private repository,那就这样

echo $WG |base64 -d > /tmp/wg0.conf
sudo cp /tmp/wg0.conf /etc/wireguard/wg0.conf

或者EOF什么的,自己发挥吧。相信广大人民群众的脑洞。

直接用secret

secret中写peer配置明文,然后echo的时候加上 ""

echo "${{ secrets.WG }}"  | sudo tee -a /etc/wireguard/wg0.conf

更多磁盘空间

GitHub Actions默认装了很多东西,大部分我们是用不到的,卸载掉拿来搞事情吧,可以用 https://github.com/easimon/maximize-build-space

我的配置是这样的

- name: Maximize build space
  uses: easimon/[email protected]
  with:
    swap-size-mb: 512
    remove-dotnet: 'true'
    remove-android: 'true'
    remove-haskell: 'true'

跑celery worker

我的服务都是有docker image的,所有的运行时信息都是用的环境变量。因此这步基本上就是配置一下,然后跑起来就行了。要注意的是,docker run的话不要加 -d 选项,否则跑后台了整个workflow结束,VM也就没了。对应docker-compose也不要加-d

使用GitHub Actions跑Celery worker

效果还是很刺激的(

crontab

设置一个6小时跑一次的cron,这样就不用再操心了。

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

cron的第一个数字0(或者是0-59的其他分钟)非常重要,如果是*的话,那么就意味着6、12、18、0点的每分钟都跑一次,也就是240个任务。相信这样过不了你的号就会遭受GitHub的社会主义铁拳。

警告

如此薅羊毛的风险还是有的,建议谨慎行事,避免号没了。

完整workflow https://gist.github.com/BennyThink/e95e00f50e20cc56eb5810a1b2feaaad

 

结果

我号没了

使用GitHub Actions跑Celery worker


文章版权归原作者所有丨本站默认采用CC-BY-NC-SA 4.0协议进行授权|
转载必须包含本声明,并以超链接形式注明原作者和本文原始地址:
https://dmesg.app/actions-celery.html
喜欢 (17)
分享:-)
Benny小土豆
关于作者:
If you have any further questions, feel free to contact me in English or Chinese.
发表我的评论(代码和日志请使用Pastebin或Gist)
取消评论

                     

去你妹的实名制!

  • 昵称 (必填)
  • 邮箱 (必填,不要邮件提醒可以随便写)
  • 网址 (选填)
(2)个小伙伴在吐槽
  1. 您好,我想问一下人人的分享站怎么不好使了呢
    mac2022-01-08 22:08 回复
    • Benny小土豆
      应该是好用的,我刚刚试了,你再刷新看看?或者挂个梯子呢
      --本评论由Telegram Bot回复~❤️
      Benny小土豆2022-01-08 22:09 回复