Commit e034e146 authored by Laurent Lécluse's avatar Laurent Lécluse
Browse files

Séparation des processus pour la MAJ de la BDD, afin de bénéficier des...

Séparation des processus pour la MAJ de la BDD, afin de bénéficier des dernières versions de tous les fichiers pour l'exécution de la MAJ BDD
parent e543759e
......@@ -13,6 +13,8 @@ $actions = [
"test-bdd" => "Test d'accès à la base de données",
];
$c->printMainTitle("OSE", 15);
$c->println('Actions possibles :');
foreach ($actions as $a => $l) {
$c->print($a, $c::COLOR_BLACK, $c::BG_LIGHT_GRAY);
......
......@@ -2,7 +2,7 @@
// Script provisoire : il aura disparu à la prochaine version!!!
$c->println('Mise à jour automatique de la base de données', $c::COLOR_LIGHT_CYAN);
$oa->run('update-bdd');
$oa->getBdd()->exec('ALTER TABLE "DOSSIER" MODIFY ("EMAIL" NULL)');
$oa->getBdd()->exec('ALTER TABLE "UTILISATEUR" ADD ("PASSWORD_RESET_TOKEN" VARCHAR2(256 CHAR) DEFAULT null)');
\ No newline at end of file
$oa->migration('pre');
$oa->run('update-bdd');
$oa->migration('post');
\ No newline at end of file
<?php
var_dump( $oa->bddIsOk() );
\ No newline at end of file
$oldVersion = '8.1.2';
$newVersion = '8.1.3';
$oa->oldVersion = $oldVersion;
$oa->version = $newVersion;
$oa->migration('post');
......@@ -3,6 +3,9 @@
$bdd = $oa->getBdd();
$schema = new \BddAdmin\Schema($bdd);
$c->println("\nMise à jour de la base de données", $c::COLOR_LIGHT_CYAN);
$oa->migration('pre');
$c->println("\n".'Mise à jour des définitions de la base de données', $c::COLOR_LIGHT_PURPLE);
/* Récupération du schéma de référence */
......@@ -22,10 +25,10 @@ $ddlConfig = [
\BddAdmin\Ddl\DdlTrigger::class => $ddlConfig[\BddAdmin\Ddl\DdlTrigger::class],
]; // Pour le moment, travail uniquement sur ces 3 structures de données. Pour les autres, cela viendra plus tard.
//$ddlConfig[\BddAdmin\Ddl\DdlView::class]['includes'] = [
// 'V_FORMULE_LOCAL_I_PARAMS',
// 'V_FORMULE_LOCAL_VH_PARAMS',
//];
$ddlConfig[\BddAdmin\Ddl\DdlView::class]['includes'] = [ // afin d'être sûr qu'elles seront supprimées, car devenues inutiles
'V_FORMULE_LOCAL_I_PARAMS',
'V_FORMULE_LOCAL_VH_PARAMS',
];
/* Mise en place du logging en mode console */
......@@ -39,10 +42,11 @@ $schema->alter($ref, $ddlConfig, true);
$c->println('Fin de mise à jour des définitions');
// On teste que la méthode existe, car au moment de la MAJ l'objet chargé est la version antérieure à celle de ce sccript
if (method_exists($oa,'majPrivileges')) {
if (method_exists($oa,'majPrivileges')) { /** @deprecated > 8.2 */
$c->println('Mise à jour des privilèges', $c::COLOR_LIGHT_PURPLE);
$oa->majPrivileges();
$c->println('Fin de la mise à jour des privilèges');
}
$oa->migration('post');
$c->println('');
\ No newline at end of file
......@@ -23,17 +23,16 @@ $tags = $oa->getTags();
foreach ($tags as $tag) {
$c->println($tag);
}
$ok = false;
while (!$ok) {
$c->print("Veuillez choisir une version à déployer: ");
$version = $c->getInput();
if ($oa->tagIsValid($version)) {
$ok = true;
} else {
$c->println("$version n'est pas dans la liste des versions disponibles.");
}
// Choix de la version
$c->print("Veuillez choisir une version à déployer: ");
$version = $c->getInput();
if (!$oa->tagIsValid($version)) {
$c->printDie("$version n'est pas dans la liste des versions disponibles.");
}
// Récupération des sources
$c->println("\nMise à jour des fichiers à partir de GIT", $c::COLOR_LIGHT_CYAN);
$c->passthru([
......@@ -41,6 +40,7 @@ $c->passthru([
"git checkout tags/$version",
]);
// Récupération des dépendances
$c->println("\nMise à jour des dépendances à l'aide de Composer", $c::COLOR_LIGHT_CYAN);
$c->passthru([
......@@ -49,22 +49,19 @@ $c->passthru([
"php composer.phar install",
]);
// Mise à jour des liens vers les répertoires publics des dépendances
$c->println("\nMise à jour des liens vers les répertoires publics des dépendances", $c::COLOR_LIGHT_CYAN);
$res = $oa->majUnicaenSymLinks($osedir);
$c->println($res ? 'Liens mis à jour' : 'Liens déjà à jour', $c::COLOR_GREEN);
// Conclusion
$oa->writeVersion($version);
$c->println("\nMise à jour des fichiers OK : la version installée est désormais la ".$version, $c::COLOR_LIGHT_GREEN);
$c->println("\nMise à jour de la base de données", $c::COLOR_LIGHT_CYAN);
$oa->migration('pre');
$oa->run('update-bdd');
$oa->migration('post');
// Néttoyage des caches et mise à jour des proxies
$oa->run('clear-cache');
// Mise à jour de la base de données à partir d'un nouveau processus
$oa->run('update-bdd', true);
$c->println("\nFin de la mise à jour. N'oubliez pas de sortir du mode maintenance!");
$c->println('');
\ No newline at end of file
......@@ -52,6 +52,13 @@ class OseAdmin
{
$this->version = $this->currentVersion();
$this->oldVersion = $this->version;
if ($this->console->hasOption('oa-old-version')){
$this->oldVersion = $this->console->getOption('oa-old-version');
}
if ($this->console->hasOption('oa-version')){
$this->version = $this->console->getOption('oa-version');
}
}
......@@ -159,15 +166,22 @@ class OseAdmin
/**
* @param string $action
*/
public function run(string $action)
public function run(string $action, $newProcess=false)
{
$oa = $this;
$c = $this->console;
if (file_exists($this->getOseDir() . 'admin/actions/' . $action . '.php')) {
require_once $this->getOseDir() . 'admin/actions/' . $action . '.php';
if ($newProcess){
$this->console->passthru(
"php " . $this->getOseDir() . "/bin/ose " . $action
.' --oa-old-version='.$this->oldVersion
.' --oa-version='.$this->version
);
}else{
$oa = $this;
$c = $this->console;
require_once $this->getOseDir() . 'admin/actions/' . $action . '.php';
}
} else {
$c->println('Action "' . $action . '" inconnue.', $c::COLOR_RED);
$this->console->println('Action "' . $action . '" inconnue.', $this->console::COLOR_RED);
require_once $this->getOseDir() . 'admin/actions/help.php';
}
}
......@@ -189,64 +203,35 @@ class OseAdmin
/**
* Lancement des scripts éventuels liés à des migrations pour des versions spécifiques
*
* @param string $prePost
*
* @return bool
* @throws \BddAdmin\Exception\BddCompileException
* @throws \BddAdmin\Exception\BddException
* @throws \BddAdmin\Exception\BddIndexExistsException
*/
public function migration(string $prePost = 'pre'): bool
protected function getMigrationFilesToExecute(string $oldVersion, string $newVersion, string $prePost = 'pre'): array
{
$this->console->println('Exécution des scripts de ' . $prePost . '-migration', $this->console::COLOR_LIGHT_PURPLE);
$execs = 0;
$tags = $this->getTags(1);
foreach ($tags as $i => $tag) {
$tags[$i] = $this->purgerVersion($tag);
}
$tags = array_unique($tags);
$oldIndex = array_search($this->purgerVersion($this->oldVersion), $tags);
$newIndex = array_search($this->purgerVersion($this->version), $tags);
$oldIndex = array_search($this->purgerVersion($oldVersion), $tags);
$newIndex = array_search($this->purgerVersion($newVersion), $tags);
$scripts = [];
if ($oldIndex !== false && $newIndex !== false && $oldIndex < $newIndex) {
for ($i = $oldIndex + 1; $i <= $newIndex; $i++) {
$phpMigr = $this->getOseDir() . 'admin/migration/' . $tags[$i] . '-' . $prePost . '.php';
$sqlMigr = $this->getOseDir() . 'admin/migration/' . $tags[$i] . '-' . $prePost . '.sql';
if (file_exists($sqlMigr)) {
$this->console->println('Exécution du script de ' . $prePost . '-migration SQL de la version ' . $tags[$i], $this->console::COLOR_LIGHT_BLUE);
$errors = $this->getBdd()->execFile($sqlMigr);
$execs++;
if (!empty($errors)) {
$this->console->println('Des erreurs ont été rencontrées durant l\'exécution du script de migration :', $this->console::BG_RED);
foreach ($errors as $e) {
$this->console->println($e->getMessage(), $this->console::COLOR_RED);
}
}
$scripts[] = $sqlMigr;
}
if (file_exists($phpMigr)) {
$execs++;
$this->console->println('Exécution du script de ' . $prePost . '-migration PHP de la version ' . $tags[$i], $this->console::COLOR_LIGHT_BLUE);
try {
require_once $phpMigr;
} catch (\Exception $e) {
$this->console->println($e->getMessage(), $this->console::COLOR_RED);
}
$scripts[] = $phpMigr;
}
}
if ($execs > 0) {
$this->console->println("Scripts de $prePost-migration exécutés");
} else {
$this->console->println("Aucun script de $prePost-migration à exécuter");
}
return true;
return $scripts;
} else {
if ($prePost == 'pre') { // on n'avertit qu'une seule fois!
$this->console->println('Attention : les scripts de migration automatiques n\'ont pas pu être déclenchés :', $this->console::BG_RED);
......@@ -268,12 +253,79 @@ class OseAdmin
);
}
return false;
return [];
}
}
protected function runMigrationPhpScript(string $filename)
{
$this->console->println('Exécution du script de migration ' . basename($filename), $this->console::COLOR_YELLOW);
try {
$oa = $this;
$c = $this->console;
require_once $filename;
} catch (\Exception $e) {
$this->console->println($e->getMessage(), $this->console::COLOR_RED);
}
}
protected function runMigrationSqlScript(string $filename)
{
$this->console->println('Exécution du script de migration ' . basename($filename), $this->console::COLOR_YELLOW);
$errors = $this->getBdd()->execFile($filename);
if (!empty($errors)) {
$this->console->println('Des erreurs ont été rencontrées durant l\'exécution du script de migration :', $this->console::BG_RED);
foreach ($errors as $e) {
$this->console->println($e->getMessage(), $this->console::COLOR_RED);
}
}
}
/**
* Lancement des scripts éventuels liés à des migrations pour des versions spécifiques
*
* @param string $prePost
*
* @return bool
* @throws \BddAdmin\Exception\BddCompileException
* @throws \BddAdmin\Exception\BddException
* @throws \BddAdmin\Exception\BddIndexExistsException
*/
public function migration(string $prePost = 'pre'): bool
{
$this->console->println('Exécution des scripts de ' . $prePost . '-migration', $this->console::COLOR_LIGHT_PURPLE);
$scripts = $this->getMigrationFilesToExecute($this->oldVersion, $this->version, $prePost);
foreach( $scripts as $script ){
$ext = substr($script, -3);
switch($ext){
case 'php':
$this->runMigrationPhpScript($script);
break;
case 'sql':
$this->runMigrationSqlScript($script);
break;
}
}
if (count($scripts) > 0) {
$this->console->println("Scripts de $prePost-migration exécutés");
} else {
$this->console->println("Aucun script de $prePost-migration à exécuter");
}
return true;
}
public function majPrivileges()
{
/* Chargement des categories en config */
......
......@@ -12,8 +12,4 @@ $c = new Console();
$oa = new OseAdmin($c);
$oa->init();
$c->printMainTitle("OSE", 15);
$oa->run($c->getArg(1) ?: 'help');
$c->println('Traitement terminé.', $c::BG_YELLOW);
\ No newline at end of file
$oa->run($c->getArg(1) ?: 'help');
\ No newline at end of file
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment