October 11, 2016
In this blog post I will provide an example of a method I use to deploy changes on the projects that I work on my own time. This method is very useful when there is a need to make a lot of manual changes to the site when there is a new release. You could use this method to automate deployment process of your Drupal sites. In fact this method can be used for any other non-Drupal sites too.
For this blog post I am using Drush commands.
Lets start form a very simple example. I will use Acquia's directory structure to descibe where I am storing release scripts.
acquia-utils/
docroot/
hooks/
...
releases/
- code/
- release-2/
- permissions.php
- users.php
- release-1.sh
- release-2.sh
- release-3.sh
As you can see releases/ directory is on the same level a docroot/. That's where the scripts would locate.
release-1.sh - A very simple release script that runs database updates and reverts features.
#!/bin/bash
# Database updates.
drush updb -y
# Revert features.
drush fr my_feature1 my_feature2 my_feature3 -y
release-2.sh - Release script with examples of how to run SQL queries and run PHP code.
#!/bin/bash
# Change weight of the module.
drush sql-query 'UPDATE system SET weight = 100 WHERE name = "my_custom_module"' -y
# Execute PHP code
# Make changes to permissions
drush php-script 'permissions.php' --script-path="../releases/code/release-2/" --user=[Drupal Admin Username]
# Make changes to users.
drush php-script 'users.php' --script-path="../releases/code/release-2/" --user=[Drupal Admin Username]
release-3.sh - Release script with additional examples.
#!/bin/bash
# Set variables
drush vset cache_lifetime 86400 -y
drush vset page_cache_maximum_age 86400 -y
drush vset error_level 0 -y
drush vset --always-set cache 1
# Execute inline PHP code
# Set permissions
drush php-eval "user_role_grant_permissions(DRUPAL_AUTHENTICATED_RID, array('my_module_name' => 'permission name'));"
# Set variable
drush php-eval "variable_set('my_variable_name', array('key' => 'value'));" -y
# Clear Drupal cache
drush cc all
And finally, you would need to ssh to the server and run each release script.
What else you could do:
- You could add backup logic so every time you run the script you would create database and files backups.
- Make clean Drupal install locally, download database from production and restore it locally with Drush.
- Run content migrations.
Use your imagination and please share with us the methods you use to improve your deployment process.