First Section:
Continuous Delivery as a software engineering approach.
(This is beneficial for Project Managers, DEVs & QAs.)
1. Projects Case Studies to explain why you should adopt Continuous Delivery.
2. Advantages & Reasons for releasing software more frequently.
3. How to make a Reliable / Production Ready Software.
4. Ingredients of Continues Delivery.
5. Tools/ approaches to choose while using Continues Delivery Methodology.
Second Section:
Technical side of Continuous Delivery.
(This is more beneficial for DEVs/ QAs than Project Managers.)
1. Testing a Software.
2. Measuring Code Quality / Analytic to visualize teams performances.
3. Tools: Code Syntax Checker, Testing Framework, Build Automation, Automated Reporting/ Analytic Dashboard.
4. Continuous Delivery Automation over Cloud using Travis CI - Live demonstration.
Third Section:
1. Sample Projects for audience to adopt right tools for development, testing & deployments.
2. Q&A.
-------------------------------------------------
By Waqar Alamgir http://waqaralamgir.tk
8. 1. Build the right thing
Eric Ries, “The Lean Startup” http://bit.ly/8ZoX5F
Customer
development
Agile product
development
Releasing Frequently
9. Do Less
“Far More than 50% of functionality in
the Software is never or rarely used.
Many are no value features.”
10. • Create hypothesis
• Deliver minimum viable product
• Get feedback (repeat)
Eric Ries, “The Lean Startup” http://bit.ly/8ZoX5F
Data
Ideas
BuildLearn
Scientific Method
Measure
Code
11. “How long would it take your
organization to deploy a change that
involved just one single line of code? Do
you do this on a repeatable, reliable
basis?”
Mary and Tom Poppendieck, Implementing Lean Software Development, p59.
Ask this Question
12. 1. build the right thing
2. reduce risk of release
John Allspaw: “Ops Metametrics”http://slidesha.re/dsSZIr
Releasing Frequently
14. Mean Time
Between Failures
Mean Time
Restore Service
John Allspaw: “Building Resilience in Web Development and Operations”
http://www.usievents.com/en/conferences/8-paris-usi-2011/sessions/968-john-allspaw
Optimize for MTRS
15. 1. build the right thing
2. reduce risk of release
3. real project progress
Releasing Frequently
18. Our highest priority is to satisfy
the customer through early and
continuous delivery of valuable
software
Agile Manifesto
19. Software always be production ready.
Releases tied to business needs, not operational
constraints.
Continuous Delivery
20. Fast, automated feedback on
the production readiness of
your applications every time
there is a change - to code,
infrastructure, or configuration
Production-ready Software
24. “Cease dependence on
mass inspection to
achieve quality.
Improve the process
and build quality into
the product in the first
place”
W. Edwards Deming
Build quality
26. an automated implementation of your
system’s build, deploy, test, release process
visibility
feedback
control
Deployment pipeline
27. Delivery team Version control Build & unit
tests
Automated
acceptance tests
User acceptance
tests
Release
Check in
Feedback
Trigger
Check in
Feedback
Trigger
Trigger
Check in
Trigger
Trigger
Approval
Approval
Feedback
Feedback
Feedback
Feedback
Deployment Pipeline
28. Why?
• Easier to test
• Easier to measure
• Easier to follow
• Streamlines the development process
Code Quality
When someone doesn’t follow the coding style guidelines
29. • PEAR coding standard -
http://pear.php.net/manual/en/standards.php
• PEAR2 coding standard -
http://pear.php.net/manual/en/pear2cs.rules.
php
• PHP Standards Working Group -
http://groups.google.com/group/php-
standards
Measuring Code Quality
30. • Use an indent of 4 spaces, with no tabs.
• Control Structures:
<?php
if ((condition1) || (condition2)) {
action1;
} elseif ((condition3) && (condition4)) {
action2;
} else {
defaultAction;
}
?>
PEAR Coding Standard
31. • Broad
• Strict, but flexible
• Based on a “standard” standard
• Everyone must follow
Custom Standards
32. "tokenises your PHP, JavaScript and CSS files and
detects violations of a defined set of coding
standards“
http://pear.php.net/package/PHP_CodeSniffer
• PEAR package
• Single file or entire directory
• Preset and customizable
PHP_CodeSniffer
33. $ phpcs /myDir/myFile.php
FILE: /myDir/myFile.php
--------------------------------------------------------------------------------
FOUND 3 ERROR(S) AFFECTING 3 LINE(S)
--------------------------------------------------------------------------------
2 | ERROR | Missing file doc comment
20 | ERROR | PHP keywords must be lowercase;
expected "false" but found "FALSE"
47 | ERROR | Line not indented correctly;
expected 4 spaces but found 1
--------------------------------------------------------------------------------
Output
34. • Unit - the smallest piece of testable code
within my application or script.
• Unit test - a piece of code that executes the
unit and then evaluates the result returned.
Unit Tests
35. • Make sure the unit is small enough so the test
is testing a single function.
• Make sure the test is efficient enough to run
repeatedly, perhaps even a thousand times a
day.
• Make sure the tests do not depend on each
other. Each test should be able to run
completely separately from other tests.
Tips
36. function validateName($name) {
if ((strlen($name) > 1) && (strlen($name) < 50)) {
if (ctype_alpha(str_replace(array(" ",",","-","'"),"",$name))) {
return true;
}
else {
return false;
}
}
else {
return false;
}
}
assert(validateName("Beth's Test Name"));
38. • Standardize test format
• Easily run tests
• Analyze results
Testing Frameworks
39. PHPUnit - http://www.phpunit.de
Pros:
• Good documentation
• Lots of examples online
• Integrates with many other popular tools and
platforms
Cons:
• Command line only
41. Selenium - http://seleniumhq.org/
Pros:
• Can test front-end functionality
• Selenium-WebDriver (makes direct calls to the
browser using each browser’s native support
for automation)
Cons:
• Not a native PHP tool, but bindings are
available from several third-parties
42. • Perform a DB query to update the schema,
clear a cache, upload files, run cron tasks, etc.
Automate The Build
43. Phing - http://phing.info
• PHP project build system
• Based on Apache Ant
• XML build files and PHP "task" classes
• Integrates with both PHPUnit and SimpleTest
as well as phpDocumentor
• Platform independent
• No required external dependencies
45. Maven - http://maven.apache.org
• Supports Ant tasks
• Large library of third-party plug-ins to
integrate other continuous integration tools
• Helps shield you from the details of the build
• For Java-based projects, so you’ll need Maven
for PHP: http://www.php-maven.org/
47. Capistrano File:
set :application, "yii_blog" #Edit your app name
set :repo_url, "https://github.com/waqar-alamgir/yii-capistrano.git" # EDIT your git repository
if ENV['user']
set :repo_url, "https://" + ENV['user'] + "@github.com/waqar-alamgir/yii-capistrano.git" # EDIT your git repository
end
set :deploy_to, "/var/www/html/yii-capistrano/" # EDIT folder where files should be deployed to
set :scm, "git"
set :branch, ENV['branch'] || "master"
namespace :deploy do
# Writing permissions to /protected/runtime/ and /assets/
desc "Restart"
after :updated, :build do
on roles(:app) do
within release_path do
execute :chmod, "-R 777 #{release_path}/protected/runtime/"
execute :chmod, "-R 777 #{release_path}/assets/"
end
end
end
# Copy yii configuration files /protected/config/
desc "Copy config file"
after :updated, :build do
on roles(:all) do |host|
%w[ yii-config/main.php , yii-config/console.php ].each do |f|
upload! "" + f , "#{release_path}/protected/config/" + f
end
end
end
# Run yii database migrations
desc "Build"
after :updated, :build do
on roles(:app) do
within release_path do
execute :php, "#{release_path}/protected/yiic migrate --interactive=0"
end
end
end
end
https://github.com/waqar-alamgir/yii-capistrano
49. http://stackoverflow.com/questions/1310050/php-function-comments/3823007#3823007
/**
* Does something interesting
*
* @param Place $where Where something interesting takes place
* @param integer $repeat How many times something interesting should happen
*
* @throws Some_Exception_Class If something interesting cannot happen
* @author Waqar Alamgir <bonjour@waqaralamgir.t>
* @return Status
*/
/**
* Short description for class
*
* Long description for class (if any)...
*
* @copyright 2016 Zend Technologies
* @license http://www.zend.com/license/3_0.txt PHP License 7.0
* @version Release: @package_version@
* @link http://dev.zend.com/package/PackageName
* @since Class available since Release 1.2.0
*/
50.
51.
52. Technical Debt
Assigns a technical debt value
• The debt
• The cost to reimburse
• The work to reimburse
• The breakdown
When the technical debt unrolls
53. 1. Email plugin
Sends a build status email.
2. Lint plugin/ Php parallel lint plugin
This plugin runs PHP's built in Lint (syntax / error check) functionality.
Similar to the standard PHP Lint plugin, except that it uses the PHP Parallel Lint project to run.
3. Pdepend plugin
Runs PDepend software metrics.
4. PHP Code Sniffer plugin
Runs PHP Code Sniffer against your build.
5. Php copy paste detector plugin
Runs PHP Copy / Paste Detector against your build.
6. PHP Docblock Checker
Runs the PHP Docblock Checker against your build. This tool verifies that all classes and methods have
docblocks.
7. Php loc plugin
Runs PHPLoc against your project and records some key metrics.
8. Php mess detector plugin
Runs PHP Mess Detector against your build. Records some key metrics, and also reports errors and warnings.
9. PhpUnit Plugin
Runs PHPUnit tests against your build.
10. Technical Debt Plugin
Checks all files in your project for TODOs and other technical debt.
54. • Cruise Control
• Hudson / Jenkins
• PHP CI
• Travis CI
Continuous Integration Tools
56. • Project is small, budget is small…
• Evaluate which tools are worthwhile to your
specific project.
Yes, But…
57. • Consider including unit tests or code
cost/coverage reports in your deliverables to
your customers as an added value to them
(and you down the road).
Make It a Deliverable
58. Project:
A customer hires you to create a registration
form for a one-time event. It’s a small
customer with a small budget. It should take a
couple hundred lines of code in a single file,
results will be e-mailed. It will be tested by the
event staff and the marketing department on
the live site as they do not have a test
environment, and it will only be live for two
months.
59. What they need:
1. If they do not have an in-house standard for
you to follow, write it using one of the main
coding standards, like PEAR.
2. Create unit tests for it.
What they don’t need:
1. In-depth reporting
2. Full automation, including build.
3. Documentation
60. Project:
A customer hires you for an ongoing project. On
the 15th of every month, they need you to go
in and add a new survey to collect data and
write it to a database. The previous month’s
survey data needs to be backed up and
cleared out of the database when the new
survey goes live.
61. What they need:
1. If they do not have an in-house standard for
you to follow, write it using one of the main
coding standards, like PEAR.
2. Create unit tests for it and use a testing
framework.
3. Automate the build.
What they don’t need:
1. In-depth reporting (Maybe)
2. Documentation (Maybe)
62. Project:
A customer hires you to write one part of a very
large application. Other consultants that you
do not have access to will be working on other
parts of the application at the same time.
63. What they need:
1. All of it
In this situation, see if you can convince them to
get everyone working on a unified
continuous integration platform utilizing a
complete suite of continuous integration
tools from standards to documentation and
fully automated everywhere in between.
64. Not everything is beneficial
enough to use in every
situation, so choose the right
tools for your project and
needs.
Take Away #1
65. The fewer steps I have to
remember to do manually, the
more successful my project will
be.
Take Away #2
66. release ! = deployment
No builds. No change. No upgrades. Is it read-only Day?
NAH! NOT NECESSARILY
Take Away #3
67. [featureToggles]
wobblyFoobars: true
flightyForkHandles: false
Config File
<?if ($wobblyFoobars) {?>
... various UI elements
<?}?>
some.php
$fork_handle = ($featureConfig->isOn(‘flightlyForkHandles‘)) ?
new flightyForkHander(aCandle) :
new forkHandler(aCandle);
other.php
Stolen from Martin Fowler http://martinfowler.com/bliki/FeatureToggle.html
Feature Toggles