PHP library to run commands, for example on deployment.
Sometimes, on deployment or when switching to a branch, we need to run some migration commands, for example reindex a database, calculate aggregation, remove whatever uploaded files...
Do not do it manually anymore by connecting to your server in ssh! This library allow you to declare in your feature git branch what command(s) need to be run once deployed.
$ composer require elao/command-migration
Enable the bundle on Symfony <= 3.4 (app/AppKernel.php)
public function registerBundles()
{
$bundles = array(
// ...
new Elao\CommandMigration\Bridge\Symfony\Bundle\CommandMigrationBundle(),
// ...
);
}
Enable the bundle on Symfony 4 (config/bundles.php)
return [
// ...
Elao\CommandMigration\Bridge\Symfony\Bundle\CommandMigrationBundle::class => ['all' => true],
// ...
];
Add a elao_command_migration.yaml
file (in a not public directory of course!):
elao_command_migration:
storage:
type: dbal
dsn: '%env(DATABASE_DSN)%'
table_name: 'command_migrations'
migrations: []
Declare what command(s) need to be run in the migrations
entry in your elao_command_migration.yaml
file:
elao_command_migration:
# ...
migrations:
whateverUniqueIdentifier:
- php bin/console app:posts:reindex
20180510173033:
- php bin/console app:posts:reindex
- php bin/console doctrine:migrations:migrate
20180622110900:
- php bin/console app:posts:reindex
- node hello-world.js
- php bin/console doctrine:schema:update --force
- rm -rf public/uploads/lolcats
- php bin/console app:recalculate:turnover
Entries in migrations
could have whatever identifier, but we recommend to use a date + time format: YYYYMMDDHHMMSS
Run php bin/elao-command-migration path/to/elao_command_migration.yaml
to test it.
Add php bin/elao-command-migration path/to/elao_command_migration.yaml
to your deployment process.
Set in deploy.rb:
after :deploy, 'app_tasks:elao_command_migration'
namespace :app_tasks do
task :elao_command_migration do
capifony_pretty_print "--> Run command migrations"
invoke_command "php bin/elao-command-migration path/to/elao_command_migration.yaml", :via => run_method
capifony_puts_ok
end
end
With Manala/ansible-role-deploy, add in ansible/group_vars/deploy.yml
:
manala_deploy_tasks:
- command: php bin/elao-command-migration path/to/elao_command_migration.yaml
or
manala_deploy_post_tasks:
- command: php bin/elao-command-migration path/to/elao_command_migration.yaml
CommandMigration is very inspired by Doctrine Migrations but for running commands.
The elao:command-migration:run
command :
- Fetch all migrations already ran from
command_migrations
database table - Get only migrations not already ran from
elao_command_migration.migrations
- Store migration identifier in
command_migrations
database table.
When the commands have been deployed and ran on production environment, you can (manually) delete the entries in
elao_command_migration.migrations
.