为什么要用Markdown
个人很喜欢markdown来编辑文档,这样可以不用鼠标就可以调整文字的属性,非常适合我们这种懒人。
编辑器的问题
本地的编辑器Markdown有很多而且功能完善,界面精美,但是带有很好的Markdown编辑器的博客系统却很少。而且很多由于需要在网页上编辑,导致在无法上网的时候连编辑都无法完成,能做到Git,SVN之类的版本管理的好像只剩GitHub了,但是问题是GitHub又少了点个性化工具。
解决思路
使用本地的Markdown编辑器,完成离线编辑,并加入到Git中,完成版本控制,这一点很简单。
而Git的存在让我们可以在线上直接拉取文章搞事,也就是实现同步,所以这里选取带CI功能的Gitlab。
而由Markdown来生成网页的事情就交由hexo完成吧,而且hexo的主题能帮助我们搞定个性化页面的需求,加上各种插件,能够帮助我们完成各种GitHub上无法实现的功能。
具体过程
首先,准备工作,
- Gitlab:可以使用gitlab.com,也可以用自己搭建的,CE版本是免费的。
- Runner:就是
gitlab-runner
,用来运行CI任务的,需要安装到自己的服务器上,并注册到gitlab。 - hexo-theme-indigo:这是我这次选择的主题,一个material design风格的,只兼容现代浏览器,并且记做
THEMENAME
- 服务器配置:我们最终还是要能从网络查看的,所以服务器配置只需要一个网址和指向一个根目录的
WEBROOT
。 - 模板项目:在gitlab上建立一个模板项目,用来放hexo的核心部分,将来会部署到服务器的
HEXOPATH
上。 - 文章项目:在gitlab上建立一个文章项目,用来放实际的文章,将来会部署到服务器的
POSTPATH
上。
准备工作完成,接下来开始实际操作,我们最终的理想状态就是,本地编辑文章,然后提交到Gitlab上,gitlab-runner
自动运行任务,把文章生成出网页并凡在WEBROOT
下。
要达到这个目的,在运行hexo generate
前需要完成文章项目的内容复制到HEXOPATH/source/_posts
目录下,然后把HEXOPATH/public
目录里面的东西复制到WEBROOT
即可,这个也就是文章项目CI文件里面需要的内容了。1
2
3
4
5
6
7
8
9
10
11
12deploy:
script:
- rm -rf POSTPATH/*
- cp -rf ./* POSTPATH/
- cd HEXOPATH
- rm -rf ./source/_posts/*
- cp -rf POSTPATH/* ./source/_posts/
- hexo generate
- rm -rf WEBROOT/*
- cp -rf HEXOPATH/public/* WEBROOT/
only:
- master
当hexo有更新时,需要更新npm的package。另外如果主题更新以后,不希望修改代码,而是通过更改THEMENAME
完成。所以这里把theme设置成Git的submodule,同时,新建一个配置文件,用来替换掉主题自己的文件,不直接替换是为了在主题更新的时候,能够方便的直接更新,而不需要merge,这对于自动化部署来说是非常重要的。CI配置如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17deploy:
script:
- rm -rf HEXOPATH/*
- cp -rf ./* HEXOPATH/
- rm -rf HEXOPATH/source/_posts/*
- cp -rf POSTPATH/* HEXOPATH/source/_posts/
- cd HEXOPATH
- npm update
- cp -f theme-THEMENAME-config.yml ./themes/THEMENAME/_config.yml
- hexo generate
- rm -rf WEBROOT/*
- cp -rf THEMENAME/public/* WEBROOT/
only:
- master
variables:
GIT_SUBMODULE_STRATEGY: recursive
这样就可以多添加一点自己喜欢的主题,等需要更换的时候直接在gitlab上改一下THEMENAME
并再次运行pipeline就好了。
本地编辑器推荐
Gitbook Editor融合了Git的操作,可以方便的完成提交和上传的操作。而且本来就是给Gitbook使用的,所以在本地能够当做写书一样写,非常方便。(目前发现的bug是,在代码编辑上偶尔无法出现预览,重启可以解决。)
如果使用这个的话,会需要在script上删除SUMMARY.md
总结
Github非常Geek,而缺少一些博客的功能,不能算是一个真博客,而这种方式能够很好的解决这个问题。
PS:没有加入gitlab和runner的详细介绍和使用说明,之后补齐。