Aller au contenu

UGA - MIASHS - S7 - BDD - Pierre Blarre

Script de déploiement

Icône Présentation
1 / 1

À force d’ajouter des étapes à notre processus de déploiement, il devient fastidieux de tout faire à la main.

Les différentes étapes que nous avons vues jusqu’à présent peuvent être automatisées à l’aide d’un script de déploiement.

Un script de déploiement est un fichier qui contient une série de commandes à exécuter.

De plus, dans le cadre de la conception d’une base de données, modifier la conception aura un impact sur l’ensemble des fichiers de votre projet.

Nous souhaitons donc créer un script qui va :

  1. Générer le schéma de la base de données aux formats SQL et SVG à partir du fichier DBML
  2. Générer les données de test dans un fichier SQL
  3. Créer la base de données dans le SGBD et y insérer les tables
  4. Insérer les données de test dans la base de données

On souhaitera par ailleurs que la génération depuis le DBML ou bien la création de nouvelles données aléatoires soient des étapes optionnelles.

On voudra donc pouvoir utiliser le script de la manière suivante :

Fenêtre de terminal
php boutique-generate.php --dbml --generate --data

Retirer les options --dbml, --generate ou --data permettra de ne pas exécuter les étapes correspondantes, uniquement de réinitialiser la base de données sans modifier le schéma ou le jeu de données.

Création du script

Créez un fichier boutique-generate.php à la racine de votre projet et ajoutez y le code ci-dessous.

Prenez le temps de comprendre chaque étape du script.

boutique-generate.php
<?php
require_once 'vendor/autoload.php'; // Load the Composer autoloader to use Dotenv
/**
* DOTENV and PHP Constants
*/
// Load the .env file
$dotenv = Dotenv\Dotenv::createImmutable(__DIR__);
$dotenv->load();
// Define PHP constants from .env file
define('DB_DRIVER', $_ENV['DB_DRIVER']);
define('DB_HOST', $_ENV['DB_HOST']);
define('DB_NAME', $_ENV['DB_NAME']);
define('DB_USER', $_ENV['DB_USER']);
define('DB_PASS', $_ENV['DB_PASS']);
define('DB_PORT', $_ENV['DB_PORT']);
define('DBML_FILE', $_ENV['DBML_FILE']);
define('SVG_FILE', $_ENV['SVG_FILE']);
define('DDL_FILE', $_ENV['DDL_FILE']);
define('FAKER_FILE', $_ENV['FAKER_FILE']);
define('DML_FILE', $_ENV['DML_FILE']);
/**
* Get command line options
*/
//get command line options parameters ( https://www.php.net/manual/en/function.getopt.php )
// --dbml to regenerate SQL schema from DBML file
// --generate to generate SQL data from PHP file with Faker
// --data to import SQL data from SQL file : Will drop and recreate the database
$opts = getopt('', ['dbml', 'generate', 'data']);
/**
* Manage DBML conversion
*/
//generate SQL and SVG schema from DBML file if the option is provided and the file exists
if (isset($opts['dbml'])) {
if (!file_exists(DBML_FILE)) {
echo 'Please provide the DBML file';
exit(1);
}
shell_exec('npx dbml2sql ' . DBML_FILE . ' -o ' . DDL_FILE . ' --' . DB_DRIVER); //generate SQL schema
shell_exec('npx dbml-renderer -i ' . DBML_FILE . ' -o ' . SVG_FILE); //generate SVG schema
}
/**
* Manage SQL data generation with Faker
*/
// Call Faker script if the option is provided
if (isset($opts['generate'])) {
require_once FAKER_FILE;
}
/**
* Manage SQL schema and data import
*/
if (isset($opts['data'])) {
if (!file_exists(DML_FILE) or !file_exists(DDL_FILE)) {
echo 'Please provide the DDL and DML files';
exit(1);
}
// Create a new PDO instance to connect to the database
$pdo = new PDO(DB_DRIVER . ':host=' . DB_HOST, DB_USER, DB_PASS);
// Drop and recreate the database
$pdo->exec('DROP DATABASE IF EXISTS ' . DB_NAME);
$pdo->exec('CREATE DATABASE ' . DB_NAME);
$pdo->exec('USE ' . DB_NAME);
// Import the SQL schema
$sql = file_get_contents(DDL_FILE);
$pdo->exec($sql);
//Import the data from SQL file
$sql = file_get_contents(DML_FILE);
$pdo->exec($sql);
}

Dans un terminal, exécutez le script :

Fenêtre de terminal
php boutique-generate.php --dbml --generate --data

Si vous n’avez pas d’erreurs, alors c’est que tout s’est bien passé !

Prenez un moment pour effectuer un commit et publier vos modifications sur GitHub.