Skip to content

Commit

Permalink
アップデーターを改善
Browse files Browse the repository at this point in the history
5.1系のアップデートがうまくいかなかったため、マイグレーションはコマンドを利用する方針に変更
  • Loading branch information
ryuring committed Jun 22, 2024
1 parent df1ba8c commit 1b2714a
Show file tree
Hide file tree
Showing 8 changed files with 75 additions and 121 deletions.
51 changes: 34 additions & 17 deletions plugins/baser-core/src/Controller/Admin/PluginsController.php
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,7 @@ public function install(PluginsAdminServiceInterface $service, string $name)
}

/**
* アップデート実行
* プラグインアップデート実行
* @param PluginsAdminServiceInterface|PluginsAdminService $service
* @param string $name
* @return void|Response
Expand Down Expand Up @@ -144,24 +144,41 @@ public function update(PluginsAdminServiceInterface $service, $name = '')
}
} catch (\Throwable $e) {
$this->BcMessage->setError(__d('baser_core', 'アップデート処理に失敗しました。画面下部のアップデートログを確認してください。') . $e->getMessage());
if($plugin->name === 'BaserCore') {
$request = $this->getRequest();
try {
$service->rollbackCore(
$request->getData('currentVersion'),
$request->getData('php')
);
$this->BcMessage->setError(__d('baser_core', 'コアファイルを元に戻しました。'));
} catch (\Throwable $e) {
$this->BcMessage->setError($e->getMessage());
}
}
}
if($plugin->name === 'BaserCore') {
return $this->redirect(['action' => 'update']);
} else {
return $this->redirect(['action' => 'update', $name]);
return $this->redirect(['action' => 'update', $name]);
}

/**
* コアアップデート実行
* @param PluginsAdminServiceInterface|PluginsAdminService $service
* @param string $name
* @return void|Response
* @checked
* @noTodo
*/
public function update_core(PluginsAdminServiceInterface $service)
{
if (!$this->request->is(['put', 'post'])) return;
try {
$request = $this->getRequest();
$service->updateCore(
$request->getData('php')?? 'php',
$request->getData('connection') ?? 'default'
);
$this->BcMessage->setInfo(__d('baser_core', 'アップデート処理が完了しました。画面下部のアップデートログを確認してください。'));
} catch (\Throwable $e) {
$this->BcMessage->setError(__d('baser_core', 'アップデート処理に失敗しました。画面下部のアップデートログを確認してください。') . $e->getMessage());
try {
$service->rollbackCore(
$request->getData('currentVersion'),
$request->getData('php')
);
$this->BcMessage->setError(__d('baser_core', 'コアファイルを元に戻しました。'));
} catch (\Throwable $e) {
$this->BcMessage->setError($e->getMessage());
}
}
return $this->redirect(['action' => 'update']);
}

/**
Expand Down
24 changes: 0 additions & 24 deletions plugins/baser-core/src/Controller/Api/Admin/PluginsController.php
Original file line number Diff line number Diff line change
Expand Up @@ -378,28 +378,4 @@ public function get_available_core_version_info(PluginsServiceInterface $service
$this->viewBuilder()->setOption('serialize', ['availableCoreVersionInfo']);
}

/**
* コアファイルの最新版を反映する
*
* @param PluginsServiceInterface $service
* @checked
* @noTodo
* @unitTest
*/
public function update_core_files(PluginsServiceInterface $service)
{
$this->request->allowMethod(['post', 'put']);
try {
$service->updateCoreFiles();
$message = __d('baser_core', 'コアファイルの最新版への更新が完了しました。');
} catch (\Throwable $e) {
$message = __d('baser_core', 'コアファイルの最新版への更新中にエラーが発生しました。' . $e->getMessage());
$this->setResponse($this->response->withStatus(500));
}
$this->set([
'message' => $message
]);
$this->viewBuilder()->setOption('serialize', ['message']);
}

}
23 changes: 23 additions & 0 deletions plugins/baser-core/src/Service/PluginsService.php
Original file line number Diff line number Diff line change
Expand Up @@ -308,6 +308,29 @@ public function rollbackCore(string $currentVersion, string $php): void
}
}

/**
* BaserCoreをアップデートする
*
* @param string $currentVersion
* @param string $targetVersion
* @param string $connection
* @checked
* @noTodo
*/
public function updateCore($php, $connection = 'default')
{
$this->updateCoreFiles();

// マイグレーション、アップデートスクリプト実行、バージョン番号更新
// マイグレーションファイルがプログラムに反映されないと実行できないため、別プロセスとして実行する
$command = $php . ' ' . ROOT . DS . 'bin' . DS . 'cake.php update --connection ' . $connection;
$out = $code = null;
exec($command, $out, $code);
if ($code !== 0) {
throw new BcException(__d('baser_core', 'マイグレーション処理が失敗しました。'));
}
}

/**
* コアファイルを更新
* @return void
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -266,42 +266,4 @@ public function test_batch()
$this->assertEquals('一括処理が完了しました。', $result->message);
}

/**
* test update_core_files
*/
public function test_update_core_files()
{
// composer.json をバックアップ
copy(ROOT . DS . 'composer.json', ROOT . DS . 'composer.bak.json');
copy(ROOT . DS . 'composer.lock', ROOT . DS . 'composer.bak.lock');

// composer.json を配布用に更新
BcComposer::setupComposerForDistribution(ROOT . DS);

// vendor を一時フォルダにコピー
(new Folder(ROOT . DS . 'vendor'))->copy(TMP . 'update' . DS . 'vendor');

// composer.json を一時フォルダにコピー
copy(ROOT . DS . 'composer.json', TMP . 'update' . DS . 'composer.json');
copy(ROOT . DS . 'composer.lock', TMP . 'update' . DS . 'composer.lock');

// 最新版を反映
$this->post('/baser/api/admin/baser-core/plugins/update_core_files.json?token=' . $this->accessToken);
$this->assertResponseOk();
$result = json_decode((string)$this->_response->getBody());
$this->assertEquals('コアファイルの最新版への更新が完了しました。', $result->message);

// vendor を元に戻す
(new Folder())->delete(ROOT . DS . 'vendor');
$zip = new BcZip();
$zip->extract(TMP . 'update' . DS . 'vendor.zip', ROOT . DS . 'vendor');

// 一時ファイルを削除
(new Folder())->delete(TMP . 'update');

// composer.json を元に戻す
rename(ROOT . DS . 'composer.bak.json', ROOT . DS . 'composer.json');
rename(ROOT . DS . 'composer.bak.lock', ROOT . DS . 'composer.lock');
}

}
34 changes: 4 additions & 30 deletions plugins/bc-admin-third/src/js/admin/plugins/update.js
Original file line number Diff line number Diff line change
Expand Up @@ -55,36 +55,8 @@ const updateForm = {
*/
update() {
if (confirm(bcI18n.confirmMessage1)) {
if (updateForm.plugin !== 'BaserCore') {
$.bcUtil.showLoader();
return true;
}
$.bcToken.check(function () {
$.bcUtil.showLoader();
$.bcUtil.hideMessage();
axios.post($.bcUtil.apiAdminBaseUrl + 'baser-core/plugins/update_core_files.json', {}, {
headers: {
'X-CSRF-Token': $.bcToken.key
}
})
.then(response => {
let message = response.data.message + bcI18n.updateMessage1;
$.bcUtil.showNoticeMessage(message);
$(window).scrollTop(0);
$.bcUtil.showLoader();
// フォーム送信
$("#PluginUpdateForm").submit();
})
.catch(error => {
if (error.response.status === 500) {
$.bcUtil.showAlertMessage(error.response.data.message);
} else {
$.bcUtil.showAlertMessage('予期せぬエラーが発生しました。システム管理者に連絡してください。');
}
$.bcUtil.hideLoader();
$(window).scrollTop(0);
});
}, {hideLoader: false});
$.bcUtil.showLoader();
return true;
}
return false;
},
Expand All @@ -102,6 +74,8 @@ const updateForm = {
if ($inputPhp.val() !== ''){
if(updateForm.isUpdatable) {
$btnUpdate.removeAttr('disabled');
} else {
$btnUpdate.attr('disabled', 'disabled');
}
$btnDownload.removeAttr('disabled');
} else {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,22 +31,23 @@
</h2>

<?php if ($isUpdatable): ?>
<p><?php echo __d('baser_core', '「アップデート実行」をクリックしてプラグインのアップデートを完了させてください。') ?></p>
<p>
<?php echo sprintf(
__d('baser_core', 'baserCMSコアのアップデートがうまくいかない場合は、%sにご相談されるか、前のバージョンの baserCMS に戻す事をおすすめします。'),
$this->BcBaser->getLink('baserCMSの制作・開発パートナー', 'https://basercms.net/partners/', ['target' => '_blank'])
) ?>
</p>
<?php else: ?>
<?php if ($dbVersion !== $programVersion): ?>
<p><?php echo __d('baser_core', 'データベースのバージョンの整合性がありません。<br>アップデートの前にプログラムのバージョンに合わせて データベースの site_configs テーブルの version フィールドを更新してください。') ?></p>
<?php else: ?>
<p><?php echo __d('baser_core', '「アップデート実行」をクリックしてプラグインのアップデートを完了させてください。') ?></p>
<p>
<?php echo sprintf(
__d('baser_core', 'baserCMSコアのアップデートがうまくいかない場合は、%sにご相談されるか、前のバージョンの baserCMS に戻す事をおすすめします。'),
$this->BcBaser->getLink('baserCMSの制作・開発パートナー', 'https://basercms.net/partners/', ['target' => '_blank'])
) ?>
</p>
<p><?php echo __d('baser_core', '利用可能なアップデートはありません。') ?></p>
<?php endif ?>
<?php else: ?>
<p><?php echo __d('baser_core', '利用可能なアップデートはありません。') ?></p>
<?php endif ?>

<?php echo $this->BcAdminForm->create($plugin, [
'url' => ['action' => 'update_core'],
'id' => 'PluginUpdateForm'
]) ?>
<?php echo $this->BcAdminForm->control('update', ['type' => 'hidden', 'value' => true]) ?>
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading

0 comments on commit 1b2714a

Please sign in to comment.