如何用Github钩子做自动部署
最近机缘巧合的购置了域名和服务器,不用实在是浪费,再加上一直没有属于自己的个人网站,所以打算用hexo在服务器上玩一下,这样也就不用再纠结用github pages还是gitee pages了。当然,今天的主题并不是博客搭建,而是如何利用github的钩子,将博客代码部署到服务器上。
毕竟github的钩子已经历史悠久了,网上有很多开源项目可以拿来用,所以我并没有造*,而是去找了5k star的开源go项目webhook
,这个工具的作用是接收github仓库的变动通知,然后调用你配置好的shell脚本,脚本可以写上代码拉取的命令或是编译的操作等,具体根据个人需求而定。简而言之,它只起着拉通github与你服务器的作用。
webhook工具安装
因为webhook是go语言开发的,所以要先安装go语言。
yum install -y golang
然后就可以用go命令安装webhook了。
go get github.com/adnanh/webhook
命令安装位置可以通过go env
查看,gopath就是命令安装路径,比如我的命令就安装在/root/go/bin/webhook。
go env ... goos="linux" gopath="/root/go" ...
生成ssh key
在编写脚本之前确保服务器有权限拉取github代码,如果已经做了配置可跳过本节去看部署脚本编写。ssh key是代码托管平台(github、gitee、coding、gitlab等)鉴别你是否有权拉取代码的身份标识,生成只需一行命令和一路回车就行了。
ssh-keygen generating public/private rsa key pair. enter file in which to save the key (/root/.ssh/id_rsa): enter passphrase (empty for no passphrase): enter same passphrase again: your identification has been saved in /root/.ssh/id_rsa. your public key has been saved in /root/.ssh/id_rsa.pub. the key fingerprint is: sha256:m6scf/j/hou3zlxmkfuvmv3iwia30cfbxiwqmwct1ye root@izwz96y36tk2ecnykzituxz the key's randomart image is: +---[rsa 2048]----+ | ..o. | | . o | | . o | | . o . | | e s. . | | . . ..oo .. | | oo o ==boo . | | .++.+o#== . | | .=*+=+@o | +----[sha256]-----+
生成后可通过cat ~/.ssh/id_rsa.pub
命令查看,最后将key加入github即可,加法不再赘述,请自行谷歌。
cat ~/.ssh/id_rsa.pub ssh-rsa aaaab3nzac1yc2eaaaadaqhbaaabaqcv7lgvjufdcll+hzyrftqiqcdre61gch76ldvpmwsx9bggru3iqs7eu5qapfn1vsvt+yf4rmt2lekuxgcm1wiybkz6lydvizbetafx4bcm1mcpxox6i/+r07mq4lltz+poqb1zp9y60uk0tbgovwlcodbevf9qeenq0qeczekv7wcawv6pvhlxjfkzgq0eoqbcyowmvpul+dwdbtcl/h+7at1nlgff7iurhlkf18qvgntrt2wpiuz4pwdoai8lcy1jir1z5ob0ocj2euhydnd39g2nxzrs1fivdgceviohtdohosowblcsj0flfsnscbfrbrcd7yhop7ffkfrowhmj root@izwz96y36tk2ecnykzituxz
部署脚本编写
该shell脚本的主要目的是从github拉取代码,脚本内容很简单,只做了目录的简要判断,代码目录存在则更新,不存在则克隆仓库,工作目录和仓库名称、地址请换成自己的。
#!/bin/bash cd /home/www/website if [ ! -d "go-home" ]; then git clone https://github.com/pingyeaa/go-home.git fi cd go-home git pull
webhook配置与启动
编写配置文件hooks.json,格式如下。
[ { "id": "deploy-webhook", "execute-command": "deploy.sh", "command-working-directory": "/home" } ]
- id:钩子的id,可自定义
- execute-command:要执行的脚本名,就是刚才编写的部署脚本
- command-working-directory:脚本所在目录
完成后通过webhook命令启动,可以看到id为deploy-webhook的配置已经加载了,我们需要注意的是监听的端口和路径,等下要用到。
/root/go/bin/webhook -hooks hooks.json -verbose [webhook] 2020/04/22 15:18:22 version 2.6.11 starting [webhook] 2020/04/22 15:18:22 setting up os signal watcher [webhook] 2020/04/22 15:18:22 attempting to load hooks from hooks.json [webhook] 2020/04/22 15:18:22 found 1 hook(s) in file [webhook] 2020/04/22 15:18:22 loaded: deploy-webhook [webhook] 2020/04/22 15:18:22 serving hooks on http://0.0.0.0:9000/hooks/{id} [webhook] 2020/04/22 15:18:22 os signal watcher ready
http://0.0.0.0:9000/hooks/{id}
github webhooks配置
现在服务器已经启动了webhook程序监听9000端口,接下来仅需要告诉github这个地址和端口就好了。
打开仓库设置页,添加webhook。
配置webhooks,payload url就是要通知的地址,把刚才打印出的端口和路径填上即可,其他默认。
现在可以提交代码测试了,如果推送失败github中会有错误提示,同样的,成功不仅在github中能看到,服务器的打印日志也有记录。
我是平也,这有一个专注gopher技术成长的开源项目
感谢大家的观看,如果觉得文章对你有所帮助,欢迎关注公众号「平也」,聚焦go语言与技术原理。