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:

image-20220119205528393

然后分别填入常量名和值:

image-20220119205610854

上面的yml文件用到了两个常量,分别是ECS_PASSWORDECS_IP。前者是你服务器的密码,后者是服务器的 IP。将这两个常量创建好后,效果如下图所示:

image-20220119205726652

这个时候就不能再看到这个常量的值了,只能修改或者删除。之所以这么操作,是考虑到之后仓库可能改成 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 主题不同,颜色可能不同,不用在意这些细节):

image-20220119210405265

如果脚本还在执行,看到的是黄色的小点。如果脚本执行过程中发生了异常,则显示一个红叉。点击可以看到详细的执行情况,下图中是一个正确执行的例子:

image-20220119210458023

执行失败的情况:

image-20220119210521342

可以观察到,每个 Action 执行完毕后都会显示一个时间:

image-20220119210920549

这是脚本的执行用时。Github 针对一般的用户,提供了每月 2000 分钟的私有仓库 Action时长(公开的仓库时长不限)。如果超过了这个额度,就要付费。如果完成了学生认证,则是 3000 分钟/月。项目仓库在开发过程中一般都是private状态,所以仓库拥有者需要留意下自己的剩余额度。在个人设置页的Billing下可以看到:

image-20220119211142584

image-20220119211200393

如果两次提交较为接近,导致同时有两个脚本在执行,就可能会导致卡死的情况出现,脚本一直执行不完,疯狂消耗 Action 额度。所以一定要及时留意仓库中的 Action 执行情况,发现异常后手动停止,避免带来财产损失

实测即使是非常高强度的开发,一个月的时长消耗也在 500 分钟以下,所以可以放心使(bai)用(piao)。

总结

在完成了 Action 的配置之后,后端开发工作就轻松了很多:如果前端发现后端有bug,后端修复完毕并 commit 后,自动触发 Action 进行服务器部署,大约半分钟后,前端即可检测到最新运行的后端。整个过程不再需要连接服务器进行手动更新与部署,非常的方便。

补充

Github Action 脚本是有一个明确的结构规范与语法规则的,这里只是给出了一个非常简单的使用例子。如果想对其深入了解来自己进行魔改,可以阅读这个教程。

Copyright © Marvolo 2021 all right reserved,powered by Gitbook该文章修订时间: 2022-02-22 12:01:22

results matching ""

    No results matching ""