基于Vultr等VPS和各种Git的HEXO博客自动构建
Hexo博客的自动构建一直是个比较头疼的问题,之前写过一篇关于travis下构建博客的文章:《HEXO博客自动集成配置(travis篇)》
不过是基于开源库github和仅适用于github的travis自动构建系统进行搭配使用的,最大的弊端就是你的被构建库必须是开源库,否则就请付费github私有库,再进行构建,可惜,github私有库在目前来说,对于大多数像碎碎念这样的穷逼来说,还是太贵了,还不如自己买一个vps来得实惠。
于是乎,就有了这篇——适用于多种Git版本管理仓库的自动构建方案!
首先,你要有一台VPS……
** Vultr近期有超值优惠活动 **
准备工作
创建或指定托管的Git仓库
首先,将源代码托管于可稳定访问的Git托管服务商,比如Bitbucket。
不建议将代码托管于国内部分服务商,毕竟国内的Git托管政策是会随时调整的,经历过因为突然被收费而浪费大量时间整理仓库的苦痛,所以,现在我只敢信任老牌托管商。
另外,鸡蛋不要放在一个篮子里,多一份拷贝放到另一个托管商,保证Git不受GFW的影响而可以随时切换。
准备一台可访问VPS
然后,有一台可以外部访问的vps主机,虚拟主机请绕道,因为不(太)适(低)用(端)!
试验过搬瓦工和vultr后,我毅然决然地选择了后者,毕竟,活动很超值:注册新用户,充值5美元即可获赠25美元,用新的邮箱和PAYPAL进行充值,5美元喜滋滋用一年。
开始搭建
新建VPS主机/配置VPS
登录Vultr,新建一台server,选择系统:Centos7 64x
我选的是迈阿密的,相比纽约机房,迈阿密机房的速度算是很高的,主要是最便宜的主机也就这两个机房了。
安装配置Nginx和Nodejs 环境
执行一键脚本安装或参照脚本内容逐行按需运行:
# NGINX+NODEJS一键安装命令
bash <(curl -s https://raw.githubusercontent.com/nooldey/scripts/master/sh/nginx/install_nginx.sh)
配置git环境
yum -y install git
# 设置全局git用户名和邮箱,注意!!!这里填写你自己的信息
git config --global user.name "Nooldey"
git config --global user.email "nooldey#gmail.com"
设置目录
Nginx 访问目录: /usr/share/nginx/html/blog/
Git 同步文件目录: /home/nooldey/git/
Git Webhook运行目录: /home/nooldey/webhook/hook.js
1.Nginx配置
配置文件的默认文件在:/etc/nginx/conf.d/default.conf
修改default.conf内容如下:
server {
listen 80;
server_name zhuweisheng.com.cn;
location / {
root /usr/share/nginx/html/blog;
index index.html index.htm;
}
location /webhook/ {
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://127.0.0.1:5555;
}
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
location /50x.html {
root /usr/share/nginx/html;
}
}
2.在git同步文件目录下clone目标仓库
请先用root用户建立对应git仓库的ssh密钥对,并测试ssh连接成功。
cd /home/nooldey/git/
# git clone git@{domain}.com:{user}/{projectname}.git
git clone git@github.com:nooldey/nooldey.github.io.git ./
3.创建git同步脚本,这里基于nodejs实现
vi /home/nooldey/webhook/hook.js
# 在打开的编辑器中,填入以下内容
/*
* @Author: nooldey
* @Author-Email: <nooldey@gmail.com>
* @Date: 2018-03-31 18:19:01
* @Last Modified by: nooldey
* @Last Modified time: 2018-04-04 12:04:01
* @Description: bitbucket仓库更新钩子
*/
const http = require('http'),
exec = require('child_process').exec,
LOCAL = '127.0.0.1',
PORT = 5555;
const buildBlog = (res) => {
let commands = [
'cd /home/nooldey/git/',
'git pull',
'npm i hexo-cli -g',
'npm i',
'hexo clean',
'hexo generate',
'rm -rf /usr/share/nginx/html/blog/*',
'cp -rf /home/nooldey/git/public/* /usr/share/nginx/html/blog/'
].join(' && ');
exec(commands, (err, out, code) => {
if (err instanceof Error) {
res.writeHead(500)
res.end('Server Internal Error')
throw err
}
process.stderr.write(err)
process.stdout.write(out)
res.writeHead(200)
res.end('Deploy Done')
})
}
let deployServer = http.createServer((req,res) => {
// console.log(req)
const fromBitbucket = req.headers['user-agent'].match(/bitbucket/i);
if (fromBitbucket) {
console.log('isBitbucket');
if (req.headers['x-event-key'] == 'repo:push') {
buildBlog(res)
} else {
res.writeHead(200)
res.end('Other action')
}
} else {
res.writeHead(404)
res.end('Not Found')
}
})
deployServer.listen(PORT, () => {
console.log('api running at 127.0.0.1:'+PORT)
})
4.配置自动构建脚本的自动运行
PM2!
全局安装PM2,配置pm2。
5.到git仓库添加webhook
在git仓库的设置中webhook部分,添加webhook连接:http://域名/webhook/hook
测试通过,即可。
Gitalking ...