Git(官網)目前應該算是現在最受歡迎的程式碼版本控管系統之一,而 GitHub(官網)也堪稱全球最大的開放原始碼軟體的倉庫了。
不過,雖然 GitHub 的網頁介面非常地方便,也受到大多數人的青睞,但是他並沒有提供整個系統讓使用者自行架設;而如果要自己架設類似的管理系統的話,目前看來最合適的,似乎就是 GitLab(官網)了。
GitLab 除了和 GitHub 一樣,有提供免費/付費的線上服務外,和 GitHub 不同的是,他有開放原始碼,並且也提供套件,讓使用者可以自己架設 GitLab 的服務。
而這一篇文章,就是 Heresy 自己試著架設 GitLab CE(社群版)的紀錄。
首先,這次的架設其實是因為之前的 Linux-ba
所以,某種意義上,這次的架設,是希望往「掛了可以確實救回」的方向來走。
而目前的設計架構,大致上是:
- 以 Windows Server 為本體的作業系統
- 透過 Hyper-V 來架設虛擬機器、跑 Ubuntu
- 系統本身一個 VHD、GitLab 的資料放在另一個 VHD
- 在 Ubuntu 裡面使用 Docker 來跑 Gitlab
會這樣感覺拖了褲子放屁的玩法,主要是:
- Heresy 對 Linux 不熟,如果硬體或 OS 掛了,要處理 Linux 的實體機器會很麻煩…所以底層還是用 Windows 來玩。
- 會使用 Windows Server 主要是想使用 Windows Server Back 的 Hyper-V online 備份功能。
- 不直接在 Windows 上跑 Gitlab Docker 的原因,是因為目前這樣運作會有檔案權限的問題,感覺很難解決。(這個試了好幾次了,搞不定…)
- 使用 Ubuntu 的原因一個是普及,再來就是 Windows 的 Hyper-V 現在的「快速建立」直接可以弄好,很方便。
總之,現在就是暫時決定使用這樣的架構了。理論上,只要最後放 Gitlab Data 的 VHD 還在,應該就都可以相對簡單、不用考慮硬體因素地把服務重建起來了。
至於建置過程,在基礎設施的部分,就是:
- 安裝 Windows Server
- 安裝 Hyper-V 和 Windows Server Backup 的功能
- 建立一個 Hyper-V 的 Ubuntu 虛擬機器
- 另外再建立一個 VHD 磁碟機給 Ubuntu VM 用(gitlab.vhdx)
這部分算是比較簡單,而且不一定要這樣玩的部分了。而以 Heresy 來說,Ubuntu 的 VM 其實是用其他 Windows 10 的電腦建立好,再轉移過來的。
接下來,主要還是針對 Ubuntu 裡的設定才是重點了。
這邊由於是想使用 Docker 來簡化安裝,所以需要先安裝 Docker(這邊都要 root 權限):
- 使用「apt install docker.io」這個指令來安裝最新版的 Docker
- 執行「systemctl enable docker」這個指令,讓 Docker 可以在重開機後自動執行(參考)
這樣的設定,其實還有一個問題是只有 root 可以執行 docker,但是由於對 Heresy 沒影響,所以就不管了。
至於要讓 Docker 跑 Gitlab 的話,則可以直接參考官方的文件(連結);基本上就是下面的指令:
docker run -d --restart always --name gitlab -h gitlab.example.com -p 443:443 -p 80:80 -p 22:22 -v /mnt/gitlab_data/config:/etc/gitlab -v /mnt/gitlab_data/logs:/var/log/gitlab -v /mnt/gitlab_data/data:/var/opt/gitlab gitlab/gitlab-ce:latest
上面的指令裡面,「–name」的「gitlab」是指在 docker 系統裡的名字,如果沒有其他需求的話,可以不用改。
「–host」的「gitlab.example.com」是 Gitlab 服務的主機名稱,建議視自己的狀況修改。
而最重要的,是三個「-v」的資料夾對應了~這個指令是把外部(這邊是 Ubuntu VM)的資料夾,直接對應到 docker 內,讓 docker 把資料直接存在外部。
在執行這個指令前,Heresy 這邊是先把第二個 VHD 磁碟(gitlab.vhdx),mount 成「/mnt/gitlab_data」這個路徑(記得要設定開機自動 mount,否則重開機就沒了),然後再進去手動建立「config」、「logs」、「data」這三個資料夾。
之後如果執行上面的指令順利的話,Docker 版的 Gitlab 就會開始初始化,之後就可以開始使用了!(這邊大概要快三分鐘)
而由於 Docker 的容器基本上都是沿用官方的 image、沒做修改,所以其實也不太需要備份,只要備份 gitlab.vhdx 裡的資料就可以了~
如果之後電腦、或是 VM 掛了,只要 gitlab.vhd 的資料還在,就只需要重新跑上面的流程,把 gitlab.vhdx 掛進去,讓 gitlab 去使用舊的資料就可以復活了!
至於這邊 gitlab.vhd 裡的資料該怎麼備份呢?
一個方法,就是繼續在 Ubuntu 裡面,用類似 rsync 的工具來做備份。
而從 VM 外部來備份的部分,由於 Hyper-V 現在大多是採用 VHDX + AVHDX 這種差異磁碟的方法,再加上 VM 基本上又是隨時在跑的,所以似乎也不是很適合直接備份 VHDX 的檔案。
所以在備份上,Heresy 這邊是決定使用 Windows Server 來架設,然後直接使用 Windows Server Backup 來做 VM 的線上備份(官方文件)。
為了保險起見,Heresy 又設定讓他把 Hyper-V 的 VM 備份到兩個地方,一個是另一顆實體硬碟,另一個備份目標,則是再掛另一個獨立的 VHD 檔來當作虛擬磁碟。
這樣的話,如果當這整台 Windows Server 掛掉的時候,至少也還可以從這顆獨立的備份硬碟,或是備份用的 VHD 檔案裡面,撈出整個 VM 的資料來進行還原了。
不過可能要注意的是,要使用 VHD 檔作為虛擬硬碟來備份的話,由於 Windows 沒有設計自動掛載 VHD 的機制,所以需要自己寫一個 diskpart 指令的腳本,讓他在開機時自動執行才行。
這部分可以參考《Auto-Mount a VHD/VHDX File at Startup in Windows 10, 8.1》這類的文章。
這邊基本上就是要建立一個 diskpart 的指令的純文字檔(automount.txt),內容類似下面這樣:
select vdisk file="C:bcakup_disk.vhdx"
attach vdisk
exit
這邊由於備份用的硬碟不需要磁碟機代號,所以指令可以簡化一點。
然後再透過 Windows 內建的工作排程器,讓系統在開機的時候,自動去執行下面這行指令:
diskpart /s "c:automount.txt"
這樣應該就可以了。
Heresy 這邊大概就先這樣跑了,之後再看看要不要花時間來玩看看 Gitlab 的 CI/CD 吧~