Drupal 8 Configuration Workflows using Git

February 27, 2014
2
0

This blog post is a textual representation of the video shared yesterday. If you are visual learner, watch it. If you are in a hurry, read this blog :). Peter's video also shows how configuration_log module can be used to materialize all config changes in Prod so they may be easily integrated back into the codebase. That is not covered here.

The following commands are our current best thoughts on how folks will move configuration across environments using Git and the Drush config commands. Our goal is to coalesce the community on a best practice that non-trivial Drupal sites will follow.

# Save an arbitrary configuration change using Drush. Using the admin ui would work just as well.
local$ drush config-edit system.site

# Export all your active configuration to a directory labelled 'vcs'. 
# This is a 3rd $config_directories[] item specified in settings.php (see below). 
local$ drush config-export vcs 
local$ git status 

# On branch master 
# Changes not staged for commit: 
#   (use "git add ..." to update what will be committed) 
#   (use "git checkout -- ..." to discard changes in working directory) 
# 
# modified:   ../config_vcs/system.site.yml 
# 
# Commit config changes so other devs can see them, and so we can propagate to other environments. local$ git commit -am "New site information configuration" 

# Push your changes. Resolve git conflicts as usual. 
local$ git push 

# Now, on the dev server, get latest codebase 
local$ ssh -A me@dev.server.example.com 

############################## 
#   Welcome to dev.server.example.com. 
#   Last login: Wed Feb 26 19:43:14 2014 from localhost 
dev$ cd www/docroot 
dev$ git pull 

# Import new config 
dev$ drush config-import vcs --preview=diff 

# Run DB updates, as usual 
dev$ drush updatedb

In terms of the settings.php we have an array of config directories:

<?php
$config_directories['active'] = 'sites/default/files/config_JeZmqqMqX_S80W7DKVKKMT7uH8iJIeUHkuTWks8b3ZU/active';
$config_directories['staging'] = 'sites/default/files/config_JeZmqqMqX_S80W7DKVKKMT7uH8iJIeUHkuTWks8b3ZU/staging';
$config_directories['vcs'] = '../config_vcs';
?>

The third entry gives us the "vcs" name that is used with the Drush commands. This key is arbitrary, as is the path. Acquia Cloud will use a directory named 'config_vcs' at the root of the site's Git repository.

Sign-up for our Developer Blog Newsletter

Thanks!

Add comment

By submitting this form, you accept the Mollom privacy policy.

Import site config error

We are following the above steps and encountering an error

```drush @oursitename.dev config-import -y vcs```

exception 'UnexpectedValueException' with message [error]
'DirectoryIterator::__construct(/mnt/www/html/oursitenameex5ocxmkzq/docroot/../config/default): failed to open dir: No such file
or directory' in /mnt/www/html/oursitenameex5ocxmkzq/docroot/core/lib/Drupal/Core/Config/FileStorage.php:292

RE: There seems to be some

There seems to be some undocumented standards that Acquia has put in place, where they expect your revision-controlled config to be in $REPO/config/$sitename where $sitename is probably default, or whatever multisite id you're on.

```php
$config_directories['sync'] = $app_root . '/' . $site_path . '/files/config_secretsecretsecret/sync';
if (!drupal_installation_attempted()) {
$config_directories['vcs'] = $app_root . '/../config/' . basename($site_path);
```