Magento Configuration Sync
This is a tool designed to allow teams to keep Magento (1.x and 2.x supported) configuration under version control, eliminating the unknown when tracking down potentially configuration related bugs.
The configuration values are stored in a YAML file. The format of the file is as follows:
environment: scope_key: path: value
production: default: dev/debug/template_hints: 0 development: default: dev/debug/template_hints: 1 stores-1: currency/options/base: GBP dev/restrict/allow_ips: null
The above will:
- disable template hints on product;
- enable template hints on the development environment;
- set the currency to Pounds Sterling in the store scope for the store with ID #1;
- ensure the allowed development ip's are inherited from the website for store #1.
Valid scope keys are:
php bin/mageconfigsync --help
Most commands take an optional argument of
--magento-root if not running from within a Magento directory and an optional argyment of
--env used to describe the current environment of the configuration.
php bin/mageconfigsync dump --help
The dump command outputs the current contents of the configuration as YAML to stdout. Specify
--env and the environment will be added as the first key, for convenience.
php bin/mageconfigsync load --help
The load command synchronises the database with the contents of the file. Any changed lines will be output to stderr. The
--env option will determine which section of the YAML file is loaded.
php bin/mageconfigsync diff --help configuration_file.yaml
Thanks to the symfony/yaml component we can use all the tricks YAML provides us, including merge keys. Consider the following file,
prod: default: &prod_global currency/options/base: GBP dev/debug/template_hints: 0 dev: default: <<: *prod_global dev/debug/template_hints: 1
Our aim is to ensure that the currency is always set to
GBP, regardless of the environment, but template hints should only be enabled for the local environment.
On our development machine we can pull our latest changes and run the following command to get the configuration just as we want it:
php bin/mageconfigsync load --magento-root ~/Sites/magento --env dev config.yml
We can also use this
config.yml as part of our deployment process. Consider a workflow like the following:
// Take a backup of the configuration, incase we need to restore as part of a rollback php bin/mageconfigsync dump --env prod > config.yml.pre-deploy // Give us a diff for the deployment log so we can see what's about to be changed php bin/mageconfigsync diff --file-env prod config.yml // Sync the latest configuration changes to prod php bin/mageconfigsync load --env prod config.yml
Congratulations, your Magento configuration is now under control, is auditable and consistent.