Upload
sullis
View
1.307
Download
1
Tags:
Embed Size (px)
DESCRIPTION
Citation preview
Incremental deployment of new features
Sean Sullivan Portland Java User Group
January 17, 2012
• Gilt Groupe
• International Shipping project
• Incremental deployment
Gilt Groupe
online retailer
venture backed company
May 2011
What does Gilt sell?
Apparel
Home furnishings
Food
Local deals
Travel
Gilt HQ
Gilt Portland
International Shipping
November 2011
Project goals
• allow Gilt’s customers to ship merchandise worldwide
• display price information in customer’s preferred currency
• accept payment in customer’s preferred currency
Project goals
• legal compliance
• fraud prevention
• streamlined user experience
Technical scope
• Checkout UI
• Data model
• Order processing
• Payment processing
• Warehouse
• Finance
• Reporting
• Web analytics
• Third party integration
Checkout UI
• Ruby on Rails
• Domestic checkout only
• Java + JSP
• Domestic checkout
• International checkout
• Clear separation between UI logic and business logic
Checkout 1.0 Checkout 2.0
International Checkout
Project roadmap
1. Write code
2. Deploy to production
3. Profit!
Deploy to production?
We need a deployment strategy!
Deploy early, deploy often?
Velocity conferenceJune 2009
Dark launch?
Facebook EngineeringJuly 2009
Feature flags?
Flickr engineeringDecember 2009
Ramp up gradually?
Facebook EngineeringMay 2008
Dog food?
wikipedia.org
joelonsoftware.com
Gilt deployment strategy
1. dev team builds feature using “feature flags”
2. QA testing
3. deploy new feature to production
4. make feature available to a subset of Gilt
employees
5. make feature available to all Gilt employees
6. make feature available to a subset of
customers
7. gradually ramp up to all customers
100%
User partitions
Partition 1 Partition 2 Partition 3 Partition 1000 ...
Intelligent routing
Zeus
Checkout 1.0
Checkout 2.0
Detecting feature availability at runtime
Java API
import com.mycorp.FeatureService;
if (featureService.isFeatureEnabled(appRequest,
INTERNATIONAL_SHIPPING)) {
// do something
}
else {
// do something else
}
Custom JSP tag<%@ taglib uri="/WEB-INF/mycorp.tld" prefix="mycorp" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<c:choose>
<c:when test=”${mycorp.isFeatureEnabled(‘internationalShipping’, pageContext)}”>
International Shipping!
</c:when>
<c:otherwise>
<img src=”nyan-cat.jpg”/>
</c:otherwise>
</c:choose>
Questions?
THE END