用Hexo搭建好博客澄成,使用起來算是方便,但是每次還要在安裝了Hexo環(huán)境的機(jī)器上才能$hexo new <post>
畏吓、$hexo d -g
墨状,讓隨時(shí)隨地提交文章變的成本更高,畢竟由于網(wǎng)絡(luò)等原因讓安裝個(gè)和使用hexo變的不那么方便菲饼,其實(shí)就一句話:你懂的肾砂。能不能在任何地方只要新增或修改了post就自動(dòng)生成并部署hexo呢?
答案是肯定的宏悦,而且你-也-行镐确!手動(dòng)檔加裝定速巡航,準(zhǔn)備好了嗎饼煞?
最終實(shí)現(xiàn)后的效果是這樣的:
以后可以在CODING.NET上直接提交post或自己git commit
源葫,其他過程均自動(dòng)完成。較之前hexo d
變?yōu)?code>git commit [新增文章]砖瞧。
整體思路
- 用CODING.NET對Hexo項(xiàng)目的源碼進(jìn)行管理(
master
分支息堂,要配置好Hexo部署信息) - 在CODING.NET開啟Coding Pages功能(
coding-pages
分支,靜態(tài)博客站點(diǎn)托管的地方) - 在Daocloud上進(jìn)行Hexo環(huán)境的構(gòu)建
- Daocloud通過持續(xù)集成功能實(shí)現(xiàn)
ssh
自動(dòng)部署到coding-pages
分支(webhook
由Daocloud自動(dòng)創(chuàng)建)
用到的東西
- Hexo 一個(gè)號稱生成速度很快的靜態(tài)博客芭届,臺灣版jekyll。
- NexT a theme for Hexo.
- CODING.NET 中國版Github感耙,主要因?yàn)榭梢悦赓M(fèi)建私有項(xiàng)目褂乍。
- Daocloud 中國版Docker hub,而且還能持續(xù)集成即硼。
實(shí)現(xiàn)過程
Hexo配置
使用和配置自己上官網(wǎng)查詢逃片,提供中文文檔,這里必須配置的是:
# _config.yml
...
# Deployment
## Docs: https://hexo.io/docs/deployment.html
deploy:
type: git
repo: git@git.coding.net:juglans/juglans.git
branch: coding-pages
...
注意:這里采用的是
ssh
的git commit
方式,對后面daocloud.yml
內(nèi)容影響很大褥实。
Hexo項(xiàng)目源碼管理及Coding Pages功能
在Github連接總是無故被斷開后呀狼,找到了CODING.NET,速度很不錯(cuò)损离,但是不喜歡重量級的SPA頁面哥艇,Coding Pages提供了免費(fèi)建站的空間,還能綁定域名僻澎。
安利完了貌踏,說說怎么用的:
- 新建一個(gè)和你用戶名一樣的私有項(xiàng)目(必須是私有,下面介紹)
- 將Hexo主項(xiàng)目放在
master
分支管理窟勃,以后所有部署都通過對master
分支的提交來觸發(fā) - 開啟Coding Pages功能祖乳,因?yàn)樯厦鎋config.yml文件中配置的git地址的分支正是coding-pages,同是還可以綁定自己的域名秉氧,我這里綁定了http://ddr888.xyz/
這里要提一下眷昆,Coding Pages功能有時(shí)會(huì)出現(xiàn)緩存時(shí)間過長的問題,部署完成3個(gè)小時(shí)了還沒看見頁面更新汁咏。
通過master
構(gòu)建Hexo基礎(chǔ)運(yùn)行環(huán)境鏡像
國內(nèi)貌似也沒找到什么合適的CI(持續(xù)集成)平臺亚斋,所以就用了Daocloud,同樣用了討厭的SPA頁面梆暖,但是他有通過Github/CODING.NET自動(dòng)構(gòu)建Docker私有鏡像(公有的收費(fèi)伞访,但是這里必須用私有)并同時(shí)進(jìn)行持續(xù)集成的能力。
開始構(gòu)建:
- 在Hexo主項(xiàng)目根目錄下新建
Dockerfile
文件
# Dockerfile
FROM node:slim
MAINTAINER Juglans <juglans@qq.com>
# 安裝git轰驳、ssh等基本工具
RUN apt-get update && apt-get install -y git ssh-client ca-certificates --no-install-recommends && rm -r /var/lib/apt/lists/*
# 設(shè)置時(shí)區(qū)厚掷,不知道為什么?
RUN echo "Asia/Shanghai" > /etc/timezone && dpkg-reconfigure -f noninteractive tzdata
# 只安裝Hexo命令行工具级解,其他依賴項(xiàng)根據(jù)項(xiàng)目package.json在持續(xù)集成過程中安裝
RUN npm install hexo-cli -g
EXPOSE 4000
- 在Daocloud代碼構(gòu)建功能下新增“通過CODING.NET下的juglnas庫進(jìn)行構(gòu)建”的項(xiàng)目冒黑,并在流程定義下,設(shè)置通過代碼的
Daocloud.yml
文件進(jìn)行Hexo基礎(chǔ)運(yùn)行環(huán)境鏡像的構(gòu)建/持續(xù)集成,這樣配置可以實(shí)現(xiàn)從代碼庫的Dockerfile
和Daocloud.yml
文件進(jìn)行鏡像的構(gòu)建和持續(xù)集成
流程定義
這一步會(huì)在CODING.NET下的juglnas庫中新增一個(gè)webhook到Daocloud勤哗。配置完成后抡爹,手工構(gòu)建一下鏡像,并在鏡像詳細(xì)頁面把最新的鏡像設(shè)置為
latest
芒划,方便在Daocloud.yml
中調(diào)用冬竟。
配置持續(xù)部署腳本
本小節(jié)本來可以和上一節(jié)合在一起,但民逼,為了突出持續(xù)部署的重要性和執(zhí)行過程獨(dú)立性泵殴,特此單列。
具體用法:
- 在Hexo主項(xiàng)目中新建
.daocloud
目錄拼苍,然后生成密鑰對笑诅,把私鑰文件id_rsa
放進(jìn)目錄,把公鑰內(nèi)容添加到CODING.NET
你個(gè)人設(shè)置中的SSH公鑰
中(切記不是放在項(xiàng)目的部署公鑰
) - 在Hexo主項(xiàng)目根目錄下新建
Daocloud.yml
文件(這才是核心)
# Daocloud.yml
image: daocloud.io/juglans/blog:latest #使用已經(jīng)在上一步創(chuàng)建好的Hexo基礎(chǔ)環(huán)境鏡像(并不包括博客項(xiàng)目源碼)
install:
# 安裝npm依賴
- npm install
before_script:
# 新建存放私鑰目錄
- mkdir ~/.ssh
# 將私鑰放入目錄
- mv .daocloud/id_rsa ~/.ssh/id_rsa
# 將ssh配置文件放入目錄
- mv .daocloud/ssh_config ~/.ssh/config
# 修改私鑰和配置文件為可讀權(quán)限
- chmod 600 ~/.ssh/id_rsa
- chmod 600 ~/.ssh/config
# 啟動(dòng)ssh-agent
- eval $(ssh-agent)
# 添加私鑰
- ssh-add ~/.ssh/id_rsa
# 刪除存放私鑰和配置的目錄及文件,不知道為什么要?jiǎng)h掉吆你,如果為了安全性弦叶,集成完成后不就自動(dòng)銷毀了嗎?
- rm -rf .daocloud
# 配置git全局的用戶名和郵件妇多,沒有配置不能clone
- git config --global user.name "juglans"
- git config --global user.email "juglans@qq.com"
script:
# 清除之前生成的文件
- hexo clean
# 生成要發(fā)布的靜態(tài)博客文件
- hexo g
# 根據(jù)Hexo配置的發(fā)布方式和地址進(jìn)行發(fā)布
# 項(xiàng)目_config.yml發(fā)布為git方式伤哺,且使用了ssh連接,因此才有上面的安裝私鑰的過程
- hexo d
# 刪除私鑰文件夾
- rm -rf ~/.ssh/
說明:在install過程中進(jìn)行了
npm install
砌梆,并沒有在鏡像構(gòu)建時(shí)進(jìn)行依賴項(xiàng)安裝默责,這是因?yàn)橐蕾図?xiàng)安裝過程根據(jù)每個(gè)Hexo配置和安裝的功能不同而不同,并沒有通用性咸包,而且本身它就屬于build過程桃序,盡管花費(fèi)時(shí)間稍長(平均耗時(shí)90秒),但是這樣更科學(xué)烂瘫。
- 在Daocloud代碼構(gòu)建->觸發(fā)規(guī)則中設(shè)置在提交代碼到master分支后自動(dòng)觸發(fā)持續(xù)集成/部署媒熊。
觸發(fā)規(guī)則
注意:別忘了在設(shè)置中把持續(xù)集成開關(guān)打開,見上一節(jié)中的鏡像構(gòu)建配置圖坟比,這樣每次
git commit
到master分支芦鳍,靜態(tài)站點(diǎn)才會(huì)自動(dòng)生成并部署到coding-pages分支。
小節(jié)
從與普通Hexo項(xiàng)目的區(qū)別和安全性做個(gè)小節(jié)葛账。
區(qū)別:
- 新增了
Dockerfile
配置文件 - 新增了
daocloud.yml
配置文件 - 新增了
.daocloud
目錄及其中的id_rsa
私鑰文件
安全性方面柠衅,盡管涉及的代碼庫和Docker鏡像庫都是私有的,安全性仍然存在問題:
- 私鑰保存在了Hexo主項(xiàng)目源碼中
- 持續(xù)集成/部署過程中將私鑰放入了運(yùn)行中的容器(盡管進(jìn)行了銷毀)
ps:有個(gè)插曲籍琳,本來想用國內(nèi)的flow.ci做持續(xù)集成/部署菲宴,但是目前還在測試階段,只有邀請碼才能注冊趋急,等注冊到賬號再考慮進(jìn)行非Docker環(huán)境的持續(xù)部署喝峦,國外的Travis CI由于網(wǎng)絡(luò)和對CODING.NET不支持等原因就不考慮了。