自从有了GitHub Actions之后,TravisCI、DockerHub Autobuild等都可以歇菜了。
集成测试
通常来说我会写好Makefile,actions里安装好依赖之后直接make test
就可以了。
可以在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 root@server
以后访问本地的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/maximize-build-space@master 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
。
效果还是很刺激的(
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
结果
我号没了