当我们利用github来托管项目时,每次部署项目都要走同样的流程,敲击同样的命令行,程序员肯定无法忍受这种重复工作。那到底有没有一种可以解放我们双手,当我们提交代码后,服务器自动执行我们已经制定好的命令行,答案是我们可以利用Github自有的Webhooks

Webhooks

Webhooks是来监测你在github上的各种事件,我们可以通过定制它来监测一个push事件,每当我们提交代码时Webhooks会被触发,这是我们可以通过配置一个HOST POST请求到你所需要的地址。

具体查询github webhooks 文档

如何配置

找到你在Github上的项目地址上的SettingWebhooks,如下图配置:

webhook配置图片

项目配置

  • 编写执行shell命令

在项目根目录下新建/data/deployed.sh文件,输入你想在服务器上执行的命令行,如:

cd /data/project_dir/
git pull origin master
  • 编写执行脚本,本文档用go语言编写接口文档

在项目根目录下新建main.go文件

package main

import (
	"fmt"
	"io/ioutil"
	"os/exec"

	"github.com/gin-gonic/gin"
)

func main() {
	r := gin.Default()
	r.POST("/exec/github", func(c *gin.Context) {
		name := c.DefaultQuery("file", "/data/deploy.sh")
		go execFile(name)
		c.JSON(200, gin.H{
			"ok": true,
		})
	})
	r.Run(":8888") // listen and serve on 0.0.0.0:8888
}

func execFile(file string) string {
	cmd := exec.Command("/bin/bash", "-c", file)
	output, err := cmd.Output()
	if err != nil {
		fmt.Printf("Execute Shell:%s failed with error:%s", file, err.Error())
		return err.Error()
	}
	fmt.Printf("Execute Shell:%s finished with output:\n%s", file, string(output))
	return string(output)
}

nginx配置

执行脚本跑在了8888端口,我们服务器对应启用到 8888 端口

upstream webhooks_ssl {
    server 127.0.0.1:8888;
}

server {
  location /github/webhooks {
    proxy_pass http://webhooks_ssl;
    proxy_redirect off;
  }
}

部署项目

首次部署到服务器时,仍然是需要我们手动执行命令git pull项目,当我们在服务器上clone下我们的项目后,在本地尝试修改下代码,然后再次提交,可看到后台的日志。如果git clone无权限需要配置一下ssh key。

再次查看Webhooks执行回调接口返回结果是否成功

webhook访问成功图片

表示已经自动触发了接口,项目自动化部署成功。

管理应用

具体每个应用部署直接修改deploy.sh文件就好了。docker项目一样的道理。github webhook还可以根据用户其他事件做其他别的部署(正式环境、测试环境、灰度等)。