前言
项目改动频繁,每次都需要手动提交到服务器,过程过于繁琐,所以决定使用自动化部署来简化项目部署过程。
使用技术
git 项目托管工具,支持webhooks(在git接收到操作时可以向指定url发送一个带参数的请求)
nodejs 接收url请求,执行脚本。可用php,python等语言代替
nginx web服务器,实现项目的访问,可用apache等web服务代替
git webhooks配置
在项目的webhooks中配置触发条件以及触发的url
pathName用于区分是哪个项目触发的事件,如果只需要自动部署一个项目可以省略
NodeJs
需要在服务器安装好node运行环境以及Node守护程序forever(node守护神,如果遇到问题程序崩溃立即重启),创建一个service.js将下列代码copy进去(具体配置需要自行修改),启动程序forever start server.js,程序运行成功后点击对应的webhooks后的test,如果返回200代表成功。
const http = require("http");
const url = require("url");
const exec = require("child_process").exec;
const hostName = '127.0.0.1';//ip地址,需要和webhooks填写的ip一致,可以是一个域名
const port = 8888;//端口号
const server = http.createServer((request, response) => {
var req = url.parse(request.url, true);
var pathName = req.pathname.slice(1);
if(!pathName) {//路径不存在
response.writeHead(404);
response.end("请输入正确的路径!");
}
var task = "";
//根据不同的路径执行不同的命令,针对多个项目的自动部署
if(pathName == "pathName") {
task = "cd project && git pull";//可指定分支,需要预先在服务器clone一份代码
} else {
response.writeHead(404);
response.end("错误的任务路径!");
}
//执行命令
exec(task, (err, stdout, stderr) => {
if(err) console.error(err);
response.writeHead(404);
response.end("执行失败");
});
response.writeHead(200, {'Content-Type': 'text/plain'});
response.end("执行成功\n");
});
server.listen(port, hostName, () => {
console.log(`Server running at http://${hostName}:${port}/`);
});
nginx实现web部署
server {
listen 80;
server_name www.baidu.com;//监听的域名
location /
{
root /projectPath;//指定项目路径
index /index.html;//欢迎页
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}