baserCMSは、ベースシステムとしてテーマやプラグインにてカスタマイズをする事を前提としたパッケージのため、オートアップデート機能の仕様として、全自動で知らぬうちに更新してしまう事は望ましくない。
そのため、baserCMSのオートアップデートの仕様としては、アップデート情報の取得ができ、利用者がアップデート実行ボタンをクリックすることで、プログラムデータの取得や、データベースのマイグレーションを自動実行できるというものにする。
Composer の packagist より RSS で取得
https://packagist.org/feeds/package.baserproject/baser-core.rss
サイト基本設定にて、「管理システムのアップデート通知を有効にする」にチェックが入っている事
管理画面を開く際に、BcAdminAppController::beforeRender
のタイミングで取得し、1日間キャッシュする。
自身のパッケージのバージョンよりも新しいバージョンが存在する場合には、メニューに更新ボタンを表示する。なお、新しいバージョンの数をバッジとして表示する。
アップデート実行の際は、Composer を利用するため、PHPのパス情報を必要とする。
プログラム側で自動取得できる場合は初期値としてセットする。
CakePHPのシェルを利用して 別プロセスとして、Composer を実行するプログラムを作成する。
PluginsController::update
→ PluginsService::updateCore
→ ComposerCommand::execute
→ BcComposer::require
Composer で更新するためには、baserCMSのプログラムを /plugins
ではなく、/vendor
に配置する必要がある。
ただし、/vendor
では開発できないため、/plguins
で開発し、配布の際には、 リリースパッケージ作成コマンド を作成し、/plugins
配下を削除して配布する。
また、monorepo-builder の関係で、composer.json
内に、replace
の定義があるが、上記構成を前提とした場合にこれがあると、Composer が正常に動作しないため、
こちらもリリースパッケージ作成コマンドで、削除する。
CakePHPのシェルを利用して 別プロセスとして、Migration を実行するプログラムを作成する。
PluginsController::update
→ PluginsService::updateCore
→ UpdateCommand::execute
→ PluginsService::update
→ BcPlugin::migrate
バージョンに応じて設置したアップデートスクリプトを実行する。
PluginsController::update
→ PluginsService::updateCore
→ UpdateCommand::execute
→ PluginsService::update
→ BcPlugin::execUpdater
アップデートスクリプトは、次の場所に配置するものとする。
# version-number は、1.0.1 のようにアップデート対象のバージョンとする
/plugins/{plugin-name}/config/update/{version-number}/updater.php
なお、アップデートスクリプトは、Migration のシェルで実行し、アップデートスクリプトが失敗した場合には、Migration をロールバックする。また、Composer の処理もロールバックさせ、元のバージョンに戻す。
スクリプトで実行した処理をロールバックする処理を実装していない事。実装方法の検討が必要。
BcUpdateFilterMiddleware にてプログラムの変化を確認
→ 削除する
/update に移動する事でアップデート画面へ
→ ルーティングを削除する
データベースのマイグレーションとアップロードプログラムのみ実行
PluginsController::updat
e → PluginsService::update
→ Plugin::update
→ Plugin::update を分割する
当面は plugins に手動でインストール
baserマーケットと連携し、直接プログラムのインストールとアップデートができるようにする事を検討する。
baserマーケットでAPIを公開