xoa-hl
XOA-HL のソフトウェアのビルドです。Xen Orchestra にホームラボ向けの変更を 加え、アーカイブと軽量な RPM としてパッケージ化します。
リポジトリ: Vagrantin/xoa-hl · 言語:Bash / RPM の spec · ライセンス:AGPL-3.0
目次
- 目的
- リポジトリの構成
- バージョンの固定
- ビルドの流れ(scripts/build-xo.sh)
- 軽量な RPM(SPECS/xoa-hl.spec)
- ビルド環境
- CI のワークフロー(GitHub Actions)
- 他のコンポーネントとの関係
- 開発に参加する
目的
このリポジトリは Xen Orchestra HomeLab Edition(XOA-HL)をビルドします。 オープンソースの xen-orchestra のサーバーと XO 5 の Web 画面を、固定したアップストリームのコミットから取得し、 ホームラボ向けに手を入れて、XCP-ng 用にパッケージ化したものです。ビルドの たびに、2 つの成果物を GitHub のリリースとして公開します。
| 成果物 | 内容 |
|---|---|
xoa-hl-<version>.tar.gz | 不要物を削除し、ビルド済みにした xen-orchestra のモノレポ |
xoa-hl-<version>-1.*.noarch.rpm | インストール時にアーカイブを取得する、軽量なインストーラー RPM |
この RPM を build-xoa-hl が XOA の VM アプライアンス に入れます。
リポジトリの構成
xoa-hl/
├── container/
│ └── Containerfile ← AlmaLinux 9 のビルド用イメージ(Node 24、yarn、rpm 関連ツール)
├── scripts/
│ └── build-xo.sh ← ビルド本体:取得 + パッチ + yarn build + tar
├── patches/
│ └── menu-hide-items.patch ← Vates のサブスクリプションが必要なメニュー項目を隠す
├── SPECS/
│ └── xoa-hl.spec ← 軽量な noarch RPM(%post でアーカイブをダウンロード)
├── SOURCES/
│ └── xo-server.service ← /opt/xo から xo-server を起動する systemd ユニット
└── .github/workflows/
└── build-xoa.yml ← CI:アーカイブ + RPM + GitHub リリース
バージョンの固定
ビルドの対象は固定したアップストリームのコミットで、 scripts/build-xo.sh の先頭で指定します。
XO_REPO="https://github.com/vatesfr/xen-orchestra.git"
XO_COMMIT="e281c536d3b1e97ccfb3b0826f91b7dbb6c4478c" # 5.113.2、XO 5.x の最後のリリース
XO_VERSION="5.113.2"
リリースのバージョン文字列は、この 2 つを組み合わせたものです。 <XO_VERSION>_<短い SHA> の形で、たとえば 5.113.2_e281c536 になります。 これは out/VERSION に書き出され、CI がそれを読んでアーカイブ、RPM、 リリースタグ(v<version>)に名前を付けます。
アップストリームの更新は、XO_COMMIT と XO_VERSION を書き換えて 意図的に行います。自動では行いません。5.113.2 は、アップストリームが XO 6 に移る前の、XO 5.x の最後のリリースです。
ビルドの流れ(scripts/build-xo.sh)
ビルドは AlmaLinux 9 のコンテナの中で /build を対象に動きます。
- 固定した SHA で浅く取得する。
git init+git fetch --depth 1 origin $XO_COMMIT+checkout FETCH_HEADの順です。--depth 1で SHA を直接指定することで、約 1 GB の履歴全体を取得せずに 済み、再現性も保てます。 - パッチを適用する。
patches/*.patchをすべてgit apply --verboseで適用します。現在はmenu-hide-items.patchの 1 つだけで、Vates のサブスクリプションが ないと使えないメニュー項目を隠します。 packages/xo-server/xoahl.config.tomlを書き出す。 これは RPM が あとで利用者の設定として入れる実行時の設定です。443 番ポートでの HTTPS、/opt/xo/xoahl.crtと/opt/xo/xoahl.key、Redis はredis://127.0.0.1:6379/0を指定します。- 自己署名の TLS 証明書を生成する。
openssl req -x509(RSA 4096、10 年、CN はxoa.local)でxoahl.key(モード 600)とxoahl.crt(モード 644)を作り、アーカイブに含めます。 - 導入とビルド。
yarnのあと、すべての workspace(サーバーと XO 5 の Web 画面)でyarn buildを実行します。 - 不要物の削除。
.git、.github、.changesets、docs、packages/xo-server-test*、packages/xo-server-cloudを削除します。 - devDependencies の除去。
yarn workspaces focus --production(代替手段はyarn install --production)を使い、workspace の シンボリックリンクは保ちます。 - パッケージ化。 不要物を削除したモノレポ全体を
tar czf out/xoa-hl-<version>.tar.gzでまとめます(**/*.mapは除外)。
軽量な RPM(SPECS/xoa-hl.spec)
RPM は意図的に軽くしてあります。%files が配置するのは /usr/lib/systemd/system/xo-server.service だけです。それ以外は インストール時に %post で行います。
- リリースのアーカイブを
https://github.com/Vagrantin/xoa-hl/releases/download/v<version>/…からダウンロードし、/opt/xoに展開します。 - TLS の鍵と証明書を
/opt/xo/xoahl.keyと/opt/xo/xoahl.crt(設定が参照するパス)へ移動します。 - 初回インストール時にだけ利用者の設定を用意します。
/root/.config/xo-server/config.tomlが存在しない場合にかぎり、xoahl.config.tomlをそこにコピーします。アップグレード時には手を 触れず、運用側の変更をそのまま残します。 xo-cliをPATHから使えるようにします(/usr/local/bin/xo-cliへの シンボリックリンク)。systemctl enable redis --nowを実行し、xo-serverを有効にして 起動します。
%preun は xo-server を停止して無効にし、%postun は xo-cli の シンボリックリンクと /opt/xo を削除します。
xo-server は ~/.config/xo-server/config.toml を読みます(XDG の探索順)。 これはパッケージ側の config.toml より優先されます。%post での設定の 用意がないと、アーカイブの中身にかかわらず HTTPS の待ち受けと Redis の URI が反映されません。
実行時の依存:nodejs >= 24、redis、curl、および Xen Orchestra が リモートストレージに必要とするマウント関連のツール(nfs-utils、 cifs-utils、ntfs-3g、lvm2)です。
ビルド環境
container/Containerfile がビルド用のイメージを定義します。AlmaLinux 9 に gcc/make/git/patch、Python 3、Node.js 24(NodeSource)、yarn、 rpm-build/rpmdevtools を入れたものです。アーカイブと RPM はどちらも 同じイメージでビルドします。
ビルドは GitHub Actions でのみ行い、ローカルでビルドする手順は用意して いません。CI は push のたびに Docker でイメージをビルドし、その中で build-xo.sh を実行します。アーカイブと VERSION ファイルはランナー上の out/ にでき、リリースの成果物として公開されます。
CI のワークフロー(GitHub Actions)
.github/workflows/build-xoa.yml は push と workflow_dispatch で 実行されます。
- コンテナのイメージをビルドし、その中で
build-xo.shを実行します (patches/、scripts/、out/をマウントします)。 out/VERSIONを読んでバージョン文字列を決めます。- 同じイメージの中で、そのバージョン文字列から
_versionを定義してrpmbuild -bb SPECS/xoa-hl.specを実行します。 - アーカイブと noarch の RPM を含む、
v<version>というタグの GitHub リリースを公開します。
オーケストレーターの xoa-vm-agent が作る VM イメージのリリース (タグの接頭辞は xoa-image-、成果物は XOA-hl.xva)は、イメージを ビルドするリポジトリである build-xoa-hl で公開します。 #22 を参照してください。
移動より前に公開されたイメージのリリースは、ここに残してあります。すでに 配布済みの ISO がそれらを解決し続けられるようにするためです。したがって、 このリポジトリで RPM を探すツールは、今も xoa-image-* のタグを飛ばす必要が あります。現在の releases/latest はそのうちの 1 つを指しています。
アーカイブは、RPM をどこかにインストールする前にリリースへ公開して おく必要があります。RPM の %post は、そのリリースの URL から ダウンロードするからです。
他のコンポーネントとの関係
build-xoa-hl:この RPM を AlmaLinux 9 の アプライアンスに入れ、XVA イメージにまとめます。xolite-ce:XO Lite の展開ボタンがこのアプライアンスを 導入します。xoa-proxy:アプライアンスのイメージを配信するときに 使う HTTPS/gzip の橋渡し役です。xcp-orchestrator(buildorchestrationリポジトリ内):そのxoa-vm-agentがbuild-xoa.ymlを実行し、VM イメージのビルドを始める前に RPM の リリースを待ちます。
開発に参加する
問題の報告や変更の提案は、 Vagrantin/xcp-hl で issue を 作ってください。
現在ビルドを担当しているのは、buildorchestration リポジトリの サブディレクトリーであるオーケストレーター xcp-orchestrator です。その xoa-vm-agent が build-xoa.yml を実行し、できあがった リリースを利用します。