大學時期我購買了一台私用的迷你電腦,但因為後來也買了Mac,使用的機會大減。
最近,我覺得這樣放著實在可惜,決定將其伺服器化以用於學習。
這次我想整理一下其過程及利用GitHub Actions導入CI/CD的相關內容。
迷你電腦:Minisforum UM680 Slim/UM870 Slim
檢證用電腦:MacBook Pro M1
USB隨身碟:隨便都可以,至少10GB以上即可。
ISO檔案:Ubuntu Server 24.04 LTS
滑鼠與鍵盤:隨便都可以,直接登錄迷你電腦操作時需要。
當時對迷你電腦一無所知就購買,但似乎規格還不錯(目前約售5萬日元)。
依用途而定,對於個人開發來說,可能可以更便宜的選擇。
迷你電腦伺服器化後,透過有線網路連接到互聯網。
參考了這篇文章
將進行作業系統的安裝。
固定IP會使得之後使用ssh連接時更方便。
上面資料中IP的設定大致相同,但我將config文件的內容修改為以下:
/etc/netplan/99_config.yaml
network:
version: 2
ethernets:
eno1:
dhcp4: false
bridges:
br0:
interfaces:
- eno1
dhcp4: false
addresses:
- 192.168.11.2/24
routes:
- to: default
via: 192.168.11.1
nameservers:
addresses:
- 192.168.11.1
- 8.8.8.8
- 1.1.1.1
簡單說明上面的代碼:
Mac用戶可從左上角的蘋果標誌 > 系統設定 > Wi-Fi點擊以查詢自己的PC與路由器的IP。
最後別忘了應用網路設定。
sudo netplan apply
可以參考之前的資料繼續下去,但
如果使用SSH,可以選擇不使用密碼認證,而是使用秘鑰與公鑰的認證方式。
一般而言,公開密鑰方式較安全,亦較常用於業務上。
設定完認證方法後,可以用以下命令從PC訪問。
ssh [email protected]
192.168.11.2是先前固定的IP地址。
之後無需直接登錄迷你電腦進行操作,可以從同一LAN內的PC使用SSH訪問。
接下來在伺服器內構建VM。
由於目的是導入CI/CD,因此會構建兩個容器,以下將構建CI用的VM。
參考了以下的文章。
使用了可以在Ubuntu上使用的KVM。
詳情請參考之前的資料。
sudo apt update
sudo apt install -y qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virt-manager
sudo systemctl status libvirtd
若顯示“active (running)”則表示OK。
virsh list --all
若出現空白列表則表示沒有問題。
使用Cloud Init,可以在構建VM之前先設定初始配置。
移動到想要下載映像的資料夾後進行下載。
mkdir -p ~/vm-images
cd ~/vm-images
wget https://cloud-images.ubuntu.com/noble/current/noble-server-cloudimg-amd64.img
稍後還會生成一個SSH密鑰以便從迷你電腦訪問VM。
ssh-keygen -t ed25519 -C "ci-cd@minipc"
-C後面的部分可以隨意設置。
可以將Cloud Init的初始設置整理成文件。
最終的目錄結構如下所示:
├── vm-images
│ ├── ci-seed.iso
│ ├── ci-server.qcow2
│ └── noble-server-cloudimg-amd64.img
└── vm-seed
└── ci
├── meta-data
└── user-data
mkdir -p ~/vm-seed/ci
cd ~/vm-seed/ci
sudo vi user-data
#cloud-config
hostname: ci-server
password: (設定的任意密碼)
chpasswd: {expire: False}
ssh_pwauth: True
ssh_authorized_keys:
這樣進入伺服器時可使用
用戶名:ubuntu
密碼:已設置的密碼
進行登錄。
此外,SSH也會在IP地址固定後立即可以使用。
也有可以任意設置用戶名和密碼的方法。
#cloud-config
hostname: ci-server
users:
- name: hogehoge
gecos: Ubuntu
sudo: ALL=(ALL) NOPASSWD:ALL
groups: sudo
shell: /bin/bash
lock_passwd: false
passwd: (任意的密碼)
ssh_authorized_keys:
- (複製公開鍵到此處)
chpasswd:
list: |
hogehoge:設定的密碼
expire: false
ssh_pwauth: true
sudo: ALL=(ALL) NOPASSWD:ALL會禁用使用sudo時的密碼。
這次由於是個人開發,並未公開在互聯網上,因此採用此設定,但若要公開,建議設置密碼。
sudo vi meta-data
設定主機名稱與ID。
instance-id: ci-server-001
local-hostname: ci-server
cd ~
mkdir vm-images
cd vm-images
genisoimage -output ci-seed.iso -volid cidata -joliet -rock ~/vm-seed/ci/user-data ~/vm-seed/ci/meta-data
使用genisoimage創建ISO映像,完成後會生成ci-seed.iso。
qemu-img create -f qcow2 -b ~/vm-images/noble-server-cloudimg-amd64.img -F qcow2 ~/vm-images/ci-server.qcow2
基於下載的客戶端映像創建差分磁碟(實際上是複製,但僅保存與原件的差異)。
將磁碟大小設置為增大,以便于在虛擬機中安裝docker等各種包。
qemu-img resize ~/vm-images/ci-server.qcow2 20G
virt-install --name cd-server --ram 2018 --vcpus 2 --disk path=~/vm-images/cd-server.qcow2,size=20 --disk path=~/vm-images/cd-seed.iso,device=cdrom --import --graphics none --os-variant ubuntu24.04 --network bridge=br0
指定之前創建的ISO映像和差分磁碟以啟動虛擬機。
登錄
輸入之前user-data中設置的用戶名和密碼。
網路設定
/etc/netplan/50-cloud-init.yaml會自動生成。
請修改此文件:
50-cloud-init.yaml
network:
version: 2
ethernets:
enp1s0:
dhcp4: no
addresses:
- 192.168.11.50/24
routes:
- to: default
via: 192.168.11.1
nameservers:
addresses:
- 192.168.11.1
- 8.8.8.8
- 1.1.1.1
與先前迷你電腦的設定相比,沒有bridges的設定。
IP會被固定化。
應用網路設定
sudo netplan apply
防止cloud-init覆蓋網路設定
sudo tee /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg <<EOF
network: {config: disabled}
EOF
※如果不執行此設定,重啟時可能會重置配置。
確保主機再啟動時自動啟動
virsh autostart cd-server
這樣一來,設定全部完成,接下來就可以進行ssh等的驗證。
要退出虛擬機,執行以下命令
exit
當出現此畫面時,輸入control+]
驗證命令
virsh list -all -> 確認正在運行的VM
virsh console <伺服器名稱> -> 登入伺服器
virsh shutdown cd-server -> 關閉伺服器
virsh start cd-server -> 啟動伺服器
virsh undefine cd-server -> 刪除伺服器
執行除了最後刪除伺服器外的其他命令。
SSH驗證
使用先前固定的IP進行ssh連接。
ssh 用戶名@192.168.11.50
確定能否成功登錄伺服器後,CI用伺服器的設定就完成了。
CD用的構建請參見「創建Cloud Init所需的配置文件」以下部分,再重新命名進行。
截至目前,已經構建了兩台VM伺服器。
接下來將導入CI。
GitHub Actions:可在GitHub上自動化的工作流程(預定義處理與條件的組合)服務。
self-hosted runner:自行準備伺服器並可在工作流程中使用的服務。
接下來將先前構建的CI用伺服器導入至GitHub Actions。
將參考以下資料來進行。
私有或公共均可。
參考之前的資料中的「自托管Runner的構建」將CI用伺服器登記為Runner。
按照該資料進行應該就沒有問題。
這次我將PC伺服器化並註冊為GitHub Actions的Runner。
下次將實際實現Web應用程式的CI/CD。