给hexo加上自动部署

本博客使用 hexo,源码存放在 github 的 private 仓库里,之前都是编写好 push,再登录服务器 pull,再 hexo g,非常麻烦。从即日起,使用 github 提供的 webhook 技术,将部署过程自动化,全程不需要登录服务器。

本文记录过程中踩过的坑。

Apache2多个wsgi的配置

在此之前,我的 apache2 会将静态资源指向 /var/www/html,/comment 指向使用python 编写的评论系统

使用的配置为:

1
2
3
4
5
6
7
<VirtualHost *:443>
......
......
WSGIDaemonProcess example.com python-path=/var/www/blog_comment
WSGIProcessGroup example.com
WSGIScriptAlias /comment /var/www/blog_comment/blog_comment/wsgi.py
</VirtualHost>

现在我需要将分配 /webhook 的处理逻辑,直接将上面三句复制粘贴是不行的,必须要额外加内容,最后如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<VirtualHost *:443>
......
......

WSGIDaemonProcess example.com python-path=/var/www/blog_comment
WSGIScriptAlias /comment /var/www/blog_comment/blog_comment/wsgi.py
<Location /comment>
WSGIProcessGroup example.com
</Location>

WSGIDaemonProcess ex2
WSGIScriptAlias /webhook /var/www/app.py
<Location /webhook>
WSGIProcessGroup ex2

</Location>
</VirtualHost>

无法解决 github webhook http timeout 的问题

github 收到 push 后会调用我的 API,客户端的 timeout 是 10 秒且无法自定义,但我需要较长的时间才能完成部署,所以这个问题无解,只能服务器后台进行部署,给 github 暂且返回 200。

因此,无法从 github 的日志里确认是否成功部署。

使用 sudoer 解决权限问题

我的 repo 用的是 ubuntu 用户,而 apache2 用的是 www-data 用户,当 www-data 尝试 git pull 时,会因权限不足导致无法 git pull,同样也无法 hexo g。

这里在 sudoer 里追加一句,允许 www-data 以 ubuntu 的身份执行某些命令。

1
www-data ALL=(ubuntu:ubuntu) NOPASSWD: /home/ubuntu/deploy.sh

即使 sudoer,www-data hexo g 报错

因为我安装 nodejs 时是在 home 目录下装的,www-data 或多或少会有权限缺失,全都卸载掉,使用 root 给所有用户都装上 nodejs 就可以了。

1
2
3
4
sudo apt install node npm
sudo npm install n -g
sudo n stable
sudo npm install hexo-cli