Go 服务部署

2020/10/9 posted in  Go

Go程序可以进行交叉编译,使得可以在MacOS上进行开发并直接生成在Linux上可执行的文件。

编译linux上执行的程序:

CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build

自动部署

思路:使用 pm2 管理进程, Git仓库的 webhook 触发 pm2 重启服务。

为了减少服务器的压力和加快服务部署速度,我直接在本地开发环境进行编译(反正可以交叉编译),将可执行文件提交到仓库,服务器端直接执行程序。webhook 监测到push, 在服务器端执行脚本拉取最新代码,并使用pm2 重启服务。

小坑避绕指南

使用 pm2 管理 Go 服务过程中会稍微有点需要注意,因为是直接运行二进制文件,pm2 的 json 配置有几项需要指定下,

不能使用 负载均衡,需要设置如下

"exec_mode" : "fork_mode",

我的配置json 🌰:

{
  "apps":[
    {
      "name": "pipi-server",
      "cwd": "/root/service_proj/proj",
      "script": "./pipi",
      "min_uptime": "60s",
      "max_restarts": 5,
      "exec_interpreter": "none",
      "exec_mode" : "fork_mode",
      "error_file" : "./error.log",
      "out_file": "./nohup.out",
      "pid_file": "./server.pid",
      "watch":[  
        "pipi" 
      ],
    }
]}

json配置文件中设置的 watch 在实际中没有效果,查了下资料貌似因为 pm2 监测文件变化的文件类型有限制,对于二进制文件的变化可能不准确。因此我在方案中直接在webhook 触发的脚本中进行主动重启服务,鉴于脚本为同步执行,能保证新代码pull成功后再重启服务。

至此,可以快乐地只负责在本地环境开发提交代码,部署服务的事就交给服务器自己吧!