Continuous DeliveryOle Christian Rynning & Stein Inge MorisbakRoots 2011
https://github.com/bekkopen/roots2011-continuous-delivery
AgendaWho are we, where do we come from and what do we work on?What does Continuous Delivery really mean?Collaboration, Version Control and Continuous Integration.Controlled deploymentZero-down-time redeploy (and roll-back).Robust applications (architecture)Provisioning of Infrastructure for Continuous Delivery.Error handling, Monitoring and health verification.Migrating databases.Summary, organizational impacts and business value.
Stein IngeMorisbakInformation Science, University of Bergen10 years +Operator (≈ 2)Consultant (≈ 5)NorgesGruppen Data (≈ 6)Many roles:DeveloperOperatorTech leadArchitectAgile/Tech coachManager
DigipostNational service for digital mail.Replacement for physical box.PostenNorge AS.Launched april 4th.Java.13 developers on the team.I’m tech lead.Agile process.Self organizing.Continuous Delivery.Deployment of new features every week.
Ole Christian RynningMaster IT, UiO5 years +Consultant (≈ 4)Many roles:DeveloperUI DeveloperOperatorTech leadArchitectCreative Leader
Bring Development TeamBringBusiness side (B2B) of Norway PostConsists of 8 specialists (Express, Parcels, Cargo, Frigo, Mail, …)Several projectsTracking (public, B2B, APIs, mobile applications) (6 rels 2011)Mybring (reports, calculators, APIs) (2 rels 2011)Fraktguide (B2B, B2C, price quoting service) (2 rels 2011)Booking (Order products across all specialists) (42 rels 2011)Java & Ruby10 developers, 2 UX, 1/3 operators, 4 product managers, …Post-Agile processDelivers Continuously *
What does Continuous Delivery really mean?
Principles behind the Agile ManifestoWe follow these principles:Our highest priority is to satisfy the customerthrough early and continuous deliveryof valuable software.Welcome changing requirements, even late in development. Agile processes harness change for the customer's competitive advantage.Deliver working software frequently, from a couple of weeks to a couple of months, with a preference to the shorter timescale.Business people and developers must work together daily throughout the project.Build projects around motivated individuals. Give them the environment and support they need, and trust them to get the job done.The most efficient and effective method of conveying information to and within a development team is face-to-face conversation.Working software is the primary measure of progress.Agile processes promote sustainable development. The sponsors, developers, and users should be able to maintain a constant pace indefinitely.Continuous attention to technical excellence and good design enhances agility.Simplicity--the art of maximizing the amount of work not done--is essential.The best architectures, requirements, and designs emerge from self-organizing teams.At regular intervals, the team reflects on how to become more effective, then tunes and adjusts its behavior accordingly.
Our highest priority is to satisfy the customerthrough early and continuous deliveryof valuable software.
What is Continuous Delivery?Continuousdelivery is about putting thereleaseschedule in the hands ofthe business, not in the hands of IT. Implementingcontinuousdeliverymeansmaking sure yoursoftware is alwaysproductionreadythroughoutitsentirelifecycle – thatanybuildcouldpotentially be released to users at the touch of a buttonusing a fullyautomatedprocess in a matter ofseconds or minutes.- Jez Humble (http://continuousdelivery.com/)
The Big Picture
It’s all about Business ValueReduce Operational Expenditure (OPEX)Reduce manual bottlenecks Reduce overhead in communication (bust dev-qa-ops silos)Increased control over software’s life cyclesReduce Capital Expenditure (CAPEX)Increase/optimize utilization (i.e. virtualization)Reduce startup costsIncrease Customer Satisfaction (Protection)Improve usability, performance, security, requirementsRespond quicker to customer demandsIncrease brand value (Revenue)
Questions you need to answerAre you able to put new featuresinto production within a reasonable amount of time (i. e. less than a day)?You don´t have that requirement?What about bug-fixes?Would your customer be happier if she made a decision and saw it in production the same day?Would your customer be happier if you could deploy without down-time?Would you trust your deployment process more if you did it more often?Would you feel more safe if you deployed fewer features to production at a time?Would you feel more safe if you had less things that could go wrong?Would you be happy with a heavy manual deployment process if you where to release several times a week?Would operations be happier (and everyone else safer) if deployment was automated instead of documented.Would you be happier (and not so lonely) if you could deploy during work hours instead of in the middle of the night?Are you able to roll-back (alternatively roll forward) if deployment fails?
Lean for Software Development
The ChallengeHow long would it take your organization to deploy a change that involves just one single line of code?Do you do this on a repeatable reliable basis?- Mary and Tom Poppendieck
Conway’s law...organizations which design systems [...] are constrained to produce designs which are copies of the communication structures of these organizations- Melvin Conway, 1968www.melconway.com/research/committees.html
An Agile team
Continuous Delivery teamTrust and collaboration.Transparent (big visible displays, demos and retrospects).Releases driven by business needs and fast feedback.Fearless (config. mgmt., automated testing at all levels, CI)Disciplined (don’t break/bend the rules)Self sufficient and cross-functional (devs, customers, testers, ops, dbas)Rehearses deployment and roll back.Everybody is responsible for delivery.Everyone can self-service deployments.Continuously improving automation speed (fast build etc.) The team is continuously improving.
Continuous ImprovementA self organizing team is like evolution, only with a shorter time span.In biological systems self-organization is a process in which pattern at the global level of a system emerges solely from numerous interactions among the lower-level components of the system. Moreover, the rules specifying interactions among the system's components are executed using only local information, without reference to the global pattern. (Wikipedia)You must improve!Process.Build quality in (don’t waste time on mass inspection).You must become better!Skills.You must learn!Try things you don’t know the outcome from.Fail fast.If it hurts, do it more often, and bring the pain forward.
Robust Applications / Architecture
Open Source == Less bugs
But! That is not my stack!Not all technologiesareeasy to workwithwhenimplementingContinuous Delivery.Whatstackareyou (forced to be) using?Knoweachdependency in anystackWhy is it there?Whatdoes it do?Whytheversion?
Nightmare ArchitectsIvory Tower ArchitectsStrives towards higher levels of abstractions portable across platforms and systems. (Believes there is a single “the Solution” to architecture).Loves boxes and straight arrows.May code frameworks that future projects have to use*Usually won’t listen to neither developers nor users / customers.More detrimental to any Enterprise than they will ever realize.Tell-tales:	“Use JSF on all web-applications”.“You haven’t used all eight layers that our guidelines prescribe”.“OK. As long as it is Oracle/IBM”.“Everything has to go through the service bus”.“All applications should follow <title of 500 page guideline document>”.
Ah well. I agreebut…How to handle transition?Gainexpertise (you’rehere, right).Picking up newtechnologies or tools is work.Prove it!Knowhow to handle sceptics.Look for win-winsituations and synergyeffects.Teardown silos. (Communication, collaboration, connectivity).Make it compelling and getpublicity.Improveyour soft skills.Go aroundthem (NB!)Ignore the Irrational
Target the Willing
Harness the Converted
Convince ManagementMy kind of ArchitectPragmatic ArchitectsCodes or are at least highly able to jump into code.Uses foresight, but truly believes that architectures are grown (incrementally) and constantly thinks about the dynamic nature of changing architecture.Accepts that there is no “one solution”.Does not hesitate to change an abstraction if it does not fit.Tell-tales:“The ESB is too slow for handling this load, use the endpoint directly”.“Have you considered a SoftReference there in order to not OOM?”.“Set a Socket Timeout on that endpoint.”.“We use <dependency> <version> because of <esoteric patch>”.“How will the servers handle the load if one node dies?”.
Be Cynical with architecture.Whatever you do not test against, WILL happen.Assume all Integration Points will go down, congest, return corrupt data, incomplete data, be slow, …Assume all low-level connections (pools, concurrency, …) will at sometime fail.Assume your application will die. Know your application’s life cycle, and failure modesKeep environments as equal as possible.Attack environment-based configuration with vigor.
Choose automatable TechnologyUse an embedded container. (Executable jar with war)No need to deploy, just start and stop. Trivial to setup.Full control over the JVM.Easy to automate.Easy to post-mortem (kill -3 <pid>)Some containers that work:JettyNetty / Grizzly Glassfish (at least before Oracle)See: https://github.com/bekkopen/jetty-pkg
Understand Application/ Failure modesTraditional (UNIX) application Life cyclesstart, stop, status, reload Use pidfiles, locksApplication-critical life cyclesgraceful-stop/drain, set-read-onlySupport inspection of application state (status)health-check, session-status, build version, active feature toggles, configurationSupport quick inspection of failed applicationsthread-dump (kill -3), backup-db, log-backup
Understand (and automate) Application Life CyclesUnderstand logging concernsOperation/application status events (errors) - AUTOMATEBusiness events/Audit events (warn)Debugging events (info, debug, …)Keep configuration minimalSeparate environment and application configuration*Keep environment configuration to an absolute minimumKnow your hardware limitationsIf one of four balanced nodes die, and the nodes are 50% utilized. The load on a single node will be significant (66% utilized). If another dies the system is on the edge.
Longevity: Impulse and StrainImpulses (Stress)ChristmasGetting SlashdottedAnnual settlement adding 100 million transactions to a queueCounter: Heavy load tests, Fallback switchesStrain (Longevity)Memory leakage and consumptionData growthDying connections / low levelCounter: Timeouts, Fallbacks
Continuous IntegrationRun against develop branch.Clone builds for long-lived branches.Automate testing (against a production like environment).Unit tests, integration tests, system tests, performance tests, security tests,(functional acceptance tests)…Keep the build fast.Unit tests, integration tests, slow tests.Deploy the latest executable to a repository (Nexus, Artifactory)Visibility (Lava lamps, monitors, air strike alarm…, e-mail)Automate deployment.See: http://martinfowler.com/articles/continuousIntegration.html
Safety measures (Continuously run)Fail fastBuildMetricsSystem testsEnvironment testsIntegration testsApplication tests
MetricsWhat do you want to measure?Test coverage?Lines of code?Code metrics?Checkstyle violations?Do you automate metrics and create reports (e. g. Sonar)?How often do you look at those reports?Alternative: Automate and break the build if you violate your rules.
Continuous Deployment (Push)PushInvokeInvokePullPull/Push
Continuous Deployment (Pull)PullPushInvokeInvokePullPull/Push
When to push and when to pull?Push:Allows anyone to push.Automated.Caller configures server.Easier?Pull:Initiated by authorized caller.Same artifact is pulled to different environments.Server configures itself.Safer?Vague difference:Push -> Pull: Server requests a push.Pull -> Push: Sshand issue pull command.
Version Control in Teams
What is Version Control?A repository ofcontent.Access to historicaleditionsofeach datum.A log of all changes.A toolthatmanages and tracks different versionsofsoftware or othercontent.
Version Control for Continuous DeliveryKeep (almost) everything in version control!WiP must be separated from code in production.Hot-fixes must happen on code in production.Release branches prevent freezes and delays.Avoid big scary merges.
From this ……to this
Work in Progress (WiP)F1F2F3F4F5F6F7F8F9F10Time
We have to separate WiP from production ready codeExtra production releaseMasterInitial production versionNext production releaseNext production releaseBug!MergeFixDevelopF1F2F3F4F5F6F7F8F9F9Oh no!Release plan 1Release plan 2Release plan 3
Git – Create development branch$ git checkout -b developSwitched to a new branch ”develop"
We have to detach features from the release plansTimeMasterInitial production versionNext production releaseNext production releaseBig bug!!FixDevelopF1F4F8Feature branchesF2F5F7F10F3F6F9
Git – Feature branchesCreate:$ git checkout -b <id>_<description>Switched to a new branch "<id>_<description>”Merge:$ git checkout developSwitched to branch ’develop'$ git merge --no-ff <id>_<description>Updating ea1b82a..05e9557(Summary of changes)$ git push origin developDelete:$ git branch -d <id>_<description>Deleted branch <id>_<description>
We have to detach hot-fixes from production and developExtra production releaseExtra production releaseExtra production releaseMasterInitial production versionNext production releaseNext production releaseBig bug!!!Big bug-fixHot-fix branches!2!1DevelopF8F4F1Feature branchesF7F10F5F2F6F9F3
Git – Hot-fix branchesCreate:$ git checkout -b hot-fix-<version>-<id>_<description>Switched to a new branch "hot-fix-<version>-<id>_<description>”Commit:git commit -m ”<message>"[hot-fix-<version>-<id>_<description> abbe5d6] <message>5 files changed, 32 insertions(+), 17 deletions(-)
Git – Hot-fix branches -> merge and deploy$ git checkout masterSwitched to branch 'master'$ git merge --no-ffhot-fix-<version>-<id>_<description>Merge made by recursive.(Summary of changes)$ mvn clean release:prepare$ mvn clean release:perform -Dgoals=deploy$ mvn clean deploy$ git checkout developSwitched to branch ’develop'$ git merge --no-ffhot-fix-<version>-<id>_<description>Merge made by recursive.(Summary of changes)$ git branch -d hot-fix-<version>-<id>_<description>Deleted branch hot-fix-<version>-<id>_<description> (was ff452fe).
Code freezes, testing, preparation … - Release branchesMasterInitial production versionNext production releaseNext production releaseNext production release!Fix!Hot-fix branchesRelease 2Release 3Release 1Release branchesDevelopF8F4F1Feature branchesF7F10F5F2F6F9F3
Git – release branchesCreate:$ git checkout -b release-<version> developSwitched to a new branch "release-<version>”Commit:git commit -m ”<message>"[release-<version> abbe5d6] <message>5 files changed, 32 insertions(+), 17 deletions(-)
Git – release branches -> merge and deploy$ git checkout masterSwitched to branch 'master'$ git merge --no-ff release-<version>Merge made by recursive.(Summary of changes)$ mvn clean release:prepare$ mvn clean release:perform -Dgoals=deploy$ mvn clean deploy$ git checkout developSwitched to branch ’develop'$ git merge --no-ffrelease-<version>Merge made by recursive.(Summary of changes)$ git branch -d release-<version>Deleted branch release-<version> (was ff452fe).
Feature branching vs. Continuous IntegrationFeature 1BIG SCARY MERGEFeature 2Feature 1OKFeature 2
Avoiding the Big Scary MergeThe problem with continuous integration:Potentially unfinished features in mainline.Hence you can not deploy whenever you want.The Digipost project:13 developers.uses feature branching and releases to production every week.have never had serious merge problems.Keep your features small!Improve the features iteratively.You can check in unfinished features (!)As long as it doesn’t compromise the rest of the system.Use feature toggles.
Feature togglesfeature_toggles.propertiesmail.enabled=truesms.enabled=falsesend_message.jsp<toggle name=mail.enabled>	. mail UI elements</toggle>SmsService.java...booleansmsEnabled;	if (smsEnabled) {sendSms();	}...Have a common strategy/framework.Configuration in one place.Toggle in as few places as possible.Avoid polluting your code.
Error handling, Monitoring and health verfication.
GET /application/healthbring-shipment-number          [OK]bring-messagebroker      [OK]bring-freightguide-postal-code [OK]nets-epayment     [OK]bring-freightguide       [OK]bring-label-generator          [OK]bring-label-repository         [OK]Version: 1.4.4Build:   0b33b727908Node:    <censored>.bd.bring.no
How?package no.bring.booking.operations;public interface HealthCheckable {    Health healthCheck();}
Sample VOpackage no.bring.booking.operations;public class Health {    final String name;    final Boolean status;    public Health(String name, Boolean status) {this.name = name;this.status = status;    }}
Example implementationclass ShipmentNumberClient implements HealthCheckable {  // initialized from environment cfg  private final String healthCheckUri;  // ...  @Override  public Health healthCheck() {    return new Health("bring-shipment-number", isHealthy());  }  private booleanisHealthy() {    try {Client client = HttpClientFactory.createTimingoutClient(2000);WebResourcewebResource = client.resource(healthCheckUri);return fromStatusCode(webResource.head().getStatus()) == OK;} catch (Exception ignored) {return false;}}
Build informationMaven: buildnumber-maven-pluginGenerates ${buildNumber}Can generate timestamp and other build infoMaven: git-commit-id-pluginGenerates various git metadata. Such as ${git.commit.id}Date: ${maven.build.timestamp}For another example: http://www.blog.project13.pl/index.php/fun/1174/release-maven-git-commit-id-plugin/
Controlled deploymentZero-down-time redeploy(and roll-back).
Tool Chain For Setting up ArchitectureSystem configurationCloud/VMOS InstallApplication Service DeploymentScriptingFabricCapistranoMCollectiveControlTierGo-----------------PuppetChefCfengine-----------------KickstartJumpstartSolaris LiveUpdatetftp…
Switch environments
Switch environments
Drain nodes
Drain nodes
Next? A/B?
Migrating databases.
Not impossible, but still difficultPractice, practice, practice.Fail fast.Bring the pain forward.Refactor the DB.Deploy with confidence.
Summary, organizational impact and business value.

Continuous Delivery

  • 1.
    Continuous DeliveryOle ChristianRynning & Stein Inge MorisbakRoots 2011
  • 2.
  • 3.
    AgendaWho are we,where do we come from and what do we work on?What does Continuous Delivery really mean?Collaboration, Version Control and Continuous Integration.Controlled deploymentZero-down-time redeploy (and roll-back).Robust applications (architecture)Provisioning of Infrastructure for Continuous Delivery.Error handling, Monitoring and health verification.Migrating databases.Summary, organizational impacts and business value.
  • 4.
    Stein IngeMorisbakInformation Science,University of Bergen10 years +Operator (≈ 2)Consultant (≈ 5)NorgesGruppen Data (≈ 6)Many roles:DeveloperOperatorTech leadArchitectAgile/Tech coachManager
  • 5.
    DigipostNational service fordigital mail.Replacement for physical box.PostenNorge AS.Launched april 4th.Java.13 developers on the team.I’m tech lead.Agile process.Self organizing.Continuous Delivery.Deployment of new features every week.
  • 6.
    Ole Christian RynningMasterIT, UiO5 years +Consultant (≈ 4)Many roles:DeveloperUI DeveloperOperatorTech leadArchitectCreative Leader
  • 7.
    Bring Development TeamBringBusinessside (B2B) of Norway PostConsists of 8 specialists (Express, Parcels, Cargo, Frigo, Mail, …)Several projectsTracking (public, B2B, APIs, mobile applications) (6 rels 2011)Mybring (reports, calculators, APIs) (2 rels 2011)Fraktguide (B2B, B2C, price quoting service) (2 rels 2011)Booking (Order products across all specialists) (42 rels 2011)Java & Ruby10 developers, 2 UX, 1/3 operators, 4 product managers, …Post-Agile processDelivers Continuously *
  • 8.
    What does ContinuousDelivery really mean?
  • 10.
    Principles behind theAgile ManifestoWe follow these principles:Our highest priority is to satisfy the customerthrough early and continuous deliveryof valuable software.Welcome changing requirements, even late in development. Agile processes harness change for the customer's competitive advantage.Deliver working software frequently, from a couple of weeks to a couple of months, with a preference to the shorter timescale.Business people and developers must work together daily throughout the project.Build projects around motivated individuals. Give them the environment and support they need, and trust them to get the job done.The most efficient and effective method of conveying information to and within a development team is face-to-face conversation.Working software is the primary measure of progress.Agile processes promote sustainable development. The sponsors, developers, and users should be able to maintain a constant pace indefinitely.Continuous attention to technical excellence and good design enhances agility.Simplicity--the art of maximizing the amount of work not done--is essential.The best architectures, requirements, and designs emerge from self-organizing teams.At regular intervals, the team reflects on how to become more effective, then tunes and adjusts its behavior accordingly.
  • 11.
    Our highest priorityis to satisfy the customerthrough early and continuous deliveryof valuable software.
  • 12.
    What is ContinuousDelivery?Continuousdelivery is about putting thereleaseschedule in the hands ofthe business, not in the hands of IT. Implementingcontinuousdeliverymeansmaking sure yoursoftware is alwaysproductionreadythroughoutitsentirelifecycle – thatanybuildcouldpotentially be released to users at the touch of a buttonusing a fullyautomatedprocess in a matter ofseconds or minutes.- Jez Humble (http://continuousdelivery.com/)
  • 13.
  • 14.
    It’s all aboutBusiness ValueReduce Operational Expenditure (OPEX)Reduce manual bottlenecks Reduce overhead in communication (bust dev-qa-ops silos)Increased control over software’s life cyclesReduce Capital Expenditure (CAPEX)Increase/optimize utilization (i.e. virtualization)Reduce startup costsIncrease Customer Satisfaction (Protection)Improve usability, performance, security, requirementsRespond quicker to customer demandsIncrease brand value (Revenue)
  • 15.
    Questions you needto answerAre you able to put new featuresinto production within a reasonable amount of time (i. e. less than a day)?You don´t have that requirement?What about bug-fixes?Would your customer be happier if she made a decision and saw it in production the same day?Would your customer be happier if you could deploy without down-time?Would you trust your deployment process more if you did it more often?Would you feel more safe if you deployed fewer features to production at a time?Would you feel more safe if you had less things that could go wrong?Would you be happy with a heavy manual deployment process if you where to release several times a week?Would operations be happier (and everyone else safer) if deployment was automated instead of documented.Would you be happier (and not so lonely) if you could deploy during work hours instead of in the middle of the night?Are you able to roll-back (alternatively roll forward) if deployment fails?
  • 16.
  • 17.
    The ChallengeHow longwould it take your organization to deploy a change that involves just one single line of code?Do you do this on a repeatable reliable basis?- Mary and Tom Poppendieck
  • 18.
    Conway’s law...organizations whichdesign systems [...] are constrained to produce designs which are copies of the communication structures of these organizations- Melvin Conway, 1968www.melconway.com/research/committees.html
  • 19.
  • 20.
    Continuous Delivery teamTrustand collaboration.Transparent (big visible displays, demos and retrospects).Releases driven by business needs and fast feedback.Fearless (config. mgmt., automated testing at all levels, CI)Disciplined (don’t break/bend the rules)Self sufficient and cross-functional (devs, customers, testers, ops, dbas)Rehearses deployment and roll back.Everybody is responsible for delivery.Everyone can self-service deployments.Continuously improving automation speed (fast build etc.) The team is continuously improving.
  • 21.
    Continuous ImprovementA selforganizing team is like evolution, only with a shorter time span.In biological systems self-organization is a process in which pattern at the global level of a system emerges solely from numerous interactions among the lower-level components of the system. Moreover, the rules specifying interactions among the system's components are executed using only local information, without reference to the global pattern. (Wikipedia)You must improve!Process.Build quality in (don’t waste time on mass inspection).You must become better!Skills.You must learn!Try things you don’t know the outcome from.Fail fast.If it hurts, do it more often, and bring the pain forward.
  • 22.
  • 23.
  • 24.
    But! That isnot my stack!Not all technologiesareeasy to workwithwhenimplementingContinuous Delivery.Whatstackareyou (forced to be) using?Knoweachdependency in anystackWhy is it there?Whatdoes it do?Whytheversion?
  • 25.
    Nightmare ArchitectsIvory TowerArchitectsStrives towards higher levels of abstractions portable across platforms and systems. (Believes there is a single “the Solution” to architecture).Loves boxes and straight arrows.May code frameworks that future projects have to use*Usually won’t listen to neither developers nor users / customers.More detrimental to any Enterprise than they will ever realize.Tell-tales: “Use JSF on all web-applications”.“You haven’t used all eight layers that our guidelines prescribe”.“OK. As long as it is Oracle/IBM”.“Everything has to go through the service bus”.“All applications should follow <title of 500 page guideline document>”.
  • 26.
    Ah well. Iagreebut…How to handle transition?Gainexpertise (you’rehere, right).Picking up newtechnologies or tools is work.Prove it!Knowhow to handle sceptics.Look for win-winsituations and synergyeffects.Teardown silos. (Communication, collaboration, connectivity).Make it compelling and getpublicity.Improveyour soft skills.Go aroundthem (NB!)Ignore the Irrational
  • 27.
  • 28.
  • 29.
    Convince ManagementMy kindof ArchitectPragmatic ArchitectsCodes or are at least highly able to jump into code.Uses foresight, but truly believes that architectures are grown (incrementally) and constantly thinks about the dynamic nature of changing architecture.Accepts that there is no “one solution”.Does not hesitate to change an abstraction if it does not fit.Tell-tales:“The ESB is too slow for handling this load, use the endpoint directly”.“Have you considered a SoftReference there in order to not OOM?”.“Set a Socket Timeout on that endpoint.”.“We use <dependency> <version> because of <esoteric patch>”.“How will the servers handle the load if one node dies?”.
  • 30.
    Be Cynical witharchitecture.Whatever you do not test against, WILL happen.Assume all Integration Points will go down, congest, return corrupt data, incomplete data, be slow, …Assume all low-level connections (pools, concurrency, …) will at sometime fail.Assume your application will die. Know your application’s life cycle, and failure modesKeep environments as equal as possible.Attack environment-based configuration with vigor.
  • 31.
    Choose automatable TechnologyUsean embedded container. (Executable jar with war)No need to deploy, just start and stop. Trivial to setup.Full control over the JVM.Easy to automate.Easy to post-mortem (kill -3 <pid>)Some containers that work:JettyNetty / Grizzly Glassfish (at least before Oracle)See: https://github.com/bekkopen/jetty-pkg
  • 32.
    Understand Application/ FailuremodesTraditional (UNIX) application Life cyclesstart, stop, status, reload Use pidfiles, locksApplication-critical life cyclesgraceful-stop/drain, set-read-onlySupport inspection of application state (status)health-check, session-status, build version, active feature toggles, configurationSupport quick inspection of failed applicationsthread-dump (kill -3), backup-db, log-backup
  • 33.
    Understand (and automate)Application Life CyclesUnderstand logging concernsOperation/application status events (errors) - AUTOMATEBusiness events/Audit events (warn)Debugging events (info, debug, …)Keep configuration minimalSeparate environment and application configuration*Keep environment configuration to an absolute minimumKnow your hardware limitationsIf one of four balanced nodes die, and the nodes are 50% utilized. The load on a single node will be significant (66% utilized). If another dies the system is on the edge.
  • 34.
    Longevity: Impulse andStrainImpulses (Stress)ChristmasGetting SlashdottedAnnual settlement adding 100 million transactions to a queueCounter: Heavy load tests, Fallback switchesStrain (Longevity)Memory leakage and consumptionData growthDying connections / low levelCounter: Timeouts, Fallbacks
  • 35.
    Continuous IntegrationRun againstdevelop branch.Clone builds for long-lived branches.Automate testing (against a production like environment).Unit tests, integration tests, system tests, performance tests, security tests,(functional acceptance tests)…Keep the build fast.Unit tests, integration tests, slow tests.Deploy the latest executable to a repository (Nexus, Artifactory)Visibility (Lava lamps, monitors, air strike alarm…, e-mail)Automate deployment.See: http://martinfowler.com/articles/continuousIntegration.html
  • 36.
    Safety measures (Continuouslyrun)Fail fastBuildMetricsSystem testsEnvironment testsIntegration testsApplication tests
  • 37.
    MetricsWhat do youwant to measure?Test coverage?Lines of code?Code metrics?Checkstyle violations?Do you automate metrics and create reports (e. g. Sonar)?How often do you look at those reports?Alternative: Automate and break the build if you violate your rules.
  • 38.
  • 39.
  • 40.
    When to pushand when to pull?Push:Allows anyone to push.Automated.Caller configures server.Easier?Pull:Initiated by authorized caller.Same artifact is pulled to different environments.Server configures itself.Safer?Vague difference:Push -> Pull: Server requests a push.Pull -> Push: Sshand issue pull command.
  • 41.
  • 42.
    What is VersionControl?A repository ofcontent.Access to historicaleditionsofeach datum.A log of all changes.A toolthatmanages and tracks different versionsofsoftware or othercontent.
  • 43.
    Version Control forContinuous DeliveryKeep (almost) everything in version control!WiP must be separated from code in production.Hot-fixes must happen on code in production.Release branches prevent freezes and delays.Avoid big scary merges.
  • 44.
  • 45.
    Work in Progress(WiP)F1F2F3F4F5F6F7F8F9F10Time
  • 46.
    We have toseparate WiP from production ready codeExtra production releaseMasterInitial production versionNext production releaseNext production releaseBug!MergeFixDevelopF1F2F3F4F5F6F7F8F9F9Oh no!Release plan 1Release plan 2Release plan 3
  • 47.
    Git – Createdevelopment branch$ git checkout -b developSwitched to a new branch ”develop"
  • 48.
    We have todetach features from the release plansTimeMasterInitial production versionNext production releaseNext production releaseBig bug!!FixDevelopF1F4F8Feature branchesF2F5F7F10F3F6F9
  • 49.
    Git – FeaturebranchesCreate:$ git checkout -b <id>_<description>Switched to a new branch "<id>_<description>”Merge:$ git checkout developSwitched to branch ’develop'$ git merge --no-ff <id>_<description>Updating ea1b82a..05e9557(Summary of changes)$ git push origin developDelete:$ git branch -d <id>_<description>Deleted branch <id>_<description>
  • 50.
    We have todetach hot-fixes from production and developExtra production releaseExtra production releaseExtra production releaseMasterInitial production versionNext production releaseNext production releaseBig bug!!!Big bug-fixHot-fix branches!2!1DevelopF8F4F1Feature branchesF7F10F5F2F6F9F3
  • 51.
    Git – Hot-fixbranchesCreate:$ git checkout -b hot-fix-<version>-<id>_<description>Switched to a new branch "hot-fix-<version>-<id>_<description>”Commit:git commit -m ”<message>"[hot-fix-<version>-<id>_<description> abbe5d6] <message>5 files changed, 32 insertions(+), 17 deletions(-)
  • 52.
    Git – Hot-fixbranches -> merge and deploy$ git checkout masterSwitched to branch 'master'$ git merge --no-ffhot-fix-<version>-<id>_<description>Merge made by recursive.(Summary of changes)$ mvn clean release:prepare$ mvn clean release:perform -Dgoals=deploy$ mvn clean deploy$ git checkout developSwitched to branch ’develop'$ git merge --no-ffhot-fix-<version>-<id>_<description>Merge made by recursive.(Summary of changes)$ git branch -d hot-fix-<version>-<id>_<description>Deleted branch hot-fix-<version>-<id>_<description> (was ff452fe).
  • 53.
    Code freezes, testing,preparation … - Release branchesMasterInitial production versionNext production releaseNext production releaseNext production release!Fix!Hot-fix branchesRelease 2Release 3Release 1Release branchesDevelopF8F4F1Feature branchesF7F10F5F2F6F9F3
  • 54.
    Git – releasebranchesCreate:$ git checkout -b release-<version> developSwitched to a new branch "release-<version>”Commit:git commit -m ”<message>"[release-<version> abbe5d6] <message>5 files changed, 32 insertions(+), 17 deletions(-)
  • 55.
    Git – releasebranches -> merge and deploy$ git checkout masterSwitched to branch 'master'$ git merge --no-ff release-<version>Merge made by recursive.(Summary of changes)$ mvn clean release:prepare$ mvn clean release:perform -Dgoals=deploy$ mvn clean deploy$ git checkout developSwitched to branch ’develop'$ git merge --no-ffrelease-<version>Merge made by recursive.(Summary of changes)$ git branch -d release-<version>Deleted branch release-<version> (was ff452fe).
  • 56.
    Feature branching vs.Continuous IntegrationFeature 1BIG SCARY MERGEFeature 2Feature 1OKFeature 2
  • 57.
    Avoiding the BigScary MergeThe problem with continuous integration:Potentially unfinished features in mainline.Hence you can not deploy whenever you want.The Digipost project:13 developers.uses feature branching and releases to production every week.have never had serious merge problems.Keep your features small!Improve the features iteratively.You can check in unfinished features (!)As long as it doesn’t compromise the rest of the system.Use feature toggles.
  • 58.
    Feature togglesfeature_toggles.propertiesmail.enabled=truesms.enabled=falsesend_message.jsp<toggle name=mail.enabled> .mail UI elements</toggle>SmsService.java...booleansmsEnabled; if (smsEnabled) {sendSms(); }...Have a common strategy/framework.Configuration in one place.Toggle in as few places as possible.Avoid polluting your code.
  • 59.
    Error handling, Monitoringand health verfication.
  • 60.
    GET /application/healthbring-shipment-number [OK]bring-messagebroker [OK]bring-freightguide-postal-code [OK]nets-epayment [OK]bring-freightguide [OK]bring-label-generator [OK]bring-label-repository [OK]Version: 1.4.4Build: 0b33b727908Node: <censored>.bd.bring.no
  • 61.
    How?package no.bring.booking.operations;public interfaceHealthCheckable { Health healthCheck();}
  • 62.
    Sample VOpackage no.bring.booking.operations;publicclass Health { final String name; final Boolean status; public Health(String name, Boolean status) {this.name = name;this.status = status; }}
  • 63.
    Example implementationclass ShipmentNumberClientimplements HealthCheckable { // initialized from environment cfg private final String healthCheckUri; // ... @Override public Health healthCheck() { return new Health("bring-shipment-number", isHealthy()); } private booleanisHealthy() { try {Client client = HttpClientFactory.createTimingoutClient(2000);WebResourcewebResource = client.resource(healthCheckUri);return fromStatusCode(webResource.head().getStatus()) == OK;} catch (Exception ignored) {return false;}}
  • 64.
    Build informationMaven: buildnumber-maven-pluginGenerates${buildNumber}Can generate timestamp and other build infoMaven: git-commit-id-pluginGenerates various git metadata. Such as ${git.commit.id}Date: ${maven.build.timestamp}For another example: http://www.blog.project13.pl/index.php/fun/1174/release-maven-git-commit-id-plugin/
  • 65.
  • 66.
    Tool Chain ForSetting up ArchitectureSystem configurationCloud/VMOS InstallApplication Service DeploymentScriptingFabricCapistranoMCollectiveControlTierGo-----------------PuppetChefCfengine-----------------KickstartJumpstartSolaris LiveUpdatetftp…
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
  • 73.
    Not impossible, butstill difficultPractice, practice, practice.Fail fast.Bring the pain forward.Refactor the DB.Deploy with confidence.
  • 74.
  • 75.
    3 pillars ofContinuous DeliveryAutomationof build, test, deployment, database migrations, and infrastructurePractices, such as continuous integration, good configuration management, and testingPeople; having everyone involved in delivery work together throughout the software delivery lifecycle.
  • 76.
    Business ValueReduction ofcost (through light-weight infrastructure and simplicity).Reduction of risk (through more automation and practice).But most important:Frequent release of new software functionality.How can we benefit from releasing new functionality monthly, weekly, or even daily?How will our organization and business processes need to change??
  • 77.
    Agile/adaptive maturityContinuous deliverymay be the next big step in delivering strategic business value to clients quickly, with lower risk and possibly lower cost. However, it won’t happen unless leadership understands its potential strategic impact and the organizational adaptability necessary to implement it.- Jim HighsmithMany organizations are stuck at Agile 101.the rule-based approach to agile (do this, don’t do that).a necessary first step towards becoming agile, but it’s only a first step.The next step is to embrace change and respond respectively.the entire organization, both delivery teams and management.embrace the process changes required to respond rapidly.engage in the collaboration required between development and operations.embrace an adaptive, exploratory mindset.
  • 78.
    Referenceshttp://continuousdelivery.com/ (Jez Humble)http://pragprog.com/titles/mnee/release-it(Michael T. Nygard)http://martinfowler.com/articles/continuousIntegration.htmlhttp://nvie.com/posts/a-successful-git-branching-model/http://progit.org/book/
  • 79.
    License & CopyrightstuffImages used are either fair use (book covers, Star Wars), public domain or Creative Commons BY-SA licensed.All content in this presentation is Creative Commons BY-SA 2.0. Please credit Ole Christian and Stein Ingeif you decide to use the slides.
  • 80.
  • 82.
    Stein Inge MorisbakOleChristian RynningDeveloper, TechnologyCreative leader, Technology+47 909 64 372+47 982 19 347stein.inge.morisbak@BEKK.noole.chr.rynning@BEKK.no@steinim@olecrhttp://open.bekk.no/

Editor's Notes

  • #4 09:00 - 09:45: Intro, fortelleomprosjektenevåreogossselv, organisasjonnele ting, hvorfor CD?09:55 - 10:40: Intro tilutviklings-stack (VCS CI, nexus) oghvordanvelge en egnetapplikasjonsarkitektur (Jetty, Maven/Gradle/Rake)10:50 - 12:00: Health-check, monitoring, error handling, avoiding leakage between environments(Prod/test). Provisioning of infrastructure (Puppet).13:30 - 14:00: Controlled deployment, Zero-downtime-redeploy. Daytime deployment.14:10 - 15:00: Advanced topics: db without downtime. Wrap up.Tekniskoppsett:* Referanseappsomkjøreri Jetty med nginx for session drain.* Puppet image.* Nexus, Jenkins, Sonar
  • #9 1) Innledning- Vi stiller spørsmåltilsalen: Hvoroftedeployererdere? Hardereautomatisertdeployering? - Continuous Delivery vs. CI / CD(eployment), Agile manifest, etc- Automatisering - Viktighetavåvelgeautomatiserbarteknologi, etc- Like miljøer- Gjenproduserbarhet, osv
  • #15 Opex: Typical
  • #19 Hence: co-locate or get a proper communication structure between operations and development…
  • #20 Cross-functionalCustomer on-siteSelf sufficientDev-opsSelf organizingTrust
  • #21 Trust must be earned
  • #23 1) Innledning- Vi stiller spørsmåltilsalen: Hvoroftedeployererdere? Hardereautomatisertdeployering? - Continuous Delivery vs. CI / CD(eployment), Agile manifest, etc- Automatisering - Viktighetavåvelgeautomatiserbarteknologi, etc- Like miljøer- Gjenproduserbarhet, osv
  • #24 Eksempelprosjekt:Behov: * En server somkankjøre to-fire ulikevirtuelleservereForslagtilmiljøstack:* Frontend: nginxeller apache* Applikasjon: se under* Database: mysqlellerpostgresql* Automatisert med puppetEnkel CRUD-webapp med litt basis-funksjonalitet* Integrasjon mot eksterntgrensesnitt (f.eks. Bring Fraktguide // postnummervalidering, etc).* Forslagtilenkel stack: Spring(opsjonellt), Spring JDBC, et webrammeverk (Jersey eller Spring MVC), * Deployesienkel jetty-war* Littrammeverkskode for konfigurasjon / init-scriptInteraktive features:* Feature toggle: Slåav / på JSON-grensesnitt* Feature branch: Utvidegrensesnitt med XML-supportEndring 1: Slåpåstylesheet, css, etc
  • #26 * Usually don’t code
  • #37 Push vs. pull –basert deploymentKonfigureringavmiljø: Jenkins? Nexus (pull)?
  • #38 Push vs. pull –basert deploymentKonfigureringavmiljø: Jenkins? Nexus (pull)?
  • #40 3) Jobbing/Samarbeiditeamet(ne) ogkontinuerligintegrasjon- Innledning: versjonskontrollavprosjektet. Feature branching. Feature toggling. Littomteamsammensetninger: deployeselv, vs. ha en devoppåteamet, etc. Innledningtileksempelprosjektet.- Spm: Hvor mange har en drifter påteamet? Hvor mange brukergit? Hvor mange brukerclearcase? Hvor mange haransvar for ålevere? Hvor mange mener at man erferdignår man leverertil QA? Hvor mange harforretningsutvikling? Kanban? ITIL (UFF)?- Vi demonstrereroppsettav en applikasjoni et gittutviklingsmiljø:* Versjonskontroll for kontinuerlig levering* Byggserversomkjører tester ogdeployertil nexus* Applikasjonsoppsett med maven/rake/etc (applikasjonskonfigurasjon)* environment:setup (klargjøringav server for applikasjonen)- Muliginteraksjon: Vi girhvert team en enkeloppgave (f.eks. team 1 skalendre en kodelinjeog en test, team 2 skalslåpå en feature, team 3 skal merge inn en feature-branch i master/release, ...)
  • #44 Code base is never production ready!When to release?WIP hinders us from putting ready features into productionWe are never done done!
  • #45 What happens if you forget to merge the bug fix into development?What happens if features are delayed?
  • #46 Grey arrows: Potentially shippable
  • #47 Rember to merge back to develop!
  • #48 Release branches frees up the development branch for further development.It also frees up the master branch for bugfixes.
  • #58 - Innledning: Kortinnledningomhvorfordeterviktigåogsåautomatisereverifisering (isåstor grad somdetermulig)- Events vs. logging- Vi demonstrerernoenteknikker for åverifisere at applikasjoneneri god helse (GET http://node/health, GET http://node/version, logger feil =&gt;...)- Enkeleksternovervåkningav http://app/health- Enkelnagios-monitoreringavmiljø- Eks: cucumber-nagios* Feilscenarie 1: Vi demonstrerer en applikasjonsfeilsomskjeri runtime (f.eks. DB-fuckup somkræsjerapplikasjonen) =&gt; (ERROR fraovervåkning) red - vi demonstereropprettelseavfiks, test for åhindreframtidigfeilog redeploy =&gt; green* Feilscenarie 2: Vi demonstrerer en brukerfeilsomskjeri runtime =&gt; red (ERROR iloggen) (f.eks. manglendevalideringoghvordandetteplukkesoppav log-monitorering) - vi demonsterermuligfiks, mer robust test for åhindreframtidigfeil, og redeploy =&gt; green
  • #64 - Innledning: Vi fortellerom et par ulikemuligeløsninger, vi fortellerom de ulikestegene en applikasjonkanfeilei (bygg, test, release, upload, stop, start, verify (health), runtime). Littomsesjonerog draining avsesjoner (ta en node ned -&gt; vent tilallesesjonererferdige -&gt; fortsett redeploy).- Demonstrasjon: Vi deployerernyversjon (uten DB-endring) til de ulikemiljøene* environment:deploy (utrullingtilservere - push - med venting ogverifiseringavstegenei upload, stop, start, verify)* puppet / environment:update (utrullingtilservere - pull fra nexus - med manuellhåndteringav deploy tilnoderogevt. switchover strategi /f.eks. switche QA og PROD)- Muliginteraksjon: Teamene pusher sine endringerog vi demonstrererautomatisertkontinuerligutrullingav de ulikeversjonenesomblelageti 3)
  • #71 - Innledning: vanskeligheter. It depends! Vanskeligereåautomatisere- Vi demonstrererautomatisering med liquibaseogf.eks. dbdeploy.- Vi demonstrerer expand/contract patternet for DB-migrering.- Vi demonstrerer read-only-state for systemet.
  • #73 - Littomorganisasjonellekravogutfordringer, f.eks. Lean / Kanban / JIT / etc, ITIL, eksternedriftere, etc...- Littmeromverdien (fåutforretningsverdi, fåned lead time, fånedantallfeili prod, fiksefeil, prodsettepådagtid, sikkerhet
  • #76 Jim HighsmithThoughtWorksco-author the Agile Manifestoco-founded the Agile Alliance, and the Agile Project Leadership Network.