Speed Up Drupal Development with This Simple Ddev Script
Goal
Create a simple shell script that will automate the creation and updating of your local development environment using DDev.
Prerequisites
Composer installed on your local machine.
Docker installed on your local machine.
Curl on Linux or Brew on MacOS.
Overview
I consider myself a reasonably DRY person. I mean this in the programming sense, not in terms of actual lack of liquid. I'm 60% water, just like any other human... 61% when it rains.
What I mean is that I Don't want to Repeat Myself, especially when we are talking about daily or weekly tasks. Anytime I have a series of repeated steps in a routine, I have a natural drive to look at automating that process. It doesn't work in all areas of my life, but when it comes to software development, there are usually more opportunities to create shortcuts... er... I mean... to standardize. Yeah - that's it. I'm not lazy, just efficient.
I'm the primary developer for our community portal in addition to my other responsibilities, so I end up working on Drupal code at least a few times a week. DDev is the tool we use for local development, and I ❤️ how simple and powerful it is. A ton of thought and work has gone into making DDev such a reliable and elegant tool. It "just works™".
However, I noticed that I used the same series of commands every time I set up the project on my local machine (especially after a reboot). I figured this would be a good candidate for a simple shell script that I can use to get it all done in a single command. To my delight, this has turned out to be super simple and incredibly convenient. I've been using this script for about 5 months, and even though its not the most impressive work I've done... the result has been super impactful.
When I have time to write code, I run a single command and then go do other things. Meanwhile, it creates the local docker containers, updates them, builds the codebase, gets the latest DB and files from prod, adds my SSH keys to the containers, and generates a one-time login link for the local website. Whenever I am ready to switch into full dev mode, everything it ready to go
So - if you want to take a few minutes to create an automation script for your own local dev environment, I can promise you it will be worth it. Let's see how easy it is.
Install DDev
If you haven't already, download and install DDev on your local. This is almost always going to be super easy to do:
// On MacOS brew install ddev/ddev/ddev // On Linux curl -fsSL https://pkg.ddev.com/apt/gpg.key | gpg --dearmor | sudo tee /etc/apt/trusted.gpg.d/ddev.gpg > /dev/null echo "deb [signed-by=/etc/apt/trusted.gpg.d/ddev.gpg] https://pkg.ddev.com/apt/ * *" | sudo tee /etc/apt/sources.list.d/ddev.list sudo apt update && sudo apt install -y ddev
Note: ddev provides a wrapper around the containers and becomes the meta-command for much of what we do.
Configure Environment Variables
Depending on your hosting provider, you may need to set up specific environment variables for DDev. Refer to DDev's documentation and your hosting provider's documentation for detailed instructions. The most common managed hosting companies are:
Understanding the workflow
Before we write the script, we need to understand the basic workflow and commands. This really is a super simple script - it's just running a series of commands. But, we need to know what commands we need and why to ensure we set it up properly.
The script automates the process of setting up a local Drupal development environment. Here's what each part does:
- ddev start: Starts the DDev containers.
- ddev auth ssh: Adds your SSH key to the auth container.
- ddev pull [PROVIDER] -y: Pulls the latest database and files from the production environment.
- ddev drush cr: Clears the Drupal cache.
- ddev drush uli: Generates a one-time login URL for the admin user.
When you run these commands in this order, DDev will create the local environment, update it, and give you a link to login and get started.
Create the script
In your codebase, create a file called
startdev.sh
(or whatever you like). Put in the commands you want to run along with any output text. Here is my example:#!/bin/bash # Start the containers and set them up echo '<----------- Starting containers ------------------------------->' ddev start # Add your SSH key to the auth container echo '<----------- Adding SSH key to auth container ------------------>' ddev auth ssh # Pull the latest DB and files from prod to local echo '<----------- Pulling latest DB and files from prod ------------->' ddev pull acquia -y # Clear the cache after the DB update echo '<----------- Clearing cache ------------------------------------>' ddev drush cr # Create a one-time login for the admin super user echo '<----------- Creating a one-time login for admin --------------->' ddev drush uli echo 'Done!' echo '<----------- Local dev set up - lets have some fun! ----------->'
The great thing about this is that my notes above make it clear where I am in the process. Meanwhile, the other outputs from DDev will display normally.
Note: I'm using Acquia as the provider in this example, but you will need to change that to whatever provider you set up in step 2.
Run the script
Honestly, that's about it. All we need to do is give the script execute permissions, add it to your repo, and then run it!
// Give the script execute permissions. You only need to do this once. chmod +x startdev.sh // Add it to your repo git add startdev.sh git commit -m "Adding an awesome local dev script to my project."
Now, any time you need to setup (or update) your local dev environment, just run this command:
./startdev.sh
Note: The
./
prefix is used in Unix-like operating systems, including Linux and macOS, to run executable files or scripts that are located in the current directory. Unless your current directory is in yourPATH
environment variable, you need to tell the OS where the file is located.Customize the script
Why stop there? There are plenty of things you can do to customize your script. You can modify the messages, add a quote of the day, run other commands (like enabling dev modules), etc. For me, I decided to add some fun ASCII art to the script to display a custom message for the devs on the team:
Conclusion
While this is a really simple script, its actually super powered by the DDev commands. This is something I use all the time, and it not only saves me time, but it lets me relax and focus on what really matters.
Hey Ron,
glad to you see you are still dabbling in the Drupal world! Nice article. I'm also a huge DDEV fan.