Hexo如何实现CI/CD?

  1. 1. Docker
  2. 2. Python
  3. 3. Webhook
  4. 4. 参考链接

现在来介绍一下我的网站是如何实现持续部署的。

Docker

首先要在服务器上Build一个Docker镜像,用于生成Hexo网站,因为如果直接用Python调用shell命令构建的话,会有环境变量和权限的问题,所以这里我们把源代码目录bind到容器中,然后在容器中构建。Dockerfile如下:

1
2
3
4
5
6
7
8
9
10
11
FROM node:12-alpine
RUN echo "Asia/Shanghai" > /etc/timezone \
&& echo "https://mirrors.ustc.edu.cn/alpine/v3.9/main/" > /etc/apk/repositories \
&& npm config set registry https://registry.npm.taobao.org \
&& apk add --no-cache git

VOLUME /build/src
WORKDIR /build
COPY ./build.sh /build

ENTRYPOINT ["/bin/sh", "./build.sh"]

在同目录下新建一个build.sh,用于拉取git仓库和构建,下面给一个参考:

1
2
3
4
5
6
7
echo "Start building."
cd ./src
git pull
yarn global add hexo-cli
yarn
hexo g
echo "Build finished."

然后就是构建Docker镜像

1
docker build -t hexo-build:latets ./

Python

镜像构建完成以后,我们需要在服务器上部署一个Web服务,目前我用的是Python的微服务框架Flask,主要代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import hmac
from hashlib import sha1

import docker
from flask import abort, jsonify, request

from app import app

# 创建签名
def create_signature(secret_key, data):
hashed = hmac.new(secret_key, data, sha1)
return hashed.hexdigest()

@app.route("/", methods=["POST"])
def webhook():
try:
if request.headers["X-Hub-Signature"][5:] == create_signature(
"你的密钥".encode("ascii"), request.data
):
client = docker.from_env()
client.containers.run(
"hexo-build:latest",
auto_remove=True,
volumes={"hexo目录": {"bind": "/build/src", "mode": "rw"}},
detach=True,
)
return "Build was triggered successfully."
else:
return "Wrong secret.", 500
except KeyError:
return "Expected a secret.", 500

Webhook

将本地的博客源代码push到GitHub上,在服务器上clone下来,然后打开仓库的设置,在侧边栏中找到Webhooks

然后新建一个Webhook,填入要接受POST请求的接口链接和前面在Flask中填写的的密钥,两个密钥必须一致。创建密钥完成后,GitHub会发送一个ping事件到指定的连接,以测试链接是否有效,ping的结果可以在下方查看,如果事件投递失败了,可以尝试点击Redeliver重新投递。

最后,你可以在Hexo源代码目录下的public文件夹中找到它,设置好NginxCaddy之类的Web服务器,别人就可以看到你的网站啦(如果服务器在中国大陆境内,需要备案才能通过域名访问)。之后更新文章时候仅需commit,push,不一会你就可以看到你的网站更新啦🎉。

参考链接

本网站所有文章除特别声明外,均采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。