Download - Tool Up Your LAMP Stack
Tool Up Your LAMP Stack
About Me
2
• Lorna Mitchell
• Web Development Consultant
• Speaker and Author
• Website: http://lornajane.net
• Twitter: @lornajane
LAMP
3
LAMP
4
• Linux
• Apache
• MySQL
• PHP (or Perl, or Python)
Technology and Agile
6
Technology is not theproblem
7
Technology is not thesolution
Technology
8
• We need good tools
Technology
8
• We need good tools
• They enable our workflow
Technology
8
• We need good tools
• They enable our workflow
• They facilitate our achievements
Technology
8
• We need good tools
• They enable our workflow
• They facilitate our achievements
• They allow us to meet our deadlines
Technology
8
• We need good tools
• They enable our workflow
• They facilitate our achievements
• They allow us to meet our deadlines
• They are not the silver bullet (sorry)
Iterative Development
9
develop deploy
The Main Ingredients
10
Preparation time: some years
Ingredients:
• Source control
• Development platforms
• Task tracking
• Automated testing
• Static analysis
• Automated deployment
• Continuous integration
Source Control
Source Control: Key Ingredient
12
• Central, canonical version
• Collaboration point
• Historical information
• what changed
• when
• by whom
• Can include its own config
Source Control Tools
13
• Subversion http://subversion.apache.org/
• Git http://git-scm.com/
• Mercurial http://mercurial.selenic.com/
Branching Strategies
14
Common patterns:
• Feature branches
• Version branches
• Live/integration branches
Traditional Centralised Source Control
15
repo
checkout checkoutcheckout
Distributed Source Control
16
repo
repo
repo
repo
repo
Database Version Control
17
No silver bullet to keep code and database schema in sync
Strategies:
• All db changes done via script
• Scripts are numbered
• Database knows what numbers it already has
Tools:
• homespun scripts
• DbDeploy http://dbdeploy.com/
• Liquibase http://www.liquibase.org/
Development Platforms
Development Platforms
19
Requirements:
• Safe area "sandpit" for developers to work
• All software as-live
• Isolated
Task Tracking
Task Tracking
21
Once called ’bug tracking’.
We can track what status everything is in.
Task Tracking
21
Once called ’bug tracking’.
We can track what status everything is in.
Developers understand bug trackers, bug trackers understand yourworkflow .
Workflow
22
Complete
Verify
Active
SprintBacklog
Blocked
Task Tracking Tools
23
• Pivotal Tracker http://www.pivotaltracker.com/
• GreenHopperhttp://www.atlassian.com/software/greenhopper/
• Trac http://trac.edgewall.org/
Automated Testing
25
How do you test a website
?
26
How do you test a website
repeatedly
?
Automated Testing
27
Gives repeatable results
TDD Test-Driven Development
BDD Behaviour-Driven Development
Automated Testing Tools
28
• Selenium: browser-based record and play of tests
• Selenium IDE http://seleniumhq.org/projects/ide/
• Selenium RChttp://seleniumhq.org/projects/remote-control/
• PHPUnit: unit testing and automation
• http://phpunit.de
• Also generates code coverage graphs
My First Unit Test
29
require_once '../src/models/MathUtilModel.php' ;
class MathUtilModelTest extends PHPUnit_Framework_TestCase {public function testAddNumbersWithNumbers() {
$util = new MathUtilModel();$result = $util->addNumbers(3,5);$this->assertEquals(8, $result);
}}
Running One Test
30
To run our tests, from the tests directory do:
phpunit models/MathUtilModel
Output:
PHPUnit 3.5.13 by Sebastian Bergmann.
.
Time: 0 seconds, Memory: 3.00Mb
OK (1 test, 1 assertion)
Testable Code
31
• Testable code is clean and modular
• Need to be able to separate elements to test
• Each function does one thing
• Not too many paths through the code
• Dependencies are dangerous
Dependency Injection
32
Passing things in or looking them up.
function getData() {$db = new MyDatabaseObject();// sql and query
}
function getData($db) {// sql and query
}
Code Coverage
33
What percentage of your code is tested?
• Summary view
• Drill in to see which lines are run by tests
• Beware: 100% code coverage does not mean fully tested
Use phpunit -coverage-html and specify where PHPUnit shouldwrite the report files
Examples from http://jenkins.joind.in
Code Coverage
34
Code Coverage
35
Static Analysis
Static Analysis
37
Evaluating code without running it
Allows us to check for quality, commenting, coding standards
Static Analysis Tools
38
• PHP Code Sniffer: checks for coding standards
• http://pear.php.net/PHP_CodeSniffer
• PHP Mess Detector: detects ’bad smells’
• http://phpmd.org/
• PHP Lines of Code: project size, class count
• https://github.com/sebastianbergmann/phploc
phploc Sample Output (joind.in)
39
Directories: 32Files: 213
Lines of Code (LOC): 21339Cyclomatic Complexity / Lines of Code: 0.10
Comment Lines of Code (CLOC): 4908Non-Comment Lines of Code (NCLOC): 16431
Namespaces: 0Interfaces: 0Classes: 87
Abstract: 1 (1.15%)Concrete: 86 (98.85%)Average Class Length (NCLOC): 116
Methods: 532Scope:
Non-Static: 532 (100.00%)Static: 0 (0.00%)
Visibility:Public: 501 (94.17%)Non-Public: 31 (5.83%)
Average Method Length (NCLOC): 18Cyclomatic Complexity / Number of Methods: 2.91
API Documentation
40
Another form of static analysis is to generate documentation
• Commented documentation in each file, class, function
• Automatically generate into readable documents
• Tools:
• PHPDocumentor http://www.phpdoc.org/
• DocBlox http://www.docblox-project.org/
API Documentation
41
PHPCS Examples
42
Install:
pear install PHP_CodeSniffer
Run:
phpcs --standard=PEAR example.php
Examples taken from http://bit.ly/kedQrU
PHPCS Examples
43
Source code:
class recipe{
protected $_id;
public $name;
public $prep_time;
function getIngredients() {$ingredients = Ingredients::fetchAllById($this->_id);return $ingredients;
}}
PHPCS Examples
44
Sniffer output:
FILE: /home/lorna/phpcs/recipe. class .php--------------------------------------------------- --------------------FOUND 8 ERROR(S) AND 0 WARNING(S) AFFECTING 5 LINE(S)--------------------------------------------------- --------------------
2 | ERROR | Missing file doc comment3 | ERROR | Class name must begin with a capital letter3 | ERROR | Missing class doc comment6 | ERROR | Protected member variable "_id" must not be prefixed with
| | underscore12 | ERROR | Missing function doc comment12 | ERROR | Opening brace should be on a new line13 | ERROR | Line indented incorrectly; expected at least 8 sp aces, found13 | ERROR | Spaces must be used to indent lines; tabs are not al lowed
--------------------------------------------------- --------------------
Automated Deployment
Automated Deployment
46
• How many times do you deploy an agile project?
Automated Deployment
46
• How many times do you deploy an agile project?
• Fast
• Hardened
• Painless
• Repeatable
Automated Deployment Tools
47
• Phing/Ant: easy automated build scripts
• http://phing.info/
• http://ant.apache.org/
• Capistrano (or Webistrano): scripted releases (with web interface)
• https://github.com/capistrano/capistrano
Automating Deployment: Why
48
• Minimise mistakes
• Save time on each deploy
• Better than documentation
• Reliable process - use for different platforms
• Scope for rollback
Automating Deployment: What
49
• Application code
• minimal downtime or time in an inconsistent state
• easy rollback
• additional setup steps (upload files, etc) also automated
• Database
• apply database patches
• include rollback patches
• Config changes
• useful for large or complex sites
• config deploys separately, can update quickly and easily
Code Deployment
50
• Get a clean copy of code
• Place in new directory on server
• Perform any other preparation tasks
• Change symlink in web directory to point to new version
• Tools: shell script or ant/phing
Config Deployment
51
• Exactly like code deployment
• Application needs to be designed with this in mind
• Default to live config
• Environment variables set in vhost
Phing Example
52
<?xml version ="1.0" encoding= "UTF-8" ?><project name= "example" basedir= "." default ="deploy" >
<property name= "builddir" value= "./build" /><property name= "appdir" value= "./build/code" /><tstamp><format property= "date" pattern= "%Y%m%d-%H%M"/></tstamp
<target name= "deploy" depends= "clean, prepare, export, putlive"
<target name= "export" ><exec command="svn export ${repo} ${appdir}/${date}" />
</target>
<target name= "putlive" ><exec command="scp -r ${appdir}/${date} ${destination}
> ${builddir}/logs/scp.log" /></target>
Phing Example Cont’d
53
<target name= "clean" ><delete dir= "${builddir}" />
</target>
<target name= "prepare" ><mkdir dir= "${builddir}" /><mkdir dir= "${builddir}/logs" />
</target></project>
Phing can also handle upload directories, database versioning, otherdeployment recipe steps and post deploy tasks
Continuous Integration
Continuous Integration
55
The glue that holds everything together!
• Source control commit triggers:
• Static analysis tools
• Automated tests
• Document generation
• CI system centralises:
• Deployment (to various platforms)
• Other tasks, cron jobs
• Centralised dashboard and reporting
Continuous Integration Tools
56
• Jenkins (née Hudson)
• http://jenkins-ci.org/
• PHPUnderControl (PHP-specific CruiseControl project)
• http://phpundercontrol.org/
Tool Up Your LAMP Stack
The Main Ingredients for LAMP
58
Preparation time: some years
Ingredients:
• Source control
• Development platforms
• Task tracking
• Automated testing
• Static analysis
• Automated deployment
• Continuous integration
Questions?
Image Credits
61
• LAMP http://www.flickr.com/photos/sewpixie/2059308961
• Sandpithttp://www.flickr.com/photos/giltastic/3159081924