---
# System prepended metadata

title: 透過 Jekyll 與 GitHub Pages 經營個人網站

---

# 透過 Jekyll 與 GitHub Pages 經營個人網站

> 正式文章連結：https://stephlin.github.io/writing/2021/03/28/jekyll-github-pages.html

對於資訊工程師或者相關領域的人來說，「寫作」實際上是一種不管在分享資訊、統整知識、抑或形塑個人形象等等方面都有很多的好處，而若你本身對於網頁與架站具有一定程度的熟悉度，你也可以嘗試客製化自己的網頁，進而與其他人的網站做出差異性。

GitHub Pages 是一個支援靜態網頁的免費架站平台，提供 1 GB 的儲存空間以及免費且附 SSL 憑證的域名，因此如果你本身有在使用 GitHub 的話，實不失一個無償架站的好選項！本文將介紹透過 Jekyll 使用 GitHub Pages 的方式，以及一些網站主題的搜尋清單。

<!-- more -->

## 為什麼要寫文章？

我連用程式語言的時間都不夠了，還要用自然語言寫文章？

網路上不管在 Medium 或是個人平台上，也有不少人在探討寫作的好處。雖然這邊有一個小小的盲點是：那些寫文章的人在撰寫的同時就是在做這件事情---意思是說，我們似乎缺少了一些「不常寫文章的人」的意見，這邊不妨就筆者過去學習的經驗去嘗試闡述「寫作」的過程帶來的影響。

筆者從大一開始正式接觸資訊科學，並在大三大四兩年擔任系上的網管，並在以每週固定一個小時為週期的工讀生會議中，開始將過往的所學所知寫成文件，並與同儕及學弟妹分享在這個領域上的各種資訊。

分享資訊的傳統在過去這個工讀團隊中實際上一直存在，然而多數都是採取口頭傳授的方式進行，以至於許多知識在傳遞過程中難以被保存，並借鑑 Amazon 的開會方法[^storm-amazon-meeting-style][^bnext-amazon-meeting-style]，故筆者決定採用文件的形式記錄開會中要講的事情，並且在會議中直接透過文件闡述，而當時筆者並沒有固定寫作的習慣。

[^storm-amazon-meeting-style]: [在亞馬遜，開會禁用PPT！來自貝佐斯的怒吼：「根本搞不清楚在講什麼」-風傳媒](https://www.storm.mg/article/1734921?page=1)
[^bnext-amazon-meeting-style]: [禁止開會用PPT！貝佐斯為何在會議中要求所有人靜坐30分鐘？ | 數位時代](https://www.bnext.com.tw/article/51020/amazon-use-memo-to-replace-ppt-in-meeting)

![](https://i.imgur.com/wRNnBzR.png)
<small style="color: gray">當時筆者撰寫的內部會議文件，當時講述的內容是 SSO.</small>

倒是有個題外話，這個方案在實踐初期仍是一個草創階段，不諱言地，早期寫得實在有點爛，儘管畢業後在碩士班至今為止依舊維持這個形式，在每週進度報告中皆採取這個套路，但這個形式在寫作本身以及闡述上都有著更高的要求，因此至今筆者偶爾在報告時還是會發生「聽眾不知道講者到底在講什麼鬼東西」的窘境。

> 這也可能是筆者比較廢啦抱歉。

不過在筆者每週整理這些文件的過程中，會發現自己也在重新審視過去所學習的東西：首先找資料的過程中，不少會發現以前自己可能誤解的資訊；而在統整資訊的過程中，你會開始讓過去的所學與現在的資訊產生連結，並且讓整件事情是有連貫性的。最後就彷彿一個說書人在講故事般，在闡述的過程中讓各種元素之間的關聯性變強，進而將這些知識內化成一幅幅畫面，每每談起總能信手拈來。

這個現象實際上也在不少文章中有談到[^medium-huli-why-blogging][^medium-huli-blog][^dotblog-why-engineer-blogging][^yehjunwei-why-engineer-blogging]，而綜合來說這些特點到最後都會回到個人身上：寫作文章的本身不只是讓讀者受益，真正得到最大幫助的實際上是作者本身！這也是筆者認為除了興趣之外，從理性層面來看工程師寫文章最重要、最有感的正面效益。

[^medium-huli-why-blogging]: [每一篇心得都有價值——為什麼初學者才更應該要寫心得筆記. 91 哥寫過一篇文章叫做《我為什麼鼓勵工程師寫… | by Huli | Huli’s blog | Medium](https://medium.com/hulis-blog/why-blogging-ab77fd8c6ffa)
[^medium-huli-blog]: [我為什麼寫部落格，以及部落格帶給我的影響. 前幾天有個朋友問了我一個問題： | by Huli | Medium](https://hulitw.medium.com/blog-e7a23a74ae2b)
[^dotblog-why-engineer-blogging]: [我為什麼鼓勵工程師寫 blog | In 91 - 點部落](https://dotblogs.com.tw/hatelove/2017/03/26/why-engineers-should-keep-blogging)
[^yehjunwei-why-engineer-blogging]: [為何軟體工程師應該開始寫部落格(Blog) | Tony Yeh](https://www.yehjunwei.com/773/%E7%82%BA%E4%BD%95%E8%BB%9F%E9%AB%94%E5%B7%A5%E7%A8%8B%E5%B8%AB%E6%87%89%E8%A9%B2%E9%96%8B%E5%A7%8B%E5%AF%AB%E9%83%A8%E8%90%BD%E6%A0%BCblog)


## 透過 Jekyll 架設網站

在前言中提到，GitHub Pages 本質上提供靜態網站，因此任何途徑的終點都是靜態 HTML 頁面，而 Jekyll 是一個幫助你有組織地建構網頁的工具。

完整的安裝流程基本上還是建議讀者直接參考 [Jekyll 官方安裝說明文件](https://jekyllrb.com/docs/installation/)，這邊筆者僅說明針對 Ubuntu 系統的安裝過程。

### Step 1. 安裝 Ruby 及其套件管理器 RubyGems

總言之，直接上指令：

```bash
sudo apt-get install ruby-full build-essential zlib1g-dev
```

安裝指令成功後，接著將相關環境變數加到自己的環境設定檔：

```bash
echo '# Install Ruby Gems to ~/gems' >> ~/.bashrc
echo 'export GEM_HOME="$HOME/gems"' >> ~/.bashrc
echo 'export PATH="$HOME/gems/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc
```

### Step 2. 安裝 Jekyll 與 Bundler 套件

透過 Step 1 取得的套件管理器 `gem` 安裝套件，指令如下：

```bash
gem install jekyll bunder
```

### Step 3. 初始化 Jekyll 專案

到這一步後基本上有兩條道路可以選：第一種是建立 Jekyll 預設環境，然後再自行安排 CSS、JavaScript 等個人化設計；第二種則是 clone 別人已經編排好的框架，之後再視個人狀況做些許微調。

#### Option 1. 建立 Jekyll 預設環境

假設專案根目錄為 `$YOUR_GITHUB_NAME.github.com`，你可以透過以下指令生成基本環境：

```bash
jekyll new $YOUR_GITHUB_NAME.github.com
```

> 將專案根目錄取為 `$YOUR_GITHUB_NAME.github.com` 的目的在於之後 push 到 GitHub 時，你需要遵守 GitHub Pages 的命名規則。

接著在根目錄執行以下指令初始化，並啟動網站：

```bash
cd $YOUR_GITHUB_NAME.github.com
bundle install
bundle exec jekyll serve --livereload
```

> `--livereload` 指令的目的在於當網頁資料有變動的時候，伺服器會自動重新編譯，致使寫作者不需要手動重新啟動服務 (但如果是設定檔相關的更動仍須自行重啟)，留意自動刷新功能需要瀏覽器[擴充功能](https://chrome.google.com/webstore/detail/livereload/jnihajbhpnppcggbcgedagnkighmdlei)支援。

> 因為執行指令沒有很簡潔，因此筆者在使用的時候會在根目錄另外新增檔案 `Makefile`，內容為
> ```
> .PHONY: serve
> serve:
>     bundle exec jekyll serve --livereload
> ```
> 如此一來便可透過指令 `make serve` 取代上述指令。

此時在 localhost:4000 即可看到具備基礎功能的網站！

![](https://i.imgur.com/UNxmXWn.png)
<small style="color: gray">範例網站首頁</small>

#### Option 2. Clone 別人設計好的框架

筆者提供以下兩個地方可以尋找不錯的 Jekyll 主題：

- http://jekyllthemes.org/
- https://github.com/topics/jekyll-theme

接著筆者以 [TeXt Theme](https://github.com/kitian616/jekyll-TeXt-theme) 為例，首先先透過 git 指令將原始碼載下來：

```bash
git clone https://github.com/kitian616/jekyll-TeXt-theme $YOUR_GITHUB_NAME.github.com
```

接下來同第一種路線，在根目錄初始化環境，並啟動網站：

```bash
cd $YOUR_GITHUB_NAME.github.com
bundle install
bundle exec jekyll serve --livereload
```

此時在 localhost:4000 即可看到網站！

### Step 4. 寫文章

我們快速理解一下 Jekyll 網站專案的資料夾架構：

```
.
├── 404.html
├── about.markdown
├── _config.yml
├── Gemfile
├── Gemfile.lock
├── index.markdown
└── _posts
```

其中 `_config.yml` 是網站環境設定檔，關於網站名稱、環境變數、乃至於 Markdown 語法設定細節都可以在這裡調整，而基本上文章都會放在 `_posts` 目錄底下，並且原生支援 Markdown 基本語法。

我們嘗試新增一個文章檔案 `_posts/2021-01-01-happy-new-year.md`，內容為

```
---
layout: post
title: "Happy New Year"
date: 2021-01-01
categories:
  - jekyll
  - update
tags:
  - new-year
---

Happy new year! Hello 2021!
```

> `categories` 與 `tags` 屬性可以幫助你將文章進行分類，至於分類的呈現手法則要看不同主題的設計方式。

此時在網站上你就可以看到以下結果：

| ![](https://i.imgur.com/QIlselI.png) | ![](https://i.imgur.com/3rQI5D3.png) | 
| ------------------------------------ | ------------------------------------ |
<small style="color: gray">範例文章結果</small>


## GitHub Pages

GitHub Pages 基本上依賴於 git repository，因此你不只需要一個 GitHub 帳號，也會需要一點 git 的基本概念。

對於 Option 1 的使用者，你會需要初始化 git 專案環境；而對於 Option 2 的使用者，則需要更改或新增 remote 對象。

而 GitHub Pages 默認倉儲名稱為 `$YOUR_GITHUB_NAME.github.com` 為 GitHub Pages 的目標倉儲，因此在命名上必須遵守這個規則，否則 GitHub Pages 相關程序不會被觸發。

> 在原理上被觸發的程序為 GitHub Actions (CI/CD)，會經歷 Build 與 Deploy 這兩個步驟。

![](https://i.imgur.com/fhesqpQ.png)
<small style="color: gray">觸發 GitHub Actions 之視覺化效果，要看到勾勾才代表執行成功。</small>

一旦順利執行，此時前往以下網址 `https://$YOUR_GITHUB_NAME.github.io` 便可看到你在 GitHub Pages 的個人網站。

## 結語

每個人的寫作歷程不盡相同，因此獲得的感想可能因人而異。若讀者認同寫作的重要性，並且對 Markdown 與網頁有一定了解的話，推薦你使用 GitHub Pages 作為工程師部落客旅程的起點！


