需求背景
自己搭建的博客,代码托管到github,心想博客更新那么频繁,每次push代码后都到服务器上手动部署,实在是太麻烦, 于是想到自动化部署,开始的时候只是想通过一个简单的 shell +cron的方法来解决,但是这方法真的太笨了,一点都不 智能 。想到github的webhook,之前只是听说,明白其原理,并没有实操,这次刚好可以亲自体验一把了。具体如下:
webhook简介
webhook是一种web回调或者http的push API,是向APP或者其他应用提供实时信息的一种方式。Webhook在数据产生时立即发送数据,也就是你能实时收到数据。这一种不同于典型的API,需要用了实时性需要足够快的轮询。这无论是对生产还是对消费者都是高效的。
Webhook有时也被称为反向API,因为他提供了API规则,你需要设计要使用的API。Webhook将向你的应用发起http请求,典型的是post请求,应用程序由请求驱动。
Webhook模式的主要优点是,当你的应用在等待变化时,无需周期性地调用APIs。
工作原理
- vps启动一个nodejs进程(webhook),用来监听github仓库的状态;
- 管理员本地修改代码,然后push到github代码仓库,master分支;
- webhook监测到master分支的push操作;
- 触发VPS上部署的脚本,代码到指定位置wwwroot。
构建webhook服务
下载脚本:webhook.js
说明:
- 需要nodejs,部署node环境
- 该脚本支持同时管理多个项目,只需要修改
var handler
配置即可; - handler:path名称和github中项目名称保持一致;
- secret:和github中webhook密码保持一致;
- listen:配置监听端口,之后再github中要用;
将webhook服务加入systemctl管理
- # /usr/lib/systemd/system/webhook.service
- [Unit]
- Description=Github webhook
- After=network.target
-
- [Service]
- Type=simple
- User=nginx
- Group=nginx
- WorkingDirectory=/home/nginx/workspace/gitbook/scripts/
- Environment=NODE_PORT=10080
- ExecStart=/home/nginx/.nvm/versions/node/v10.15.3/bin/node /home/nginx/workspace/gitbook/scripts/webhook.js
- Restart=on-failure
-
- [Install]
- WantedBy=multi-user.target
注意事项: 声明WorkingDirectory。
代码发布脚本
- #!/bin/bash
-
- WEB_PATH='/home/nginx/workspace/gitbook/books/'$1
- WEB_USER='nginx'
- WEB_USERGROUP='nginx'
- source /home/nginx/.bash_profile
-
- t1=`date +'%Y-%m-%d %H:%M:%S'`
- echo "$t1 Start deployment" >> /home/nginx/workspace/gitbook/scripts/info.log
- cd $WEB_PATH
- pwd
- echo "pulling source code..."
- git reset --hard origin/master
- git clean -f
- git pull
- sleep 2
- echo "building..."
- t2=`date +'%Y-%m-%d %H:%M:%S'`
- gitbook build
-
- if [ $? -eq 0 ];then
- echo "$t2 Finished." >> /home/nginx/workspace/gitbook/scripts/info.log
- else
- echo "$t2 Error!" >> /home/nginx/workspace/gitbook/scripts/info.log
- fi
注意事项: source /home/nginx/.bash_profile
其中加入/$HOME/.nvm/versions/node/v10.15.3/bin/
,否则可能导致脚本运行时找不到gitbook命令,构建失败。
github配置webhook
-
进入项目,Settings;
-
Webhook
-
Add webhook
-
Payload URL:ip或域名(解析到服务器)+上面脚本监听的端口+项目名称,如:
http://domainname:7777/devops_docs
-
Content type:
- application/json
- application/x-www-from-urlencode
-
Secret:保持和webhook.js中一致
-
选择要监测的github动态:默认只监听
push event
就好 -
Active!
测试
通过上面的配置,及完成了自动化部署的所有操作,此时可以通过向仓库中push代码来进行测试。
开启Active后每次推送都会有详细日志,如果推送失败,根据日志调试即可。