若是你但愿本地执行git push
到git服务器后,在目标服务器上直接拉取代码并进行部署的话,能够参考下本教程。node
ui同窗平时把素材包都放在git.ui
的git仓库中,几个版本迭代下来,整个仓库的大小已经达到了1.7g,每次clone都很艰难...git
直到有一天,有人在群里建议能够直接挂在服务直接访问...github
拆分这个需求,有两个点须要实现:web
步骤1
。进一步拆分,从这两个角度出发,第一个点有不少实现方案,在这里罗列几种实现方案:shell
这里以第一种方案为例,来具体实现一下。npm
所以整个流程须要分红三端,客户端(新变动推送)、git服务器(git挂载服务器)、目标服务器(进行自动部署的服务器)。考虑到第二点,在仓库被push的时候,要自动触发消息。天然想到使用githook来处理(githook的介绍能够看这篇)。可是githook中无论是客户端钩子仍是服务端钩子都只能在客户端和服务端之间双向连接,所以须要使用git服务器的webhook功能(webhook介绍)。整个流程以下图:segmentfault
由上面思路流程,node服务须要区分请求的类型:bash
关于静态文件部署,调研了两个npm包:st和serve-handler。二者均可以进行静态资源部署,可是经测试,st对中文命名的目录名支持很差,会出现乱码,serve-handler对中文目录支持比较好,故选择serve-handler。服务器
关于执行脚本拉取仓库,有两种方案推荐,一种是node执行脚本或执行命令行命令的方式child_process,利用子进程进行脚本的执行,另一种是第三方的shelljs,是在child_process
的基础上的封装,调用系统命令更简单。故选择第二种。框架
所以具体代码以下:
var http = require('http');
// 静态文件部署
var handler = require('serve-handler');
// 执行shell命令
var shell = require('shelljs');
http.createServer(function(request, response) {
var urlMethod = request.method;
if(urlMethod === 'POST') {
// 拿到POST请求,输出内容并执行git pull操做
console.log("POST request");
var content = "";
request.on('data', function (chunk) {
content += chunk;
});
request.on('end', function () {
response.writeHead(200, {"Content-Type": "text/plain"});
response.write("You've sent: " + content);
response.end();
console.log("POST data:",content);
});
try{
// 拉取最新代码
shell.exec("git pull");
console.log("POST success");
}catch(e) {
console.log("POST fail");
}
return;
}else {
// GET请求,直接调用serve-handler来静态资源重定向
console.log("GET request");
console.log("GET url", request.url);
return handler(request, response, {
"public": "git.ui"
});
}
}).listen(8080);
console.log('Server started');
复制代码
在目标服务器上用pm2部署服务,同时在git服务器上设置webhook的触发地址,完成目标服务器的部署。
后续能够注册服务和域名,将机器绑定域名,或利用现有服务配置Nginx映射。
你们有兴趣的能够试着实现如下第二种第三种访问静态文件的部署方案。