xolite-ce
XO Lite 向けのコミュニティパッチと、RPM のビルドのパイプラインです。
リポジトリ: Vagrantin/xolite-ce · 言語:TypeScript / Vue 3(パッチ)· RPM の spec · ライセンス:AGPL-3.0
XO Lite とは
XO Lite は、すべての XCP-ng ホストに同梱される軽量な単一ページの管理 アプリケーションです。ホストから直接配信され、ブラウザーの中だけで動きます。 実装は Vue 3 / TypeScript / Vite の SPA です。
標準の XCP-ng ホストでは、XO Lite に 「Deploy XOA」 の画面
(DeployXoaView.vue)があり、公式の Xen Orchestra のイメージを
ダウンロードして取り込みます。XCP-hl はこの動作を置き換え、展開したい
XOA イメージを選べるようにします。
パッチの内容
パッチ適用には Rust 製のツール xoa-deploy-patcher を使い、ビルド時に
xoa-deploy.vue へパターンベースの変更を適用します。あわせて
patches/en-hl.json(HL ロケールの文字列)と
patches/xolite-loader.html(lite.xen-orchestra.com からのリモート読み込み
フォールバックを取り除いた置き換え用ローダー)も適用します。
変更後の 「Deploy XOA」 画面には、4 つのソースを選べる 「XOA Image URL」 のセレクターが追加されます。
- XOA-hl (既定):XCP-hl 向けにソースからビルドした Xen Orchestra
- Vates のイメージ:公式のアプライアンス
- Ronivay 氏のイメージ:ソースからビルドされたコミュニティ版の XO
- 任意の URL:HTTP でも HTTPS でも、そのままでも gzip 圧縮でも、任意の XVA
「Verify if ssl certificate is valid」 のトグルにより、xoa-proxy は
アップストリームのイメージサーバーの自己署名証明書を受け入れられます。
ビルドのパイプライン
全体の流れ
1. アップストリームの XCP-ng の ISO にある RPM から XO_VERSION を読み取る
2. 対応するリリースタグで vatesfr/xen-orchestra をクローンする
3. patches/community-xoa-deploy.patch を適用する
4. Yarn(Corepack)で依存を導入する
5. XO Lite をビルドする:yarn build:xo-lite
6. RPM 用のソースのアーカイブを作る
7. rpmbuild -ba SPECS/xo-lite-community.spec
8. RPM 署名用サブキーで rpmsign(GPG_PRIVATE_KEY + GPG_PASSPHRASE)
9. RPM と xcp-ng-ce-public.asc を GitHub リリースの成果物として公開するバージョンの判定
対象となる XO Lite のバージョンは、コードに直接書くのではなく、 アップストリームの XCP-ng の ISO にすでにある RPM から読み取ります。
XO_VERSION=$(rpm -qp --qf '%{VERSION}' xo-lite-*.rpm)こうすることで、コミュニティ版の RPM は常にアップストリームのバージョンと 一致し、そのまま置き換えられるようになります。
アーカイブの構成
rpmbuild に渡すソースのアーカイブは、次のような構成です。
xo-lite-{VERSION}/
├── dist/ ← Vite でビルドした成果物
├── CHANGELOG.md
├── LICENSE
└── xolite.html ← scripts/xolite-loader.html から名前を変更xolite.html というファイル名は必須です。これは XCP-ng ホストが配信し、
ブラウザーで XO Lite を読み込むための入口だからです。
RPM の spec
SPECS/xo-lite-community.spec では次のように定義しています。
Name: xo-lite-communityVersion: %{XO_VERSION}(ビルド時に埋め込み)Provides: xo-lite(アップストリームのパッケージへの依存を満たすため)Conflicts: xo-lite(アップストリームの RPM との同時インストールを防ぐ)- ファイルの一覧:
dist/の中身とxolite.html
ローカルでの開発
事前に必要なもの
- Node.js 20 以上と Yarn(
corepack enableで有効にします) rpmbuild(RHEL/CentOS/Fedora ではrpm-buildパッケージ)rpmsign(rpm-signパッケージ)- コミュニティの GPG 公開鍵を自分のキーリングにインポートしておくこと
手順
# 1. リポジトリをクローンする
git clone https://github.com/Vagrantin/xolite-ce.git
cd xolite-ce
# 2. 対象のタグでアップストリームの xen-orchestra をクローンする
XO_VERSION=<バージョン>
git clone --depth 1 --branch v${XO_VERSION} \
https://github.com/vatesfr/xen-orchestra.git upstream
# 3. コミュニティのパッチを適用する
cd upstream
git am ../patches/community-xoa-deploy.patch
cd ..
# 4. 依存を導入する
cd upstream
corepack enable
yarn install
cd ..
# 5. XO Lite をビルドする
cd upstream
yarn build:xo-lite
cd ..
# 6. 画面を確認する
scp -r lite/dist/ xcp-ng-host:/opt/xensource/www/新しいアップストリームのバージョン向けにパッチを更新する
# 新しくクローンしたアップストリームで手作業により変更し、
# 新しいパッチを生成します:
git diff HEAD > ../patches/community-xoa-deploy.patch
# あるいは、きれいなコミットとして format-patch を使います:
git format-patch HEAD~1 -o ../patches/GPG 署名
xo-lite-community の RPM は、XCP-hl の鍵ペアの
RPM 署名用サブキーで署名しています。同じサブキーは xoa-proxy の RPM の
署名にも使っており、コミュニティのすべての RPM で 1 つのサブキーを共有して
います。
プロジェクトの共通の公開鍵は
本番サイトのルートで配布しています。インポート前にマスター鍵のフィンガープリントを
確認してください。以下のコマンドには署名サブキーに対応した RPM が必要です。
XCP-ng 8.3 の Dom0 は古い RPM 4.11 を使用するため、ホストでは
repo_gpgcheck=1 で署名付きリポジトリメタデータを検証します。
アップデートに記載のリポジトリ設定を維持してください。
ローカルで RPM を検証するには次のようにします。
curl -fLO https://vagrantin.github.io/xcp-hl/xcp-ng-ce-public.asc
gpg --show-keys --with-fingerprint xcp-ng-ce-public.asc
# 2F59 1DB9 D2C1 28C4 C3D9 63F4 6DA0 0DCA 5BBA 215A
rpm --import xcp-ng-ce-public.asc
rpm --checksig xo-lite-ce-*.rpmCI のワークフロー(GitHub Actions)
ワークフローは main への push で実行されます。
主なステップは次のとおりです。
- name: Detect XO version
run: echo "XO_VERSION=$(rpm -qp --qf '%{VERSION}' ...)" >> $GITHUB_ENV
- name: Clone upstream at tag
run: git clone --depth 1 --branch v${{ env.XO_VERSION }} ...
- name: Apply patch
run: git am patches/community-xoa-deploy.patch
- name: Build XO Lite
run: |
corepack enable
yarn install
yarn build:xo-lite
- name: Build RPM
run: rpmbuild -ba SPECS/xo-lite-community.spec
- name: Sign RPM
run: |
echo "${{ secrets.GPG_PRIVATE_KEY }}" | gpg --import
echo "${{ secrets.GPG_PASSPHRASE }}" | gpg --passphrase-fd 0 --batch \
--pinentry-mode loopback --yes --armor
rpm --addsign RPMS/x86_64/xo-lite-community-*.rpm
- name: Publish release
uses: softprops/action-gh-release@v1
with:
files: |
RPMS/x86_64/xo-lite-community-*.rpm
xcp-ng-ce-public.asc開発に参加する
問題の報告や変更の提案は、Vagrantin/xcp-hlで issue を作ってください。