Tool up your lamp stack
- 2. About Me
• Lorna Mitchell
• Web Development Consultant
• Speaker and Author
• Website: http://lornajane.net
• Twitter: @lornajane
2
- 4. LAMP
• Linux
• Apache
• MySQL
• PHP (or Perl, or Python)
4
- 10. Technology
• We need good tools
• They enable our workflow
• They facilitate our achievements
8
- 11. Technology
• We need good tools
• They enable our workflow
• They facilitate our achievements
• They allow us to meet our deadlines
8
- 12. Technology
• 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)
8
- 14. The Main Ingredients
Preparation time: some years
Ingredients:
• Source control
• Development platforms
• Task tracking
• Automated testing
• Static analysis
• Automated deployment
• Continuous integration
10
- 16. Source Control: Key Ingredient
• Central, canonical version
• Collaboration point
• Historical information
• what changed
• when
• by whom
• Can include its own config
12
- 17. Source Control Tools
• Subversion http://subversion.apache.org/
• Git http://git-scm.com/
• Mercurial http://mercurial.selenic.com/
13
- 21. Database Version Control
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/
17
- 26. Task Tracking
Once called ’bug tracking’.
We can track what status everything is in.
Developers understand bug trackers, bug trackers understand your
workflow.
21
- 27. Workflow
Backlog Sprint
Active
Blocked Verify
Complete
22
- 28. Task Tracking Tools
• Pivotal Tracker http://www.pivotaltracker.com/
• GreenHopper
http://www.atlassian.com/software/greenhopper/
• Trac http://trac.edgewall.org/
23
- 33. Automated Testing Tools
• Selenium: browser-based record and play of tests
• Selenium IDE http://seleniumhq.org/projects/ide/
• Selenium RC
http://seleniumhq.org/projects/remote-control/
• PHPUnit: unit testing and automation
• http://phpunit.de
• Also generates code coverage graphs
28
- 34. My First Unit Test
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);
}
}
29
- 35. Running One Test
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)
30
- 36. Testable Code
• 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
31
- 37. Dependency Injection
Passing things in or looking them up.
function getData() {
$db = new MyDatabaseObject();
// sql and query
}
function getData($db) {
// sql and query
}
32
- 38. Code Coverage
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 should
write the report files
Examples from http://jenkins.joind.in
33
- 43. Static Analysis Tools
• 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
38
- 44. phploc Sample Output (joind.in)
Directories: 32
Files: 213
Lines of Code (LOC): 21339
Cyclomatic Complexity / Lines of Code: 0.10
Comment Lines of Code (CLOC): 4908
Non-Comment Lines of Code (NCLOC): 16431
Namespaces: 0
Interfaces: 0
Classes: 87
Abstract: 1 (1.15%)
Concrete: 86 (98.85%)
Average Class Length (NCLOC): 116
Methods: 532
Scope:
Non-Static: 532 (100.00%)
Static: 0 (0.00%)
Visibility:
Public: 501 (94.17%)
Non-Public: 31 (5.83%)
Average Method Length (NCLOC): 18 39
- 45. API Documentation
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/
40
- 48. PHPCS Examples
Source code:
class recipe
{
protected $_id;
public $name;
public $prep_time;
function getIngredients() {
$ingredients = Ingredients::fetchAllById($this->_id);
return $ingredients;
}
}
43
- 49. PHPCS Examples
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 comment
3 | ERROR | Class name must begin with a capital letter
3 | ERROR | Missing class doc comment
6 | ERROR | Protected member variable "_id" must not be prefixed wit
| | underscore
12 | ERROR | Missing function doc comment
12 | ERROR | Opening brace should be on a new line
13 | ERROR | Line indented incorrectly; expected at least 8 spaces, f
13 | ERROR | Spaces must be used to indent lines; tabs are not allowe
----------------------------------------------------------------------
44
- 52. Automated Deployment
• How many times do you deploy an agile project?
• Fast
• Hardened
• Painless
• Repeatable
46
- 53. Automated Deployment Tools
• 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
47
- 54. Automating Deployment: Why
• Minimise mistakes
• Save time on each deploy
• Better than documentation
• Reliable process - use for different platforms
• Scope for rollback
48
- 55. Automating Deployment: What
• 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
49
- 56. Code Deployment
• 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
50
- 57. Config Deployment
• Exactly like code deployment
• Application needs to be designed with this in mind
• Default to live config
• Environment variables set in vhost
51
- 58. Phing Example
<?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" /></tsta
<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>
52
- 59. Phing Example Cont’d
<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, other
deployment recipe steps and post deploy tasks
53
- 61. Continuous Integration
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
55
- 62. Continuous Integration Tools
• Jenkins (née Hudson)
• http://jenkins-ci.org/
• PHPUnderControl (PHP-specific CruiseControl project)
• http://phpundercontrol.org/
56
- 64. The Main Ingredients for LAMP
Preparation time: some years
Ingredients:
• Source control
• Development platforms
• Task tracking
• Automated testing
• Static analysis
• Automated deployment
• Continuous integration
58
- 67. Image Credits
• LAMP http://www.flickr.com/photos/sewpixie/2059308961
• Sandpit
http://www.flickr.com/photos/giltastic/3159081924
61