基于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。

参照Centos7开机自启动node应用

5.到git仓库添加webhook

在git仓库的设置中webhook部分,添加webhook连接:http://域名/webhook/hook

测试通过,即可。

NOOLDEY

本文作者:NOOLDEY

做一个诗情画意的码农,皮皮猪,我们走!

原文链接: http://zhuweisheng.com.cn/hexo/git-vps/

本站文章如无特殊声明均为原创,创作不易,转载请注明来源,谢谢!