隨時(shí)隨地讓Hexo持續(xù)部署

用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)備好了嗎饼煞?

自動(dòng)化

最終實(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
...

注意:這里采用的是sshgit commit方式,對后面daocloud.yml內(nèi)容影響很大褥实。

Hexo項(xiàng)目源碼管理及Coding Pages功能

在Github連接總是無故被斷開后呀狼,找到了CODING.NET,速度很不錯(cuò)损离,但是不喜歡重量級的SPA頁面哥艇,Coding Pages提供了免費(fèi)建站的空間,還能綁定域名僻澎。

安利完了貌踏,說說怎么用的:

  1. 新建一個(gè)和你用戶名一樣的私有項(xiàng)目(必須是私有,下面介紹)
  2. 將Hexo主項(xiàng)目放在master分支管理窟勃,以后所有部署都通過對master分支的提交來觸發(fā)
  3. 開啟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)建:

  1. 在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
  1. 在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)從代碼庫的DockerfileDaocloud.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ú)立性泵殴,特此單列。

具體用法:

  1. 在Hexo主項(xiàng)目中新建.daocloud目錄拼苍,然后生成密鑰對笑诅,把私鑰文件id_rsa放進(jìn)目錄,把公鑰內(nèi)容添加到CODING.NET你個(gè)人設(shè)置中的SSH公鑰中(切記不是放在項(xiàng)目的部署公鑰
  2. 在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é)烂瘫。

  1. 在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不支持等原因就不考慮了。

參考

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末呜达,一起剝皮案震驚了整個(gè)濱河市谣蠢,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌查近,老刑警劉巖眉踱,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異霜威,居然都是意外死亡谈喳,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進(jìn)店門侥祭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來叁执,“玉大人,你說我怎么就攤上這事矮冬√竿穑” “怎么了?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵胎署,是天一觀的道長吆录。 經(jīng)常有香客問我,道長琼牧,這世上最難降的妖魔是什么恢筝? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮巨坊,結(jié)果婚禮上撬槽,老公的妹妹穿的比我還像新娘。我一直安慰自己趾撵,他們只是感情好侄柔,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著占调,像睡著了一般暂题。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上究珊,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天薪者,我揣著相機(jī)與錄音,去河邊找鬼剿涮。 笑死言津,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的幔虏。 我是一名探鬼主播纺念,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼想括!你這毒婦竟也來了陷谱?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤瑟蜈,失蹤者是張志新(化名)和其女友劉穎烟逊,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體铺根,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡宪躯,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了位迂。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片访雪。...
    茶點(diǎn)故事閱讀 40,675評論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡详瑞,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出臣缀,到底是詐尸還是另有隱情坝橡,我是刑警寧澤,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布精置,位于F島的核電站计寇,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏脂倦。R本人自食惡果不足惜番宁,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望赖阻。 院中可真熱鬧蝶押,春花似錦、人聲如沸火欧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽布隔。三九已至离陶,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間衅檀,已是汗流浹背招刨。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留哀军,地道東北人沉眶。 一個(gè)月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像杉适,于是被迫代替她去往敵國和親谎倔。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評論 2 360

推薦閱讀更多精彩內(nèi)容