天天看點

使用Travis CI自動部署Hexo部落格

自從使用GitHub Pages和Hexo來釋出部落格之後,不得不說友善了許多,隻需要幾個簡單的指令部落格就釋出了。但在不斷的使用中發現每次的釋出操作也挺耗時的。

後來看到一篇文章介紹可以使用Travis CI來自動部署hexo的部落格,隻需要将md檔案 <code>pull</code> 到倉庫中部落格就自動釋出好了。趁着這幾天工作任務不太着急,研究了一下,特紀錄在此,希望能幫到有需要的朋友。

Travis CI 是目前新興的開源持續內建建構項目,用來建構托管在GitHub上的代碼。它提供了多種程式設計語言的支援,包括Ruby,JavaScript,Java,Scala,PHP,Haskell和Erlang在内的多種語言。

因為我之前的部落格源檔案是存放在私有的git管理工具下,如果我們要使用Travis CI自動部署,必須将這些部落格的源碼檔案放到GitHub上才能被Travis通路到。因為 <code>GitHub Pages</code> 預設要求必須使用 <code>master</code> 分支存放靜态檔案,我們可以在該倉庫下使用其他分支來存放部落格源碼檔案,或者新建立一個倉庫來單獨儲存。這裡我們把hexo部落格的源碼放在 <code>hexo</code> 分支下,部落格的靜态檔案部署在 <code>master</code>分支下。

對于如何在GitHub上建立分支,相關操作指令如下,僅供參考:

當切換到 <code>hexo</code> 分支後,因為我們是需要用 <code>hexo</code> 分支來存放部落格源碼檔案的,是以,将 <code>hexo</code>分支下的檔案除 <code>.git</code> 目錄外全部删除,然後将部落格源碼檔案拷貝到該目錄下,并 <code>commit</code> 到 <code>hexo</code> 分支.

然後我們需要将本地的 <code>hexo</code> 分支送出到遠端倉庫中

這樣我們在GitHub的倉庫下就能看到 <code>hexo</code> 分支為部落格源檔案,<code>master</code> 分支為靜态檔案。

這裡需要注意一點,當我們新增部落格md檔案時,擷取遠端分支時要指定分支的名稱,否則會預設擷取 <code>master</code> 分支:

使用Travis CI自動部署Hexo部落格

然後點選後面的齒輪圖示進入設定界面。

如果你之前已經勾選過項目,可以進到項目首頁中,在右上角找到 <code>More options</code> 選項下的 <code>Settings</code> 進入設定界面。

使用Travis CI自動部署Hexo部落格

在 <code>General</code> 區域開啟:<code>Build only if .travis.yml is present</code> 表示“隻有當 <code>.travis.yml</code> 存在時才建構” ;開啟:<code>Build branch updates</code> 表示 “當分支更新時建構” 兩個選項,如下:

使用Travis CI自動部署Hexo部落格

Travis CI在自動建構完成後需要push靜态檔案到倉庫的 <code>master</code> 分支下,而通路GitHub的倉庫是需要權限的,下面來看看如何配置權限。

如下圖,<code>Environment Variables</code> 區域就是用來添權重限資訊的。我們需要填寫一個Token的名稱和值,該名稱可以在配置檔案中以 <code>${變量名}</code> 來引用,該Token我們需要從Github中擷取。

使用Travis CI自動部署Hexo部落格

之前我們在使用指令 <code>hexo d</code> 部署hexo部落格到GitHub上時,是因為本地有 <code>SSH key</code>,當交給 Travis 去自動部署時我們也需要設定可操作權限,這裡我們使用GitHub提供的token變量來實作。

登陸 <code>GitHub</code> --<code>Settings</code> 選項,找到 <code>Personal access tokens</code> 頁面。

點選右上角的 <code>Generate new token</code> 按鈕會生成新的token,點選後提示輸入密碼後繼續,然後來到如下界面,取個名字(我這裡取 <code>Travis_Token</code> 下面的配置檔案中會用到),勾選相應權限,這裡隻需要 <code>repo</code> 下全部和 <code>user</code> 下的 <code>user:email</code> 即可。

使用Travis CI自動部署Hexo部落格

生成完成後,将該token拷貝下來。這裡需要注意的是該token隻有這個時候才能看到,當再次進入這個頁面時就隻會顯示之前設定的名稱了。如果忘記了隻能重新生成一個。

使用Travis CI自動部署Hexo部落格

将上面擷取到的token添加到 <code>Environment Variables</code> 部分,值為該 <code>token</code> ,而名稱即為上面設定的 <code>Travis_Token</code> (請更改為個人所設定名稱)。不勾選後面的 <code>Display value in build log</code> . 否則會在日志檔案中暴露你的 <code>token</code> 資訊,而日志檔案是公開可見的。

至此我們已經配置好了要建構的倉庫和通路的token,接下來就是如何建構的問題了。

之前的步驟中我們勾選了一項 <code>Build only if .travis.yml is present</code>,是以我們要在部落格源碼檔案的<code>hexo</code> 分支下新增一個 <code>.travis.yml</code> 配置檔案,其内容如下:

注意:需要将配置檔案中的 <code>GH_TOKEN</code> 換成我們自己設定的名稱,這裡我的配置應該是 <code>Travis_Token</code> 即 <code>- git push --force --quiet "https://${Travis_Token}@${GH_REF}" master:master # GH_TOKEN是在Travis中配置token的名稱</code>。 還要更改 <code>GH_REF</code> 中我們的部落格倉庫的位址。

配置檔案中的操作也很簡單,這也是網上找到的比較常見的一種配置格式了。然而,這份配置檔案中卻隐藏着一個大坑。至于如何跳過去,後面再詳說。

當 <code>.travis.yml</code> 配置檔案修改完成後,将其送出到遠端倉庫的 <code>hexo</code> 分支下,此時如果之前的配置一切ok,我們應該能在 <code>Travis CI</code> 的部落格項目首頁頁面中看到自動建構已經在開始執行了。上面會顯示出建構過程中的日志資訊及狀态等。

使用Travis CI自動部署Hexo部落格

在 <code>Travis CI</code> 的日志檔案中,如果遇到下面的錯誤提示,那可能就是 <code>.travis.yml</code> 檔案的格式有問題。

通過在github上查詢,我發現這個問題是我在配置檔案中的縮進使用了 <code>tab</code> 鍵導緻的。因為在不同的編輯器下,<code>tab</code> 鍵表示的寬度可能不同。

這裡建議是:不要用 <code>tab</code> 鍵,而是用适當的空格實作縮進

<a href="https://github.com/ruby/psych/issues/136">found character '\t' that cannot start any token while scanning for the next token at line · Issue #136 · ruby/psych · GitHub</a>

檢視日志提示是權限問題。

這裡的問題是我在 <code>.travis.yml</code> 配置檔案中沒有把 <code>${GH_TOKEN}</code> 部分換成自己在 <code>Travis CI</code> 中填寫的token名稱而導緻的。執行時找不到token,也就沒法設定權限了。

如果你按照上面的 <code>travis.yml</code> 配置檔案的設定去自動建構你的部落格,你會發現 <code>master</code> 分支的送出記錄隻有目前送出的這一條,而且無論操作多少次,也僅僅隻有一條。這還真的是一個大坑呀!

<code>.travis.yml</code> 部配置設定置内容:

仔細檢視上面的配置檔案,我們發現每次都是将 <code>public</code> 目錄下的檔案重新生成了一個git項目,然後強制覆寫送出到了 <code>master</code> 分支下,這就是問題的所在。

為了解決這個問題,我将配置檔案改為了如下的内容:

在 <code>after_script</code> 部分,我先将部落格項目 <code>clone</code> 到本地的 <code>.deploy_git</code> 目錄下(目錄名可自定義),然後切換到 <code>master</code> 分支,将 <code>master</code> 分支下的 <code>.git</code> 目錄拷貝到了 <code>public</code> 目錄下,接着繼續後面的 <code>commit</code> 操作。

這裡算是采用了一種 <code>換位</code> 的方式。之前我們通過git管理檔案時并不會改動 <code>.git</code> 目錄,而隻是更改檔案。但在這種情況下,我們需要送出的是 <code>public</code> 目錄下的新檔案。這樣,就會保留之前的送出記錄了。

附上我在使用的配置檔案内容:

注意上面配置檔案中的某些參數改為自己的。

在網上看到一位網友解決 “<code>master commit</code> 樹被清空” 的問題時采用了另外一種方法,即在 <code>after_script</code> 部分調用執行 <code>hexo d</code> 指令來釋出。這樣的方式遇到的問題是需要設定 <code>SSH Key</code>或者必須獲得權限才能進行 <code>push</code> 操作。

有一種授權的方式是通過https使用OAuth驗證的方式将token添加到url中來送出。即需要更改 <code>_config.yml</code> 中的如下部分:

為:

而這樣一來 token 就暴露在配置檔案中了。是以還需要在操作指令中使用替換的方式隻在自動部署時更改該token。

這裡僅做介紹,更詳細可通路:

<a href="https://blog.xingoxu.com/2016/12/use-travis-ci-your-blog/">使用Travis Ci使hexo自動生成并部署 | xingo's private plot</a>

<a href="https://github.com/blog/1270-easier-builds-and-deployments-using-git-over-https-and-oauth">Easier builds and deployments using Git over HTTPS and OAuth · GitHub</a>

<a href="http://www.jianshu.com/p/e22c13d85659">手把手教你使用Travis CI自動部署你的Hexo部落格到Github上 - 簡書</a>

<a href="http://www.jianshu.com/p/5e74046e7a0f">使用 Travis CI 自動部署 Hexo - 簡書</a>

<a href="http://zhzhou.me/2017/02/20/auto-deploy-hexo-on-travis-ci/">使用 Travis-CI 來自動化部署 Hexo · ZHOU</a>

該文章同步發表在:

<a href="http://www.cnblogs.com/babycool/p/7326722.html">使用Travis CI自動部署Hexo部落格 - 酷小孩 - 部落格園</a>

<a href="http://www.itfanr.cc/2017/08/09/using-travis-ci-automatic-deploy-hexo-blogs/">使用Travis CI自動部署Hexo部落格 | IT範兒</a>

本文轉自 酷小孩 部落格園部落格,原文連結:http://www.cnblogs.com/babycool/p/7326722.html  ,如需轉載請自行聯系原作者