Hexo自动发布工程

前言

去年开始开了个仓库记录自己的每天学习的目标和成果,以此来进行自我督促。一年多过去,虽然还是由于各种原因中断了很多次,但是勉强还算把这个行为坚持了下来。现在也已经产生了不少记录的数据,于是想搞个前端页面用来浏览记录,而博客的时间轴归档很适合用来做这项工作。

单纯地把日志的文件放到hexo工程里生成发布,确实用不了几步操作,但是这将是一个会长期反复执行的操作,久了总会令人烦躁。俗话说,懒是人类进步最大的动力,构想中,我应该只需要每天写好记录,丢到仓库里,工具就会利利索索地把它展示到页面上。这种一般直接用git的钩子之类的就能实现,但是我想顺便对文章内容做些处理。比如日志的仓库跟博客结构不太一样,一些引用还有图的路径需要做变换等等。于是就有了这篇文章记录的东西——hexo文章的自动发布。

主要轮子

关键词:轻量。在硬件资源有限的情况下,第一次体会到Java这个鬼东西到底有多吃性能…原计划使用Jenkins做CI组件,结果跑几个任务直接OOM,1G小鸡表示承受不起

  • Hexo
    轻量的博客框架
  • Gogs
    轻量的git服务
  • Drone CI
    轻量的持续集成框架

部署过程

基础环境

  1. 安装pythonnode.jsdocker

用各系统的包管理工具拉取即可,以centOS为例

1
yum install -y docker python nodejs
  1. docker部署GogsDrone CI

Gogs

Gogs可以手动安装,不过省事点可以直接docker拉配置好的镜像

1
2
docker pull gogs/gogs
docker run --name=gogs -d -p 10022:22 -p 10080:3000 -v /var/gogs:/data gogs/gogs

10022,10080为本机映射端口,可以按需设置。Gogs容器的web端口为3000,访问服务器对应的映射端口即可。

Drone CI

drone是直接用docker镜像的形式发布的,直接拉取部署。需要分别配置serverrunner

注意,如果用不同的drone版本,参数配置等会有所不同

1
2
docker pull drone/drone:1
docker pull drone/drone-runner-docker:1

drone具体用法这里不详述,需要注意的是安装runner的类型必须跟.drone.yml里配置的运行类型对应,这里官方文档没有详细指出,比较坑。

之后从docker启动drone,参数详见文档

  • drone server

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    docker run \
    --env=DRONE_GOGS_SERVER=本机ip:gogs web端口 \
    --env=DRONE_RPC_SECRET=密钥 \
    --env=DRONE_SERVER_HOST=本机ip:drone本机端口 \
    --env=DRONE_GIT_ALWAYS_AUTH=true \
    --env=DRONE_SERVER_PROTO=http \
    --env=DRONE_USER_CREATE=username:用户名,admin:true \
    --volume=/var/lib/drone:/data \
    --publish=drone本机端口:80 \
    --restart=always \
    --detach=true \
    --name=drone \
    drone/drone:1
  • drone runner

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    docker run \
    --env=DRONE_RPC_PROTO=http \
    --env=DRONE_RPC_HOST=本机ip:drone本机端口 \
    --env=DRONE_RPC_SECRET=密钥 \
    --env=DRONE_UI_USERNAME=droneUI用户 \
    --env=DRONE_UI_PASSWORD=droneUI用户密码 \
    --volume=/var/run/docker.sock:/var/run/docker.sock \
    --publish=runner本机端口:3000 \
    --restart always \
    --name runner \
    --detach=true \
    drone/drone-runner-docker:1

server与runner的RPC密钥需一致;droneUI用户名和密码可以随意填写,docker runner似乎不是必需的。

部署完成后可使用Gogs的用户登录drone,需要管理员账户才可以显示所有的仓库设置项

仓库部署

项目一共分三个,hexo工程日志仓库迁移处理工程,全部存放在Gogs中。我需要在日志仓库迁移处理工程发生提交时触发迁移处理工程迁移处理工程处理结束或hexo工程发生修改时触发hexo工程来更新页面,由此可以开始进行drone配置。

迁移处理工程处理结束触发hexo工程的操作drone原生不支持,我这里使用了downstream插件来解决,各工程.drone.yml如下
hexo工程

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
---
kind: pipeline
type: exec
name: update hexo

steps:
- name: build
volumes:
- name: hexo_project
path: /hexo_project
- name: lbin
path: /lbin
commands:
- cd /root/hexo_project
- git checkout -f
- git pull
- hexo g

volumes:
- name: hexo_project
host:
path: /root/hexo_project
- name: lbin
host:
path: /usr/local/bin

日志仓库

1
2
3
4
5
6
7
8
9
10
11
12
---
kind: pipeline
name: default

steps:
- name: trigger
image: plugins/downstream
settings:
server: (drone server)
token: (personal token)
repositories:
- lozzmki/hexo_builder@master

迁移处理工程

1
2
3
4
5
6
7
8
9
---
kind: pipeline
type: exec
name: build

steps:
- name: build
commands:
- python3 main.py build --target all

这里有调用hexo的操作,需要把存放nodejs相关可执行程序的目录挂载到drone的容器上。

实测更新运转正常,上传的日志经过处理最后会发布到hexo博客页面上。机器上所有任务加起来一共使用了不到500M RAM,小而美。


Hexo自动发布工程
http://blog.lozzmki.top/posts/41342.html
作者
Lozzmki
发布于
2021年8月15日
许可协议