Powering Development
and Testing Environments
with Vagrant
Coen Jacobs / @CoenJacobs
at

WordCamp Norway 2014
!

#WCNorge
Coen Jacobs
@CoenJacobs
!

http://coenjacobs.me
!

WooThemes / WooCommerce
Powering Development
and Testing Environments
with Vagrant
Vagrant
Problem at hand
Get someone started
on your project
Let’s get you up and running…

•

“I just use MAMP, it’s brilliant”

•

“Tell me what you need and I’ll make a VM”

•

“My VPS runs a custom compiled LAMP setup”

•

“A server, what do I need that for?”
Bring order to chaos
Three common ways to do this
and all three are horrible…
1. Setup script
1. Setup script
•

Special maintenance!

•

Different to production!

•

Windows or Linux?
2. The über README
2. The über README
•

Extremely prone to user error!

•

Unlikely to keep it up to date!

•

Very time consuming!

•

Windows or Linux?
3. “Good luck, have fun”
3. “Good luck, have fun”
•

Extremely prone to user error!

•

Extremely time consuming!

•

Extremely frustrating!

•

Your developer will hate you…
Downsides
•

Not repeatable

•

Not verifiably correct

•

Not isolated

•

Difficult to understand

•

Slow
What is Vagrant?
“A tool for creating,
managing and distributing
portable development
environments”
- Mitchell Hashimoto (creator of Vagrant)
What is Vagrant?
•

Command line tool

•

Creates virtual machines

•

Handles networking and shared folders

•

Supports provisioning
What problems does it solve?
•

Repeatable & verifiably correct

•

Isolated

•

Understandable

•

As fast as possible
What problems does it solve?

•

Works on Mac, Windows and Linux

•

Works with VirtualBox, VMware and many more
How does it work then?
It’s magic, it really is…
“Vagrant reads a
Vagrantfile and builds a
virtual machine based on
a template called a box”
- Mitchell Hashimoto (creator of Vagrant)
Vagrantfile
“The primary function of the
Vagrantfile is to describe the type
of machine required for a project,
and how to configure and
provision these machines.”
http://docs.vagrantup.com/v2/vagrantfile/index.html
Vagrantfile
Vagrant::configure("2") do |config|!
! config.vm.box = "precise32"!
! config.vm.box_url = “http://.../precise32.box”!
! config.vm.hostname = "vagrant.localhost"!
!

! config.vm.network :private_network, ip: "192.168.99.100"!
end
Virtual machine
•

Isolated environment

•

Any operating system

•

Any installed software

•

Project specific configuration and versions
Boxes
“Boxes are the skeleton from
which Vagrant machines are
constructed. They are portable
files which can be used by others
on any platform that runs Vagrant
to bring up a working
environment.”
http://docs.vagrantup.com/v2/boxes.html
Boxes
•

Pre-installed OS

•

May contain pre-installed software

•

Custom boxes can be made
Provisioning
Provisioning
“Provisioners in Vagrant allow you
to automatically install software,
alter configurations, and more on
the machine as part of the vagrant
up process.”
http://docs.vagrantup.com/v2/provisioning/index.html
Provisioning
•

Shell

•

Ansible

•

Chef

•

Puppet

•

Docker

•

Salt
Providers
Enabling Vagrant to do its job
Providers
“While Vagrant ships out of the
box with support for VirtualBox,
Vagrant has the ability to manage
other types of machines as well.
This is done by using other
providers with Vagrant.”
https://docs.vagrantup.com/v2/providers/index.html
Providers
•

VirtualBox

•

VMware

•

AWS

•

Rackspace

•

Digital Ocean




and many more…
Change providers dynamically

vagrant up --provider=vmware_fusion
vagrant up --provider=digital_ocean
Does this really make a
developers life easier?
YES!
Old situation
•

Setup script

•

The über README file

•

“Good luck, have fun”




or any other manual way of configuring…
Vagrant is more like…
Get started with a Vagrant project

git clone repository.git folder!
cd folder!
vagrant up
What did Vagrant do
in the background?
The vagrant up command
•

Check if the box is already downloaded
•

If not, download the box

•

Start the VM

•

Set up synced folders

•

Set up networking

•

Start provisioning
Your new VM is ready
vagrant ssh
vagrant halt
vagrant destroy
Your new VM is ready
•

Some examples of what ‘ready’ means:
•

Nginx installed

•

PHP installed

•

MySQL installed

•

WordPress installed

•

Database imported

•

wp-config.php file set up
From development and
testing to production
Using Vagrant to its full potential
Vagrantfile in version control

•

Commit your Vagrantfile

•

Share it with all developers

•

Commit a change, all developers benefit
Share the provisioning
•

Provisioning files into version control as well

•

Production server shares the provisioning files
•

•

Use parameters/flags for differences

Change one, all environments will change
… and this is only
the beginning
Advanced use cases
Now we’re talking!
Plugin testing
•

Stable version

•

Development version

•

Combine those two on stable/dev WordPress

•

Four local websites per plugin
Multiple PHP version testing
•

One Vagrantfile

•

Multiple machines

•

Different PHP versions

•

One shared set of files

•

One database

http://wordpress.org/about/stats/
Integrate useful tools
•

WP-CLI

•

REDIS

•

Xdebug

•

Memcache

•

WebGrind

•

Your own dotfiles
All going a little too fast?
No worries
Vagrant has great documentation

•

http://docs.vagrantup.com/v2/

•

Plenty of examples

•

Great pointers to providers and provision resources

•

Vagrant is the latest trend
Varying Vagrant Vagrants
Varying Vagrant Vagrants
•

https://github.com/10up/varying-vagrant-vagrants

•

Ready to use Vagrant setup

•

Really easy to expand

•

Quickly launch new local development websites

•

Automatically installs: WP-CLI, Nginx, MySQL, PHPFPM, Memcache, Xdebug, Imagemagick, PHPunit,
Composer, NodeJS, Grunt, WebGrind and much,
much more, all on one Ubuntu 12.04 VM.
Let’s make the world a better place
for developers
!

Start using Vagrant
Questions?
Now, or come find me later!
!

@CoenJacobs
http://coenjacobs.me
Photo credits
1. http://www.flickr.com/photos/tinali778/2947963220/
2. http://www.flickr.com/photos/naan/2948047370/
3. http://www.flickr.com/photos/riebart/4466482623/
4. http://www.flickr.com/photos/55915190@N00/2302651444/
5. http://www.flickr.com/photos/l2f1/4895151918/
6. http://www.flickr.com/photos/basykes/490907537/
7. http://www.flickr.com/photos/whiskeytango/2098182380/
8. http://www.flickr.com/photos/chr1sp/5942681564/
9. http://www.flickr.com/photos/5wa/6109494115/
10.http://www.flickr.com/photos/msimdottv/4339697089/

Powering Development and Testing Environments with Vagrant