使用 Git + Drone 自动发布我的 Hexo 博客
从重建博客说起
从前段时间使用 Hexo 重建了博客开始,我一直使用 Typora 在本地写博客,Typora 的体验是很棒的,Hexo 带来的网站体验也不错。通常的写作体验如下:
创建文章的时候,我需要执行
1
hexo new post title
然后在 Typora 中写作,Typora 我直接打开了
path/to/hexo/source/_posts
这个目录,有新的 Markdown 文件在侧边可以看到。写作完成后,切到终端执行
1
hexo g
之后调用我自己写了一个同步脚本,将
public
中的文件全部同步到 OSS 中。
整个流程需要不断地切换软件,比较繁琐。
由于我的博客为了备份,在自己的 Git 仓库(Gitea 搭建)中也会上传一份,也就是说,还要一个第五步
提交并备份代码
1
2git commit -m 'message'
git push
由题意得,步骤 3、4、5 其实可以合并为一步。既然用到了 Git,那这情种况,使用 CI/CD 工具是最好的办法了。
Drone
Drone 是我在搭建 Gitea 仓库的时候,就一起部署好了的了,然后它就开始吃灰。终于有一天,我想起了自己这一套已经配好的代码托管 + 自动构建平台。自然而然,就可以用这一套环境来实现我的自动构建的想法了。
当时选 Drone 的理由很简单,就是觉得 Jenkins 界面太丑了。
其实早些的部署,并不能算是完全体,还差一个 Runner。不过这个很容易装,拉下来镜像,写个 docker-compose.yml 启动即可。
编写 .drone.yml
由于 Drone 的配置文件是放置在项目目录里的,只需要在 Hexo 目录下新建一个 .drone.yml 文件,并开始写构建步骤就好,我的配置文件大致如下
1 |
|
Runner 工作时,Drone 会创建一个临时的镜像用来进行这些操作,其中当前目录(默认是 /drone/src
)是 Drone 拉取到的代码存放的位置,而所有的命令都是在项目目录下进行。在这里我一共用了两个镜像。
第一步中,使用
node:lts
镜像,用来提供 Node 环境。在镜像里安装依赖,并进行构建。这一步已经做完了生成 Hexo 静态网页的事情。将生成的文件上传到 OSS。这里用的镜像是我自己构建的一个镜像,Dockerfile 如下,是在 docker-ossutil 的基础上做了调整:
1
2
3
4
5
6
7
8
9
10
11FROM alpine as certs
RUN apk update && apk add ca-certificates
FROM busybox:glibc
COPY --from=certs /etc/ssl/certs /etc/ssl/certs
ENV OSSUTIL_VERSION 1.6.0
RUN mkdir -p /usr/local/bin \
&& wget http://gosspublic.alicdn.com/ossutil/${OSSUTIL_VERSION}/ossutil64 -O /usr/local/bin/ossutil \
&& chmod +x /usr/local/bin/ossutil
配置Secrets
Drone 的 Secrets 是用来在管理后台上配置的一些比较秘密的参数,比如各种 Token 各种 Key。界面如下图:
只能添加和删除,不能查看,写错了就得重写。
使用的话就是上面写的 .drone.yml 中的 from_secret
就可以拿到数据了哦。值得一提的是,如果加一个命令,打印从 secret 中拿到的值,在 Drone 的控制台里会显示成 ****** 的。
开始构建
激活后的 Drone 配置,无需手动干预,只需要将代码推送到 Gitea 上,就开始了自动构建。
可以看到,虽然执行了 npm 安装依赖,但是由于淘宝镜像源的关系,还是很快速的,如果盯着看整个构建过程的话,会感觉赏心悦目。Drone 把界面、实时的状态变更和控制台的输出都处理的很优雅,看来我没选错(偷笑。
踩的坑
Node 依赖
本来是想先创建一个已经安装好了 node_modules 的镜像作为基础镜像,之后再就不需要安装依赖,但是由于 Drone 在构建的时候,创建了一个 Volume,每一步的操作的镜像都会把这个 Volume 映射到 Docker 中。这个 Volume 实际上也就是工作的空间,又加上 Drone 会克隆仓库代码到工作目录,又会清除原来的文件,种种原因把我给绕晕了,最后就先放弃了这个方式,改用每次都安装依赖。
好在使用了淘宝源,安装的速度还是很快的,所以这一块以后再具体研究一下。
Drone 执行命令
最早看到了 docker-ossutil 这个镜像,我是想直接拿来用的,但是 Dockerfile 中最后声明的 ENTRYPOINT,给我整晕了,毕竟这个镜像一启动就会执行指定的命令,需要提供的只有参数即可,查了半天没找到怎么在 .drone.yml 中仅配置参数,只好暂时放弃,自己重新构建了一个镜像,然后执行了两条命令搞定。
OSS 的 Endpoint
OSS 的 Endpoint 是用来提供服务的主机名,不同的地域是不同的。我一开始只配置了地域名,导致失败了几次,低级错误。
具体的地域和 Endpoint 对应表在这里可以看到 https://help.aliyun.com/document_detail/31837.html
小结
一篇文章写下来,反而觉得自己折腾了一晚上搞的事情居然没啥技术含量。而且也有不少粗心大意的低级错误卡进度的。有细节的问题,我会再更新到这篇文章。自动发布博客至此就粗略的告一段落,至于离我预期的流畅体验差多少呢?还是挺多的,以后会开个新坑,来不断完善自己的写作体验。