17.7 Migration de modules

17.7.1 Scripts de pré-migration et de post-migration

Lors de la mise à jour d'un module, il est possible d'exécuter des scripts pour effectuer des opérations de migrations ou des traitements spécifiques.

Ces scripts de migration ne peuvent être utilisés que dans le cadre de mise à jours d'application.
Un module sans application ne peut pas utiliser cette mécanique de migration.

Deux types de scripts sont possibles :

  • scripts de pré-migration (premigr) : les scripts de pré-migration (premigr) sont prévus pour être exécutés avant que l'application et les familles en base de données soient mis-à-jour,
  • scripts de post-migration (postmigr) : les scripts de post-migration (postmigr) sont prévus pour être exécutés après que l'application et les familles en base de données aient été mis-à-jour.

Les scripts doivent être situés dans le sous-répertoire de l'application et leur nom doit être de la forme :

  • scripts de pré-migration (premigr) : ${APPNAME}_premigr_${VERSION}
  • scripts de post-migration (postmigr) : ${APPNAME}_postmigr_${VERSION}

Remarques :

  • Le script peut être écrit dans n'importe quel langage que peut exécuter la plateforme hébergeant le contexte sur lequel il est exécuté. Toutefois, il ne doit pas avoir d'extension, il faut donc utiliser la notation shebang en première ligne de script pour indiquer le langage d'exécution,
  • les scripts de migration sont exécutés sur les changements de VERSION sans tenir compte des RELEASE. On ne peut donc pas exécuter de script de migration lors d'un changement de RELEASE,
  • les scripts de migration doivent être exécutables.

17.7.2 Exécution des scripts

Le lancement de ces scripts est commandé dans le fichier info.xml du module par l'utilisation d'une directive <process command="programs/(pre|post)_migration ${APPNAME}" /> dans la section <post-upgrade/>.

Exemple de déclaration type pour le lancement de scripts de pré-migration et de post-migration :

<module name="FOO" version="VERSION" release="1">
  ...
  <post-upgrade>
    <process command="programs/pre_migration FOO" />
    <process command="programs/record_application FOO" />
    <process command="programs/app_post FOO U" />
    <process command="programs/post_migration FOO" />
    <process command="programs/update_catalog" />
  </post-upgrade>
</module>

Les programmes pre_migration et post_migration exécutent tous les scripts de "premigr" ou "postmigr" dont la version est comprise entre la version de l'application actuellement installé, et la version de l'application mise-à-jour.

Version sur le contexte Version dans le paquet Version du script Exécution
1.0.0 2.0.0 1.1.0 Oui
1.0.0 1.0.0 1.0.0 Non
3.0.0 2.0.0 1.0.0 Non
1.0.0 2.0.0 1.0.0 Non
1.0.0 2.0.0 2.0.0 Oui

17.7.3 Variables d'environnement

Lorsque les scripts "premigr" et "postmigr" sont exécutés, les variables d'environnement suivantes sont disponibles :

Variable Valeur Exemple
wpub Le chemin d'accès au contexte sur lequel est effectué la mise-à-jour. "/var/www/dynacase"
httpuser L'UID du process httpd/Apache. "www-data"
pgservice_core Le nom du service PostgreSQL d'accès à la base de données Dynacase. "dynacase"
MODULE_VERSION_FROM La version du module actuellement installée (de la forme "VERSION-RELEASE"). Cette version n'est pas forcément égale à la version de l'application "1.2.3-4"
MODULE_VERSION_TO La nouvelle version du module (de la forme "VERSION-RELEASE"). "2.3.4-5"
WIFF_CONTEXT_NAME Le nom du contexte sur lequel est effectué la mise-à-jour. "dynacase"
WIFF_CONTEXT_ROOT Le chemin d'accès au contexte sur lequel est effectué la mise-à-jour. "/var/www/dynacase"
WIFF_ROOT Le chemin d'accès au répertoire dans lequel est installé dynacase-control. "/var/www/dynacase-control"

17.7.4 Création de script PHP utilisant l'API de Dynacase

Les scripts de migrations doivent pouvoir être de bas niveau comme ceux présentés ci-dessus. Il s'exécute en ayant un minium de dépendances et permettent de faire des mise à jour sur des parties très bas niveau de Dynacase (base de données, mécanisme de persistances, etc.). Toutefois, dans le cas d'une application, il est souvent plus pratique d'utiliser les API de Dynacase soit via les scripts, soit via les applications actions.

Pour ce faire, vous pouvez utiliser l'exemple suivant :

 
#!/bin/bash
 
set -o errexit
set -o nounset
 
ME=$(basename "$0")
 
function wsh_api {
  logger -t "$ME" -- "BEGIN:$@"
  "$wpub/wsh.php" "$@"
  logger -t "$ME" -- "END:$@"
}
 
# Pour un script CLI
wsh_api --api=[NOM_DU_SCRIPT_CLI] --from="$MODULE_VERSION_FROM" --to="$MODULE_VERSION_TO"
 
# Pour une action
wsh_api --app=[NOM_APPLICATION] --action=[NOM_ACTION] --from="$MODULE_VERSION_FROM" --to="$MODULE_VERSION_TO"

Le code ci-dessus appelle une action ou un script cli en passant en paramètres entrant les numéros de version (le passage des numéros de version est facultatif).

Note : Pour comparer les numéros de version passés en paramètres, vous pouvez utiliser la fonction version_compare.

17.7.5 Comparaison de versions pour les scripts bash

Il peut être nécessaire, pour un script de migration, d'effectuer des opérations différentes en fonction de la version de départ du module. Pour cela, la variable d'environnement $MODULE_VERSION_FROM peut-être utilisée pour obtenir la version du module actuellement installé. Ensuite, pour comparer des versions représentés sous forme de chaîne de caractères, il vous faudra utiliser la fonction bash versionCompare déclarée dans le fichier bash $wpub/libutil.sh :

Syntaxe :

versionCompare $V1 $V2

La fonction prend deux arguments, qui sont les versions à comparer, et affiche sur STDOUT un entier : inférieur à 0 si $V1 est inférieur à $V2 supérieur à 0 si $V1 est supérieur à $V2 égal à 0 si $V1 est égal à $V2

Il faut ensuite utiliser les opérateurs de comparaison arithmétique ("-lt", "-gt", "-le", "-ge", "-eq", "-ne") de bash :

#!/bin/bash
 
. "$wpub/libutil.sh"
 
CMP=$(versionCompare "$MODULE_VERSION_FROM" "1.0.0")
if [ $CMP -lt 0 ]; then
  echo "La version de départ est inférieure à 1.0.0"
else
  echo "La version de départ est supérieure ou égale à 1.0.0"
fi
×
nouveauté