Github Action 实现自动部署
简介
Github 针对开发者提供了很多免费的实用工具,Github Action 就是其中之一。你可以将其理解为一个特殊的脚本,在满足一定条件的时候它就会执行(例如检测到对某一分支的push,到达了一天的0点等)。
在网站开发中,后端经常需要把刚写完的内容同步至服务器端供前端测试,如果手动部署,则需要先连接服务器,然后git pull
,再将后端运行起来。一次两次还好,多了之后会很浪费时间且比较枯燥。适当使用 Github Action 就可以把这个过程自动化,下面将介绍如何实现自动部署。
准备工作
在一个git
项目中,新建一个.github
文件夹,再在其中新建一个workflows
文件夹,然后在里面创建一个main.yml
的文件,将下面的内容粘贴进去:
name: Django_deploy
on:
push:
branches: [master]
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: pull and reload on Aliyun
run: sshpass -p ${{secrets.ECS_PASSWORD}} ssh -o StrictHostKeyChecking=no root@${{secrets.ECS_IP}} "cd ~/academic; python kill.py; git pull --force; git checkout master; python run.py;"
此时先不要急着 commit,进入Github 里对应的仓库页面,点击Settings->Secrets
(如果找不到Secrets,可能是权限不够,可以让仓库拥有者来操作)。这里存放的是这个仓库中的所需要的不对外公开的常量。点击创建新 Secrets:
然后分别填入常量名和值:
上面的yml
文件用到了两个常量,分别是ECS_PASSWORD
与ECS_IP
。前者是你服务器的密码,后者是服务器的 IP。将这两个常量创建好后,效果如下图所示:
这个时候就不能再看到这个常量的值了,只能修改或者删除。之所以这么操作,是考虑到之后仓库可能改成 public,为了避免服务器的信息泄露,于是使用了 Secrets 来做一个安全防护。
脚本中的这几句比较关键:
on:
push:
branches: [master]
它指明了脚本运行的时机,是在检测到 master 分支上有新的push的时候,就会执行脚本。可以根据实际情况修改分支名称。
这里着重对这句话做一个解释:
run: sshpass -p $ ssh -o StrictHostKeyChecking=no root@$ "cd ~/academic; python kill.py; git pull --force; git checkout master; python run.py;"
run
就是执行后面的内容。首先使用 sshpass 连接上服务器,IP 与密码在 Secrets 中设置好了。然后在服务器上执行引号中的内容。打开项目文件夹(这里可以自行修改,推荐使用绝对路径避免出现问题),执行脚本杀死上次运行的后端项目,然后通过git pull --force
强行更新(加--force
是为了避免冲突导致拉取失败),再执行运行后端的脚本。各个语句之间使用分号分隔。
设置完毕后,Action 脚本就可以正常运作了,这时就可以 commit 观察效果了。
使用
在脚本执行完毕,正常结束后,仓库页面的这个地方可以看到一个蓝色的对号(Github 主题不同,颜色可能不同,不用在意这些细节):
如果脚本还在执行,看到的是黄色的小点。如果脚本执行过程中发生了异常,则显示一个红叉。点击可以看到详细的执行情况,下图中是一个正确执行的例子:
执行失败的情况:
可以观察到,每个 Action 执行完毕后都会显示一个时间:
这是脚本的执行用时。Github 针对一般的用户,提供了每月 2000 分钟的私有仓库 Action时长(公开的仓库时长不限)。如果超过了这个额度,就要付费。如果完成了学生认证,则是 3000 分钟/月。项目仓库在开发过程中一般都是private
状态,所以仓库拥有者需要留意下自己的剩余额度。在个人设置页的Billing
下可以看到:
如果两次提交较为接近,导致同时有两个脚本在执行,就可能会导致卡死的情况出现,脚本一直执行不完,疯狂消耗 Action 额度。所以一定要及时留意仓库中的 Action 执行情况,发现异常后手动停止,避免带来财产损失。
实测即使是非常高强度的开发,一个月的时长消耗也在 500 分钟以下,所以可以放心使(bai)用(piao)。
总结
在完成了 Action 的配置之后,后端开发工作就轻松了很多:如果前端发现后端有bug,后端修复完毕并 commit 后,自动触发 Action 进行服务器部署,大约半分钟后,前端即可检测到最新运行的后端。整个过程不再需要连接服务器进行手动更新与部署,非常的方便。
补充
Github Action 脚本是有一个明确的结构规范与语法规则的,这里只是给出了一个非常简单的使用例子。如果想对其深入了解来自己进行魔改,可以阅读这个教程。