elao / command-migration
PHP lib to run commands, for example on deployment.
Requires
- php: >=7.2.0
- doctrine/dbal: ^2.6.0
- symfony/console: ~3.4|~4.1
- symfony/event-dispatcher: ~3.4|~4.1
- symfony/process: ~3.4|~4.1
- symfony/yaml: ~3.4|~4.1
Requires (Dev)
- friendsofphp/php-cs-fixer: ^2.13
- phpunit/phpunit: ^7.0
README
PHP library to run commands, for example on deployment.
Why
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.
Install
$ 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: []
Usage
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.
Integration
Add php bin/elao-command-migration path/to/elao_command_migration.yaml
to your deployment process.
Capifony
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
Ansible
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
How it works
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.
Clean old migrations
When the commands have been deployed and ran on production environment, you can (manually) delete the entries in
elao_command_migration.migrations
.