environments and version control in ee - the why and how
TRANSCRIPT
@ERIKREAGAN • EECI 2011
ENVIRONMENTS & VERSION CONTROL
The Why & How
@ERIKREAGAN • EECI 2011
WHO IS THIS GUY?
2
EE Reactor team member
@ERIKREAGAN • EECI 2011
WHO IS THIS GUY?
3
Partner & Lead Developer
Survey Submissions
@ERIKREAGAN • EECI 2011
784
@ERIKREAGAN • EECI 20115
35
24
19
6-10 years
3-5 years
Over 10 years
SURVEY SUBMISSIONSWeb Development Experience
@ERIKREAGAN • EECI 20116
40191243
3-4 years
SURVEY SUBMISSIONSExpressionEngine Experience
0-2 years
5-7 years
pMachine
None
@ERIKREAGAN • EECI 20117
666438212019
HTML/CSS/JS markup
SURVEY SUBMISSIONSWeekly Responsibilities
EE site planning
PHP/MySQL development
Add-on development
Content management
Team leader
Caught my Monty Python reference
@ERIKREAGAN • EECI 2011
73%8
@ERIKREAGAN • EECI 2011
VERSION CONTROL
9
@ERIKREAGAN • EECI 2011
SYNONYMS • Version Control
• Revision Control
• Source Control
10
@ERIKREAGAN • EECI 2011
COMMON SYSTEMS• Git
• Subversion
• Mercurial
11
@ERIKREAGAN • EECI 2011
SURVEY STATS
12
Devs not currently using a VCS regularly
@ERIKREAGAN • EECI 2011
34%13
Devs only using a desktop GUI for VCS
@ERIKREAGAN • EECI 2011
21%14
Devs only using command line for VCS
@ERIKREAGAN • EECI 2011
21%15
Devs using both CLI and a GUI for VCS
@ERIKREAGAN • EECI 2011
24%16
Have used CVS
@ERIKREAGAN • EECI 2011
6%17
Have used Mercurial
@ERIKREAGAN • EECI 2011
13%18
Have used Subversion
@ERIKREAGAN • EECI 2011
54%19
Have used Git
@ERIKREAGAN • EECI 2011
77%20
@ERIKREAGAN • EECI 201121
WE USE GIT
Linux jQuery Rails Android
@ERIKREAGAN • EECI 201121
WE USE GITAnd so do the cool kids
Linux jQuery Rails Android
@ERIKREAGAN • EECI 201121
WE USE GITAnd so do the cool kids
Linux jQuery Rails Android
@ERIKREAGAN • EECI 2011
OLD WAY
1. Duplicate index.html
2. Test changes
3. (Maybe save a backup of the previous version)
4. Save over old version losing previous state
22
Single Developer
@ERIKREAGAN • EECI 2011
NEW WAY
1. Change and save the file contents
(Retain history of file for future use)
23
Single Developer
@ERIKREAGAN • EECI 2011
OLD WAY
1. Bob changes part of index.html
2. Suzie changes a different part of index.html
3. Bob and Suzie carefully merge changes together
4. Overwrite old version of index.html
24
Development Team
@ERIKREAGAN • EECI 2011
NEW WAY
1. Change and save the file contents
(Retain history of file for future use)
25
Development Team
@ERIKREAGAN • EECI 201126
@ERIKREAGAN • EECI 201126
@ERIKREAGAN • EECI 201126
@ERIKREAGAN • EECI 2011
KEY CONCEPTS• Track certain files
• Ignore certain files
• Commits (History)
• Branches
• Remote branches
27
@ERIKREAGAN • EECI 2011
“WHAT DO I TRACK?”VS
“WHAT DO I IGNORE?”
28
@ERIKREAGAN • EECI 2011
IGNORED FILES• Operating System files
• Caches
• .htaccess (possibly)
• Custom uploads from EE
• Dynamic images (captchas etc)
29
@ERIKREAGAN • EECI 2011
# Lame OS files Thumbs.db.DS_Store
# EE System cache/system/expressionengine/cache/*
# Local dev database file/config/config.local.php
# Custom Upload Directories/public_html/uploads/*
# Captchas/public_html/images/captchas
# Asset minification/public_html/min
30
.gitignore
@ERIKREAGAN • EECI 201131
TRACKED FILES• EE System directory
• Add-ons
• Template flat files
• Images, CSS, Javascript & other assets
@ERIKREAGAN • EECI 2011
COMMITSCreate your history
32
@ERIKREAGAN • EECI 2011
COMMIT TIPS• Commit o"en (common Git practice)
• Write detailed commit messages
• Review commit log when returning to a project a"er a break of any sort
• Review commits of development team members
33
@ERIKREAGAN • EECI 2011
BAD COMMIT MESSAGEUpdated config file.
34
@ERIKREAGAN • EECI 2011
GOOD COMMIT MESSAGEUpdated config file with new Minimee cache path directory
This allows our cache path to be dynamicly absolute based on the environment out code is in.
$config[‘minimee_cache_path’] = $base_path . ‘/min’;
35
@ERIKREAGAN • EECI 2011
BRANCHINGKeeping things organized
36
@ERIKREAGAN • EECI 2011
BRANCHING WORKFLOW
Do what works best for you
37
Just make sure you do it for a reason
@ERIKREAGAN • EECI 2011
REMOTE BRANCHES• Destination for your repository / branch
• “Origin” of your repository / branch
• Server environment for your site
• Other team member’s repository / branch
38
@ERIKREAGAN • EECI 2011
TOPICAL BRANCHING• master
• dev
• feature/x
• upgrade/y
• bugfix/z
39
@ERIKREAGAN • EECI 201140
“It's like not wearing a seatbelt in your car because you haven't had an accident yet.
Don't be silly, version your work.”
Iain Urquhart / @iain
@ERIKREAGAN • EECI 2011
GIT RESOURCES• Book: Pragmatic Version Control Using Git
• peepcode.com/products/git
• whygitisbetterthanx.com
• github.com
• More available with the presentation download
41
@ERIKREAGAN • EECI 2011
ENVIRONMENTS
42
@ERIKREAGAN • EECI 2011
AN ENVIRONMENT ISany server running an instance of your site
43
@ERIKREAGAN • EECI 2011
COMMON ENVIRONMENTS• Production - the public-facing “live” site
• Staging - typically used for a final test
• Development - shared team development
• Local - each developer’s local instance
44
@ERIKREAGAN • EECI 2011
SURVEY STATS
45
Devs currently using a Production Environment
@ERIKREAGAN • EECI 2011
100%46
Devs currently using a Staging Environment
@ERIKREAGAN • EECI 2011
59%47
Devs currently using a Shared Dev Environment
@ERIKREAGAN • EECI 2011
32%48
Devs currently using a Local Dev Environment
@ERIKREAGAN • EECI 2011
77%49
Devs who keep using environments post-launch
@ERIKREAGAN • EECI 2011
29%50
@ERIKREAGAN • EECI 201151
WHY DO YOU USE ENVIRONMENTS?
@ERIKREAGAN • EECI 201152
“Local development is incredibly fast and you don't have to worry about setting up crazy conditionals and memeber preferences to hide what you are working on on the live site.”
@ERIKREAGAN • EECI 201153
“Multiple environments allow us to build locally without affecting others and preview new features to clients - without losing the ability to quickly apply updates to the current live site.”
@ERIKREAGAN • EECI 201154
“Automated deployments and multiple environments are essential to any agile-oriented developer. They save time, reduce errors and streamline site maintenance.”
@ERIKREAGAN • EECI 201155
GETTING SET UPWhat is potentially unique to each environment?
@ERIKREAGAN • EECI 2011
GETTING SET UP
• Server paths
• URL root
• EE upload paths
• Debug mode intentions
• URI support (PATH_INFO)
• Cache settings
56
What’s Unique?
@ERIKREAGAN • EECI 2011
ROBUST CONFIG FILESaves time and adds flexibility
57
@ERIKREAGAN • EECI 2011
GETTING SET UP
✓ Server paths
✓ URL root
- EE upload paths
✓ Debug mode intentions
✓ URI support (PATH_INFO)
✓Cache settings
58
What can be changed?
@ERIKREAGAN • EECI 2011
GETTING SET UP
/config/
config.env.php
config.master.php
config.{ENV}.php
/public_html/
/system/
/tpl/
59
Directory and file structure
@ERIKREAGAN • EECI 2011
GETTING SET UP
if ( ! defined('ENV')){ switch ($_SERVER['HTTP_HOST']) { case 'focuslabllc.com' : define('ENV', 'prod'); define('ENV_FULL', 'Production'); define('ENV_DEBUG', FALSE); break; case 'ohsnap.focuslabllc.com' : define('ENV', 'stage'); define('ENV_FULL', 'Staging'); define('ENV_DEBUG', FALSE); break; default : define('ENV', 'local'); define('ENV_FULL', 'Local'); define('ENV_DEBUG', TRUE); break; }}
60
config.env.php sample
@ERIKREAGAN • EECI 2011
GETTING SET UP
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
/** * Development config overrides & db credentials * * Our database credentials and any environment-specific overrides * * @package Focus Lab Master Config * @version 1.1 * @author Erik Reagan <[email protected]> */
$env_db['hostname'] = 'localhost';$env_db['username'] = '';$env_db['password'] = '';$env_db['database'] = '';
$config['webmaster_email'] = '[email protected]';
/* End of file config.dev.php *//* Location: ./config/config.dev.php */
61
config.dev.php sample
@ERIKREAGAN • EECI 2011
GETTING SET UP
/** * Template settings * * Working locally we want to reference our template files. * In staging and production we do not use flat files
* (for ever-so-slightly better performance) * This approach requires that we synchronize templates after * each deployment of template changes */$env_config['save_tmpl_files'] = (ENV == 'prod') ? 'n' : 'y';$env_config['tmpl_file_basepath'] = $base_path . '/../tpl/';$env_config['hidden_template_indicator'] = '_';
62
config.master.php sample
@ERIKREAGAN • EECI 2011
GETTING SET UP
/** * Debugging settings * * These settings are helpful to have in one place * for debugging purposes */$env_config['is_system_on'] = 'y';$env_config['allow_extensions'] = 'y';$env_config['email_debug'] = (ENV_DEBUG) ? 'y' : 'n' ;// Show template debugging if we're not in production$env_config['template_debugging'] = (ENV_DEBUG) ? 'y' : 'n' ;/** * Set debug to '2' if we're in dev mode, otherwise just '1' * * 0: no PHP/SQL errors shown * 1: Errors shown to Super Admins * 2: Errors shown to everyone */$env_config['debug'] = (ENV_DEBUG) ? '2' : '1' ;
63
config.master.php sample
@ERIKREAGAN • EECI 2011
GETTING SET UP
/** * 3rd Party Add-on config items as needed */$env_config['minimee_cache_path'] = $base_path . '/min';$env_config['minimee_cache_url'] = $base_url . '/min';$env_config['minimee_remote_mode'] = 'auto';$env_config['minimee_debug'] = 'n';// Disable minimee in dev but not in staging and production$env_config['minimee_disable'] = (ENV == 'local') ? 'y' : 'n' ;
// Greeny (auto-updating of upload directory paths)$env_config['greeny_enabled'] = (ENV == 'prod') ? 'false' :
64
config.master.php sample
@ERIKREAGAN • EECI 2011
FOCUS LABCONFIG SETUPgithub.com/focuslabllc/ee-master-config
65
@ERIKREAGAN • EECI 2011
MULTI-ENVIRONMENT CHALLENGES
You didn’t think it was that easy, did you?
66
@ERIKREAGAN • EECI 2011
BACK TO THE SURVEY
67
100%@ERIKREAGAN • EECI 201168
100%@ERIKREAGAN • EECI 201168
Keeping database changes synced across environments
72%@ERIKREAGAN • EECI 201169
72%@ERIKREAGAN • EECI 201169
Maintaining custom upload directory paths
Devs who say the headaches are worth the trouble
100%@ERIKREAGAN • EECI 201170
@ERIKREAGAN • EECI 201171
DATABASE ISSUES• New custom fields alter the DB schema
• Installing or updating add-ons can alter the DB schema
• Updating EE can alter the DB schema
@ERIKREAGAN • EECI 2011
DATABASE ISSUES
• Custom upload directory paths are stored in the DB and cannot be dynamically altered
• Relative upload directory paths work sometimes, but not with all add-ons
• “Content” is very likely changing in the Production environment while you build and test in your other environments
72
@ERIKREAGAN • EECI 201173
http://expressionengine.com/forums/viewthread/196480/
@ERIKREAGAN • EECI 2011
QUICK TIPS• You need to understand EE’s database
• Learn about 3rd party add-on’s DB tables
• Establish a ruleset for your workflow
• Understand that there will be exceptions
74
@ERIKREAGAN • EECI 201175
Schema / Structureflows up stream
@ERIKREAGAN • EECI 201176
Content flowsdown stream
@ERIKREAGAN • EECI 2011
FINAL NOTES• These practices make you a better developer
• They help prepare you to work with a team
• They help your team work more efficiently
• You can provide a better service to your clients
77
@ERIKREAGAN • EECI 2011
!ERIKREAGANPartner, Focus Lab, LLC!FocusLabLLC
78