在 Gitlab Pages 上面以 Hexo 來架構部落格

本來,打開 blogger ,開始撰寫下一篇文章,然而寫起來卡卡的。不是 blogger 運作起來很慢,而是 blogger 沒辦法和自己的心同步,就跟使用了不順手工具的感覺差不多。

意識到如果是像 LibreOffice Writer / MS Word 一樣的所見即所得界面似乎不對自己的胃口了。畢竟在 Markdown 裡面,想要標題的話,只要在那行文字前面加上 # 就行了。

不,應該是說,如果用 Markdown,在意的是文字的表達模式而不是格式本身…

嗯嗯,總之當下決定找尋其他的解決方案了。

(Markdown cheat sheet: here

找尋之路

首先想到的就是有沒有現成的部落格系統可以提供使用 Markdown 撰寫的服務。結果當然是有,但是有些要錢,有些也不知道服務起來的情況如何、佈景如何等等。

但是在搜尋的過程中看到了 Github pages 的服務,發現裡面有設計成可以藉著 Jekyll 來幫使用者把 Markdown 的文本轉換成 Html 網頁。( Github pages with Jekyll

這對千秋來說可說是一記當頭棒喝:因為是第一次知道 static site generator (SSG) 的概念。

不過,此時也想到

  • 只能用 Jekyll 呢,自由度不夠

  • Github 上雖然放了大量的開放原始碼軟體,但它服務軟體本身不是開放原始碼的。

簡單的說就是千秋龜毛想太多。

不過退一步想,讓我們放上網頁的空間也是免費提供的,或許也不用計較太多吧!總之,要使用 Github pages 的話可以用下面的應對方式

  • 要破除 Github pages 只能用 Jekyll 的限制的話,那就把建置網頁(產生網頁)的位置從 Gibhub 的主機改到自己的機器上吧!

    也就是把產生好的網頁推到 Github pages 上

  • 服務軟體是不是開放原始碼的似乎也不具有如吃飯呼吸一般的,「絕對必須具備」的重要性

此時,突然想到自己常用的程式碼倉庫 Gitlab 是否有提供類似的服務呢。結果一搜尋下去竟然有!!而且因為 Gitlab 有免費的 CI 服務,所以並沒有限制必須使用的 static site generator (SSG) 品種。

啊啊,太感謝 Giblab 了!!

那要用哪個 SSG 呢…

以 Gitlab 的設計,就算是自己生出來的 SSG 也可以馬上支援,因為 Gitlab 使用 CI 來幫使用者進行建置以及佈署。

好吧,各位,現在這裡有個難題:到底該利用哪種 SSG 呢?(可見得選擇太多似乎也不見得是好事情)

Gitlab 有個 教學頁面 ,舉了使用 Jekyll 以及 Hexo 為例子。因為千秋跟 Ruby 不是很熟,要是東西壞了沒辦法追原因,所以就決定使用 Hexo 了。

挑選佈景的冗長過程就不贅述了,不過若想挑了佈景就不修改的話,要好好觀察佈景上的特性( tag, category 的呈現、文章列表的呈現等等)。

開工囉

那總之先在本機投下部落格的種子吧!利用上面的教學以及 hexo 的說明

1
2
3
4
5
$ cd ~/blog
$ npm install hexo-cli -g
$ hexo init
$ npm install
$ hexo new post hello-world

接著就開始用文字編輯器調整版面,並且編輯第一篇文章的內容了。編輯完成後先在本機測試

1
$ hexo serve

總之經過許多調整之後,感覺文章可以上線了,就加入了如上面 教學頁面 所描述的 .gitlab-ci.yml 檔案,然後就傳到了 chiakikame.gitlab.io 的 Gitlab repo 上。

1
2
3
4
$ git add .
$ git commit -m "init"
$ git remote origin ...
$ git push origin master

等 CI 跑完後,就去 https://chiakikame.gitlab.io/ 看看…404?

排除問題

上網查了,發現有許多人也有這樣的問題。至少看起來是這樣子。這些傢伙都表示隔了幾天之後網站就又莫名得看得到了。不過還是感覺哪裡有點不協調,直到看到了有人表示說「有可能 html 檔案其實沒有被建置出來」。

在 CI/CD 的 Pipeline 上面,點了當時是唯一一個 pipeline ,狀態上面寫 passed 。欸欸,不是通過了嗎?

來看看有沒有紀錄檔。所以點入那個 passed ,進入了 Pipeline 頁面,接著點選 pages 工作,有 log 啦!喔喔!最下面有列出生產出來的檔案… index.html 呢?往上一捲,發現有錯誤

1
2
3
4
5
6
7
8
9
10
/builds/chiakikame/chiakikame.gitlab.io/themes/black-blue/layout/_partial/footer.ejs:11
9| </div>
10| </div>
>> 11| <% if (theme.visit_counter.on) { %>
12| <div class="visit">
13| <% if (theme.visit_counter.site_visit) { %>
14| <span id="busuanzi_container_site_pv" style='display:none'>
Cannot read property 'on' of undefined
at eval (eval at <anonymous> (/builds/chiakikame/chiakikame.gitlab.io/node_modules/hexo-renderer-ejs/node_modules/ejs/lib/ejs.js:549:12), <anonymous>:16:31)

等等的,類似這樣的錯誤有一些。當時以為是 CI 上用的 node 版本太舊了,所以修改了 .gitlab-ci.yml 的內容。令它使用最新的 node 8.5 。結果現在連 pass 都拿不到了!

為啥呢,因為 log 裡面有這樣的東西

1
2
3
4
5
6
7
npm ERR! Error: EACCES: permission denied, scandir '/root/.npm/_logs'
npm ERR! { Error: EACCES: permission denied, scandir '/root/.npm/_logs'
npm ERR! stack: 'Error: EACCES: permission denied, scandir \'/root/.npm/_logs\'',
npm ERR! errno: -13,
npm ERR! code: 'EACCES',
npm ERR! syscall: 'scandir',
npm ERR! path: '/root/.npm/_logs' }

利用 Google 發現這樣的錯誤可以利用調整 .gitlab-ci.yml 來規避:在 - npm install hexo-cli -g 之前加入

1
2
- npm config set user 0
- npm config set unsafe-perm true

就通過了,但是又回到了原點。(上面的「某些變數是 undefined」錯誤)。

此時仔細一看,發現這些變數似乎是來自於佈景主題的 _config.yml 中!等等!該不會這檔案沒有被推上去吧!

上去 Gitlab repo 一看,果真是這樣。那為什麼這個檔案沒有被推上去呢?是因為佈景主題裡面也有個 .gitignore 檔案,而裡面紀錄說要略過 _config.yml

經過這樣的調整,千秋的部落格算是上線了。

上線之後,為了排除似乎是 mixed content 的問題,把 http://7.url.cn/edu/jslib/comb/require-2.1.6,jquery-1.9.1.min 的 CDN 換成了 Cloudflare 的。但現在想想似乎只需要把 http 換成 https 就好了 XD

文章目錄
  1. 1. 找尋之路
  2. 2. 那要用哪個 SSG 呢…
  3. 3. 開工囉
  4. 4. 排除問題