如何部署 Hugo 至 gitlab page 並導向 Gandi 網域?
Table of Contents
前言
之前的個人網頁一直是存放在 Github 上面,透過 Github Action 部署 Hugo 靜態網頁,然後再將自己的網域導向 Github Page 的位置。這樣的流程為寫作帶來相當多的便利,好比說一旦流程串起後,我便不需要理會部署的問題,只要專心內容就好。
然而,這之中有一個小缺點:放置 Github Page 的 repo 必須是公開的,想要轉為私人 repo,也不是不行,就是錢的問題。另一方面,Gitlab Page 目前仍提供了 private repo 部署的 Gitlab Page 的選項,想說就趁這個機會,將原先的流程轉移到 Gitlab 上來。
在接下來的介紹中,我會分成以下三個階段介紹:
- 轉移 Github repo 至 Gitlab repo
- 設定 Gitlab CI/CD 部署文件
- 將網站導向個人 Gandi 網域
轉移 Github repo 至 Gitlab repo
- 在 Gitlab 頁面點選
New Project
創建新專案 - 點選
Import project
選項 - 選擇
Github import
- 連結個人的 Github account
- 選擇 Github 專案,並將其導入 Gitlab
- 確認 repo 底下為 Hugo 的檔案結構
- 完成
設定 Gitlab CI/CD 部署文件
在專案底下,我們需要建立一個 .gitlab-ci.yml
的文件,作爲 CI/CD 的設置。
- 在 repo 頁面,點擊
+
新增文件 (New file) - 將檔名設置為
.gitlab-ci.yml
- 新增配置內容
1# To contribute improvements to CI/CD templates, please follow the Development guide at:
2# https://docs.gitlab.com/ee/development/cicd/templates.html
3# This specific template is located at:
4# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Pages/Hugo.gitlab-ci.yml
5
6---
7# All available Hugo versions are listed here:
8# https://gitlab.com/pages/hugo/container_registry
9default:
10image: "${CI_TEMPLATE_REGISTRY_HOST}/pages/hugo:latest"
11
12variables:
13GIT_SUBMODULE_STRATEGY: recursive
14
15test:
16script:
17 - hugo
18rules:
19 - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH
20
21pages:
22script:
23 - hugo
24artifacts:
25 paths:
26 - public
27rules:
28 - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
29environment: production
- 這個 Gitlab 預設給 Hugo 的配置文件中分成三個部分,環境參數、測試 與 部署。
- 環境參數
- image: 作為本次部署的容器環境
- GIT_SUBMODULE_STRATEGY 設置為 recursive,能自動更新相依的 repo
- 測試 test
- 執行於任何非預設 branch 的程式碼
- 部署 deploy
- 執行預設 branch 的程式碼
- 環境參數
- 提交程式碼
- 在 Build > Pipelines 頁面底下,確認工作是否被成功 triggered
自動化發布排程違章(定時 deploy 網站)
以我自己的使用情境來說,我希望每天網站都能重新 deploy 一次。如此一來,排程在未來發佈的文章,就會在當天自動上線毋需自行管理。
要做到自動排程,我們可以前往 Build
> Pipeline schedules
1 頁面新增一個排程。
- 前往
Pipeline schedules
頁面 - 點擊新增排程
New schedule
按鈕 - 設定 Description 描述
- 選擇 Interval Pattern
- 我希望每天凌晨 12 時進行這個自動化的作業,因此在
Custom
的選項中設置為0 0 * * *
。
- 我希望每天凌晨 12 時進行這個自動化的作業,因此在
- 選擇 Cron2 timezone
- 設定為台灣時間 UTC+8
- 選擇要執行的 branch 或是 tag
- 勾選
Activated
checkbox - 點擊
Create pipeline schedule
- 完成
將網站導向個人 Gandi 網域
最後一步是將自己的 Gandi 網域名導向 Gitlab page。完成這步前,首先你需要先購買 Gandi 的網域方能實現。
假設你已經有一個 Gandi 的個人網域了,首先第一步要做的事情是設定 Gitlab 並獲取相關憑證。
設定 Gitlab page
- 前往 Settings 頁面,展開
Visibility, project features, permissions
- 1.1 將 Project visibility 設定為 Private
- 1.2 將 Pages 的權限從
Only Project Members
設定為Everyone
- 前往 Deploy > Pages 頁面
- 2.1 勾選
Use unique domain
並儲存設定 - 2.2 點擊
New Domain
加入 Gandi 的 domain - 2.3 確認頁面資訊
- 尚未進行認證前
Verified
提示應該為Not verified
- 尚未進行認證前
- 2.4 記住
DNS
及Verification status
中資訊,我們將在下一個步驟中使用
- 2.1 勾選
設定 Gandi DNS
- 進入 gandi.net 頁面中,
域名
>DNS 紀錄
頁面 - 點擊新增紀錄,建立一個
A
類型的文件 - 名稱中加入上一步設定的 domain name
- e.g. blog.gannipiece.tw
- 設定 IPv4 位置為 35.185.44.232,此 IP 為目前 (2023) 所有 Gitlab page 之 IP
- 回到上一層,再次點擊新增紀錄,建立一個
TXT
類型的文件 - 設定相同域名名稱
- e.g. blog.gannipiece.tw
- 設定
文字參數
為上一步中得到Verification status
中 TXT 後的文字內容 - 建立完成
- 等待約莫 30 分鐘後,即可完成認證與設定
小結
這篇文章中,紀錄了如何將 Github Page 轉移到 Gitlab Page 上,並且將 Gandi 的網域指向自動部署的 Gitlab 頁面上。除此之外,也紀錄了如何在 Gitlab 上透過 CI/CD 排程自動部署 Hugo 靜態網頁。
其中可能有幾點比較需要注意的是,在導向 Gandi 網域時,DNS 的設定並非如在 Github Page 上的做法。
在 Github Page 中,我們設定的是 CNAME 的類型,而在 Gitlab 頁面中,則是 A 類型的文件。並且,在該文件中,我們需要設定 IPv4 的位置,該位置為固定的 35.185.44.232。
另一方面試 TXT 的認證文件中,需要將 Verfication status
中 TXT 字段後的所有文字貼上,而非僅止 code 的部分。都是與過去設定 Github page 有稍微出入之處。
設定過程中需要注意。