利用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:

image-20220119205528393

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

image-20220803083733871

这个时候就不能再看到这个常量的值了,只能修改或者删除。之所以这么操作,是考虑到之后仓库可能改成 public,为了避免服务器的信息泄露,于是使用了 Secrets 来做一个安全防护。关于Github Action的更具体使用可以查询官方文档或是其他关于Github Action的教程吧。

个人目前的.github/workflows/build.yml 内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
name: build

on:
push:
branches: [master]

jobs:
build:
runs-on: ubuntu-latest

steps:
- name: setup
run: sudo apt install sshpass

- name: pull
run: |
sshpass -p ${{secrets.PASSWORD}} ssh -o StrictHostKeyChecking=no root@${{secrets.IP}} "cd /opt/Project/Gin-demo; git config --global http.postBuffer 1048576000;git pull"

- name: query_backend_status
# 查看后端运行情况
env:
# go build得到的文件名
PROJ_NAME: main
run: |
sshpass -p ${{secrets.PASSWORD}} ssh -o StrictHostKeyChecking=no root@${{secrets.IP}} "ps -ef | grep ${PROJ_NAME}"

上面的工作流具体做了几件事: 登录到服务器、打开指定目录,pull仓库到本地,检查后端是否成功运行。

对于本方案的工作流执行到这里已经够了,因为我们使用了Air工具,当代码更新,会自动进行热加载程序,达到部署的目的。具体内容在下一章节介绍

基于Air的热加载

​ 关于Air的简单介绍与使用可以参见[2], 简单来讲,若没有使用2,当修改了代码后,需要重新编译运行才能得到更新后的程序。而使用了air后,在命令行使用air 便可以运行程序,并能热更新程序,(类似Django)

1
$ air

Air的配置

  • 安装Air(当然,linux要设置好GOPATH并添加环境变量),具体方式参见[3]
1
go install github.com/cosmtrek/air@latest
  • Air的使用

    初始化配置文件:在项目根目录下运行:

    1
    air init

    image-20220802234902161

​ 会在根目录下生成了配置文件.air.toml,个人将.air.toml加入到.gitignore中防止不同系统相互影响,此时直接运行air 往往会向./tmp/目录下build文件,而与本Gin-demo默认为项目根目录的意味不符,于是我们修改配置文件

image-20220803001518497

修改为如下代码即可

1
2
3
4
5
6
# Windows  
bin = "main.exe"
cmd = "go build -o ./main.exe ."
# linux
bin = "main"
cmd = "go build -o ./main ."

随后项目成功运行

image-20220802235413629

若配置好了之前的基本内容。此时提交到分支master便可以实现持续部署了。随后个人进行简单测试

具体测试如下:

最新提交中,我将Gin-demo中的HelloGin的代码进行修改:

image-20220803002511985

等到workflows结束后,访问ip:port/hello,发现内容已经更改,表示已经部署成功。此外经过在部署前后查看进程的PID发现发生了变化,可见热重启发挥了作用。

image-20220803002606531

最后我在查询资料的途中,发现了另一种自动部署方法, 读者可以自行尝试,不过个人觉得原理类似,但是配置相对Air更繁琐,不过多赘述。

参考

[1] Makefile使用

[2] Air 简单介绍

[3] 设置GOPATH

[4] Air的简单使用

[5] 另一种Go项目自动部署方法

[6] Air配置文件详细介绍

[7] Marvolo’s Djangobook


利用Github Action 持续部署Go项目
http://example.com/2022/08/03/Introduction/Go-project-CD/
作者
BFlame
发布于
2022年8月3日
许可协议