利用Github Action 持续部署Go项目
本文最后更新于:2022年8月3日 上午
利用Github Action 持续部署Go项目
简介
Github 针对开发者提供了很多免费的实用工具,Github Action 就是其中之一。你可以将其理解为一个特殊的脚本,在满足一定条件的时候它就会执行(例如检测到对某一分支的push,到达了一天的0点等)。
在网站开发中,后端经常需要把刚写完的内容同步至服务器端供前端测试,如果手动部署,则需要先连接服务器,然后git pull
,再将后端运行起来。一次两次还好,多了之后会很浪费时间且比较枯燥。适当使用 Github Action 就可以把这个过程自动化,下面将介绍如何实现自动部署。
本文介绍如何使用Go的工具Air来对Go项目进行热加载,即自动编译、重启程序,也可以达到自动部署的作用。
准备工作
事实上,Go项目(此处以一Gin项目为例)的部署,就是在服务器上关掉之前的后端服务,并重新打包go build main.go
并运行项目./main &
即可。不过在自动化部署中,需要做到登录到服务器,并执行相应命令。
在Commit触发workflow之前,首先需要配置Secrets
,以下关于配置Secret的操作直接摘自Marvolo’s Djangobook
进入Github 里对应的仓库页面,点击Settings->Secrets
(如果找不到Secrets,可能是权限不够,可以让仓库拥有者来操作)。这里存放的是这个仓库中的所需要的不对外公开的常量。点击创建新 Secrets:
然后分别填入常量名和值:
这个时候就不能再看到这个常量的值了,只能修改或者删除。之所以这么操作,是考虑到之后仓库可能改成 public,为了避免服务器的信息泄露,于是使用了 Secrets 来做一个安全防护。关于Github Action的更具体使用可以查询官方文档或是其他关于Github Action的教程吧。
个人目前的.github/workflows/build.yml
内容如下:
1 |
|
上面的工作流具体做了几件事: 登录到服务器、打开指定目录,pull仓库到本地,检查后端是否成功运行。
对于本方案的工作流执行到这里已经够了,因为我们使用了Air工具,当代码更新,会自动进行热加载程序,达到部署的目的。具体内容在下一章节介绍
基于Air的热加载
关于Air的简单介绍与使用可以参见[2], 简单来讲,若没有使用2,当修改了代码后,需要重新编译运行才能得到更新后的程序。而使用了air后,在命令行使用air
便可以运行程序,并能热更新程序,(类似Django)
1 |
|
Air的配置
- 安装Air(当然,linux要设置好GOPATH并添加环境变量),具体方式参见[3]
1 |
|
-
Air的使用
初始化配置文件:在项目根目录下运行:
1
air init
会在根目录下生成了配置文件.air.toml
,个人将.air.toml
加入到.gitignore
中防止不同系统相互影响,此时直接运行air
往往会向./tmp/
目录下build文件,而与本Gin-demo
默认为项目根目录的意味不符,于是我们修改配置文件
修改为如下代码即可
1 |
|
随后项目成功运行
若配置好了之前的基本内容。此时提交到分支master
便可以实现持续部署了。随后个人进行简单测试
具体测试如下:
最新提交中,我将Gin-demo中的HelloGin的代码进行修改:
等到workflows结束后,访问ip:port/hello
,发现内容已经更改,表示已经部署成功。此外经过在部署前后查看进程的PID发现发生了变化,可见热重启发挥了作用。
最后我在查询资料的途中,发现了另一种自动部署方法, 读者可以自行尝试,不过个人觉得原理类似,但是配置相对Air更繁琐,不过多赘述。
参考
[1] Makefile使用
[2] Air 简单介绍
[3] 设置GOPATH
[4] Air的简单使用
[5] 另一种Go项目自动部署方法
[6] Air配置文件详细介绍