概要
大学生の時に私用のMini PCを購入しましたが、その後Macを購入したこともあり、使う機会が激減しました。
最近、そのままではもったいないと思い、勉強用にサーバ化することにしました。
今回はその手順とGitHub Actionsを利用したCI/CDを導入したことについてまとめようと思います.
環境
Mini PC:Minisforum UM680 Slim/UM870 Slim
検証用PC:MacBook Pro M1
USBメモリ:なんでもOK.最低でも10GBくらいあればOK.
ISOファイル:Ubuntu Server 24.04 LTS
マウス・キーボード:なんでもOK.Mini PCに直接ログインして操作するときに必要
Mini PCは当時何も知らずに買いましたが,そこそこスペックがいいやつだそうです(5万円くらいで販売中).
用途にもよりますが,個人開発の範囲内ならもっと安くてもいいと思います.
MiniPCをサーバ化した後は有線LANでインターネットと繋いでいます.
MiniPCをサーバ化
OSのインストール
こちらの記事を参考にしました
OSのインストールまで行います.
ipアドレスを固定化する
固定しておくと後でsshをするときに楽です.
先ほどの資料のIPの設定と基本は同じですが,configファイルの内容は以下にしました
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
簡単に上のコードを説明
- ethernets:L2レイヤーのネットワーク.LANのこと.
- eno1:このMini PCのNIC.このMini PCのネットワークの玄関口.
- dhcp4: false:動的にipを割り当てる機能であるdhcpを無効にしている
- eno1:このMini PCのNIC.このMini PCのネットワークの玄関口.
- bridges:NICをまとめて,それらを繋げる設定.
- br0:ブリッジの名前
- interfaces:ブリッジでまとめたいNICを指定
- addresses:ここで固定化したいipアドレスを指定.
- routes:ここにはルータのipアドレスを設定
- nameservers:DNSについての設定
- br0:ブリッジの名前
Macの人は左上のアップルマーク>システム設定>Wi-Fiをクリックすると自分のPCとルータのipを調べられます.

最後にネットワークの設定の反映を忘れずに.
sudo netplan apply
SSHの設定
先ほどの資料の手順通りに進めてもいいですが,
SSHだとパスワード認証ではなく,秘密鍵・公開鍵認証方式を使うこともあります.
一般的には公開鍵方式が安全で,業務でもこちらが使われることが多いです.
認証方法を設定したあとは以下のコマンドでPCからアクセスできます.
ssh shunsuke@192.168.11.2
192.168.11.2は先ほど固定化したipアドレスです.
以後はMini PCに直接ログインして作業する必要はなく,SSHで同じLAN内の自分のPCからアクセスできます.
VMを構築
ここからはサーバの中にVMを構築します.
CI/CDを導入するのが目的なので,CI用とCD用で二つ構築しますが,以下ではCI用のVMを構築します.
以下の記事を参考にしました.
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の構築
Cloud Initを使うと初期設定を事前に設定した上でVMを構築することができます.
ISOイメージのダウンロード
イメージをダウンロードしたいフォルダに移動してからダウンロードを実施します.
mkdir -p ~/vm-images
cd ~/vm-images
wget https://cloud-images.ubuntu.com/noble/current/noble-server-cloudimg-amd64.img
後でMini PCからVMにSSHするための鍵も作成しておきます
ssh-keygen -t ed25519 -C "ci-cd@minipc"
-C以降は適当で大丈夫です.
Cloud Initに使用する設定ファイルの作成
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
- user-data
#cloud-config
hostname: ci-server
password: (任意のパスワード設定)
chpasswd: {expire: False}
ssh_pwauth: True
ssh_authorized_keys:
- (公開鍵(.pub)をコピペ)
これでサーバにログインしたときには
ユーザ名:ubuntu
パスワード:設定したパスワード
でログインすることができます.
また,SSHもipを固定した後すぐに使えるようになります.
user-dataについて余談(飛ばしてOK)
ユーザ名,パスワードを任意に設定する方法もあります.
#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を使用するときのパスワードを無効にします.
今回は個人開発でインターネットに公開してないのでこの設定にしていますが,公開する場合はパスワードを設定することを推奨します.
- meta-data
sudo vi meta-data
ホスト名とidを設定します.
instance-id: ci-server-001
local-hostname: ci-server
ISOイメージを作成
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
ダウンロードしたゲストイメージを元に,差分ディスク(要はコピーだけど,実態は大元との差分のみを保存している)を作成
ディスクサイズupしておく.vmにdockerなどさまざまなパッケージを入れるため.
qemu-img resize ~/vm-images/ci-server.qcow2 20G
VMを立ち上げる
virt-install --name ci-server --ram 2018 --vcpus 2 --disk path=~/vm-images/ci-server.qcow2,size=20 --disk path=~/vm-images/ci-seed.iso,device=cdrom --import --graphics none --os-variant ubuntu24.04 --network bridge=br0
今まで作成したISOイメージ,差分ディスクを指定してVMを立ち上げる.
- ログイン
先ほどuser-dataで設定したユーザ名,パスワードを入力. - ネットワークの設定
/etc/netplan/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
先ほどMini PCの設定と比べると,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などの検証をしていく.
VMから抜けるためには以下のコマンドを実行
exit
- コマンドの検証
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に使用する設定ファイルの作成」以下をもう一度名前を変えてする.
CIの導入
ここまでで2台のVMサーバを構築しました.
このあとはCIを導入します.
使用するサービス
GitHub Actons:Github上で使用できるワークフロー(定義済みの処理と条件の組み合わせ)を自動化するサービス.
self-hosted runner:自分でサーバを用意して,ワークフローに使用できるサービス.
Github Actionsの導入
先ほど作成したCI用のサーバをGitHub Actionsに導入していきます.
こちらの資料を参考に進めていきます.
GitHub上に空のリポジトリを作成する.
private,publicどちらでもOK
CI用サーバをRunnerとして登録
先ほどのの「セルフホステッドランナーの構築」を参考にRunnerとしてCI用サーバを登録する.
これ通りに進めれば問題なくできるはず.
まとめ
今回はPCをサーバ化してGitHub ActionsのRunnerに登録するところまで進めました.
次回は実際にWebアプリケーションをCI/CDで実装したいと思います.
