摘要:本文主要记录我在服务器上使用 GitHub 的 Webhooks 进行网站自动化部署的过程。最终效果:开发终端向 Github 仓库推送代码后,服务器端自动拉取仓库并重启服务器。搭建过程主要参考了 lovelucy.info 的博客。html
搭建环境:我正在使用的是 Vultr 的服务器,系统版本是 CentOS 7 x64。node
最简单的方法:从 EPEL 库安装 Node.jslinux
$ sudo yum install epel-release $ sudo yum install nodejs // 检查是否成功安装 $ node --version $ npm --version
(注:未经本人测试,版本可能相对较老。)git
我我的搭建过程当中使用了 Node.js 官网 的 Linux 二进制文件来安装 Node.js。下载安装包时要留意 Linux 的版本。(X86/X64)github
// Node.js 安装目录 $ cd /usr/local/bin // Node.js 官网提供的 Linux 二进制文件 $ wget https://nodejs.org/dist/v8.12.0/node-v8.12.0-linux-x64.tar.xz // 解压缩 $ tar xvJf node-v8.12.0-linux-x64.tar.xz // 配置环境变量 $ vi /etc/profile // 添加如下内容到文件末尾 ==================== export NODE_HOME=/usr/local/bin/nodejs export PATH=$PATH:$NODE_HOME/bin export NODE_PATH=$NODE_HOME/lib/node_modules // 添加以上内容到文件末尾 ==================== // 保存退出后source一下,使其当即生效 $ source /etc/profile // 检查是否安装成功 $ node -v $ npm -v
至此,成功在服务器上安装最新版本的 Node.js。web
一个可供参考的例子:deploy.shnpm
#!/bin/bash WEB_PATH='/home/nodejs-be-demo' echo "Start deployment" cd $WEB_PATH echo "pulling source code..." git reset --hard origin/master git clean -f git pull git checkout master npm install npm run start echo "Finished."
application/json
。在配置 Node.js 脚本以前,须要先安装依赖,这里用到了一个中间件github-webhook-handler,以及进程管理服务forever。json
$ npm install -g github-webhook-handler $ npm install -g forever
脚本内容以下:deploy.jsbash
var http = require('http') var createHandler = require('github-webhook-handler') var handler = createHandler({ path: '/autodeploy', secret: 'mySecret' }) // 上面的 secret 保持和 GitHub 后台设置的一致 function run_cmd(cmd, args, callback) { var spawn = require('child_process').spawn; var child = spawn(cmd, args); var resp = ""; child.stdout.on('data', function(buffer) { resp += buffer.toString(); }); child.stdout.on('end', function() { callback (resp) }); } http.createServer(function (req, res) { handler(req, res, function (err) { res.statusCode = 404 res.end('no such location') }) }).listen(7777) // 这里是监听的端口号 handler.on('error', function (err) { console.error('Error:', err.message) }) handler.on('push', function (event) { console.log('Received a push event for %s to %s', event.payload.repository.name, event.payload.ref); run_cmd('sh', ['./deploy.sh'], function(text){ console.log(text) }); }) /* handler.on('issues', function (event) { console.log('Received an issue event for % action=%s: #%d %s', event.payload.repository.name, event.payload.action, event.payload.issue.number, event.payload.issue.title) }) */
这里 Node.js 监听的是 7777 端口,你也可使用 Nginx 反向代理到 80 端口。服务器
用下面的命令测试一下,接收到 push 以后控制台会有输出:
$ node deploy.js
若是没什么问题,forever 就能够开起来了。
$ forever start deploy.js
部署过程当中可能遇到没法访问对应端口的问题,须要检查一下服务器的防火墙设置。大部分服务器都是白名单机制,只开放特定的端口。
CentOS 7 下默认使用的防火墙是 FirewallD,以前版本请搜索iptables。
另:FirewallD 和 iptables 的区别?
FirewallD 相关命令:
启动服务,并在系统引导式启动该服务
sudo systemctl start firewalld sudo systemctl enable firewalld
中止并禁用
sudo systemctl stop firewalld sudo systemctl disable firewalld
检查防火墙状态。输出应该是 running 或者 not running。
sudo firewall-cmd --state
容许或拒绝任意端口/协议(如:12345端口,该规则在 public 区域)
sudo firewall-cmd --zone=public --add-port=12345/tcp --permanent sudo firewall-cmd --zone=public --remove-port=12345/tcp --permanent
从新加载 FirewallD 使规则当即生效
sudo firewall-cmd --reload
查看特定区域的全部配置
sudo firewall-cmd --zone=public --list-all
示例输出:
public (default, active) interfaces: ens160 sources: services: dhcpv6-client http ssh ports: 12345/tcp masquerade: no forward-ports: icmp-blocks: rich rules:
更多详细的 FirewallD 配置,请看 CentOS 上的 FirewallD 简明指南。