launchdarkly.com Open in urlscan Pro
199.232.194.22  Public Scan

Submitted URL: https://em.launchdarkly.com/dc/3xbM4tQLBeNyhupI5OyGyq0WYW8Q7qFLvytRMBhqz8QuX3X1Ct9VY_ozGwMyZ4F_kT-e9K1UUVYOPgZlRwbK4O0lLWZTW...
Effective URL: https://launchdarkly.com/blog/how-to-integrate-canary-releases?utm_source=marketo&utm_medium=email&utm_campaign=product-n...
Submission: On July 14 via api from US — Scanned from DE

Form analysis 2 forms found in the DOM

<form id="mktoForm_2272" novalidate="novalidate" class="mktoForm mktoHasWidth mktoLayoutLeft" style="font-family: Helvetica, Arial, sans-serif; font-size: 13px; color: rgb(51, 51, 51); width: 181px;"
  data-nb-form="3e842131-380b-4696-8b07-b776101962be">
  <style type="text/css">
    .mktoForm .mktoButtonWrap.mktoSimple .mktoButton {
      color: #fff;
      border: 1px solid #75ae4c;
      padding: 0.4em 1em;
      font-size: 1em;
      background-color: #99c47c;
      background-image: -webkit-gradient(linear, left top, left bottom, from(#99c47c), to(#75ae4c));
      background-image: -webkit-linear-gradient(top, #99c47c, #75ae4c);
      background-image: -moz-linear-gradient(top, #99c47c, #75ae4c);
      background-image: linear-gradient(to bottom, #99c47c, #75ae4c);
    }

    .mktoForm .mktoButtonWrap.mktoSimple .mktoButton:hover {
      border: 1px solid #447f19;
    }

    .mktoForm .mktoButtonWrap.mktoSimple .mktoButton:focus {
      outline: none;
      border: 1px solid #447f19;
    }

    .mktoForm .mktoButtonWrap.mktoSimple .mktoButton:active {
      background-color: #75ae4c;
      background-image: -webkit-gradient(linear, left top, left bottom, from(#75ae4c), to(#99c47c));
      background-image: -webkit-linear-gradient(top, #75ae4c, #99c47c);
      background-image: -moz-linear-gradient(top, #75ae4c, #99c47c);
      background-image: linear-gradient(to bottom, #75ae4c, #99c47c);
    }
  </style>
  <div class="mktoFormRow">
    <div class="mktoFieldDescriptor mktoFormCol">
      <div class="mktoOffset"></div>
      <div class="mktoFieldWrap mktoRequiredField"><label for="Email" id="LblEmail" class="mktoLabel mktoHasWidth">
          <div class="mktoAsterix">*</div>
        </label>
        <div class="mktoGutter mktoHasWidth"></div><input id="Email" name="Email" placeholder="Work Email" maxlength="255" aria-labelledby="LblEmail InstructEmail" type="email" class="mktoField mktoEmailField mktoHasWidth mktoRequired"
          aria-required="true" data-nb-id="3e842131-380b-4696-8b07-b776101962be"><span id="InstructEmail" tabindex="-1" class="mktoInstruction"></span>
        <div class="mktoClear"></div>
      </div>
      <div class="mktoClear"></div>
    </div>
    <div class="mktoClear"></div>
  </div>
  <div class="mktoFormRow"><input type="hidden" name="LeadSource" class="mktoField mktoFieldDescriptor mktoFormCol" value="Website">
    <div class="mktoClear"></div>
  </div>
  <div class="mktoFormRow"><input type="hidden" name="ltutmcampaign" class="mktoField mktoFieldDescriptor mktoFormCol" value="product-newsletter">
    <div class="mktoClear"></div>
  </div>
  <div class="mktoFormRow"><input type="hidden" name="ltutmcontent" class="mktoField mktoFieldDescriptor mktoFormCol" value="null">
    <div class="mktoClear"></div>
  </div>
  <div class="mktoFormRow"><input type="hidden" name="ltutmmedium" class="mktoField mktoFieldDescriptor mktoFormCol" value="email">
    <div class="mktoClear"></div>
  </div>
  <div class="mktoFormRow"><input type="hidden" name="ltutmsource" class="mktoField mktoFieldDescriptor mktoFormCol" value="marketo">
    <div class="mktoClear"></div>
  </div>
  <div class="mktoFormRow"><input type="hidden" name="ltutmterm" class="mktoField mktoFieldDescriptor mktoFormCol" value="txt">
    <div class="mktoClear"></div>
  </div>
  <div class="mktoButtonRow"><span class="mktoButtonWrap mktoSimple"><button type="submit" class="mktoButton">Yes, send me emails</button></span></div><input type="hidden" name="formid" class="mktoField mktoFieldDescriptor" value="2272"><input
    type="hidden" name="munchkinId" class="mktoField mktoFieldDescriptor" value="850-KKH-319">
</form>

<form novalidate="novalidate" class="mktoForm mktoHasWidth mktoLayoutLeft" style="font-family: Helvetica, Arial, sans-serif; font-size: 13px; color: rgb(51, 51, 51); visibility: hidden; position: absolute; top: -500px; left: -1000px; width: 1600px;">
</form>

Text Content

Powered by Cookiebot
 * Consent
 * Details
 * [#IABV2SETTINGS#]
 * About


THIS WEBSITE USES COOKIES

We use cookies to personalise content and ads, to provide social media features
and to analyse our traffic. We also share information about your use of our site
with our social media, advertising and analytics partners who may combine it
with other information that you’ve provided to them or that they’ve collected
from your use of their services.
Consent Selection
Necessary

Preferences

Statistics

Marketing

Show details
Necessary 24

Necessary cookies help make a website usable by enabling basic functions like
page navigation and access to secure areas of the website. The website cannot
function properly without these cookies.
Adelphic
1
Learn more about this provider
cuUsed to detect if the visitor has accepted the marketing category in the
cookie banner. This cookie is necessary for GDPR-compliance of the website.
Expiry: 1 yearType: HTTP
Airtable
8
Learn more about this provider
__Host-airtable-sessionContains a specific ID for the current session. This is
necessary for running the website correctly.
Expiry: 1 yearType: HTTP
__Host-airtable-session.sigContains a specific ID for the current session. This
is necessary for running the website correctly.
Expiry: 1 yearType: HTTP
AWSELBCORSRegisters which server-cluster is serving the visitor. This is used in
context with load balancing, in order to optimize user experience.
Expiry: SessionType: HTTP
brwDetects and logs potential errors on third-party provided functions on the
website.
Expiry: 1 yearType: HTTP
lightstep/clock_state/lightstep.airtable.comNecessary for the website's booking
functionality.
Expiry: SessionType: HTML
mvMaintains website settings across multiple visits.
Expiry: 1 dayType: HTTP
AWSALBRegisters which server-cluster is serving the visitor. This is used in
context with load balancing, in order to optimize user experience.
Expiry: 7 daysType: HTTP
AWSALBCORSRegisters which server-cluster is serving the visitor. This is used in
context with load balancing, in order to optimize user experience.
Expiry: 6 daysType: HTTP
Cookiebot
1
Learn more about this provider
CookieConsentStores the user's cookie consent state for the current domain
Expiry: 1 yearType: HTTP
Google
5
Learn more about this provider
test_cookieUsed to check if the user's browser supports cookies.
Expiry: 1 dayType: HTTP
_GRECAPTCHAThis cookie is used to distinguish between humans and bots. This is
beneficial for the website, in order to make valid reports on the use of their
website.
Expiry: 179 daysType: HTTP
rc::aThis cookie is used to distinguish between humans and bots. This is
beneficial for the website, in order to make valid reports on the use of their
website.
Expiry: PersistentType: HTML
rc::bThis cookie is used to distinguish between humans and bots.
Expiry: SessionType: HTML
rc::cThis cookie is used to distinguish between humans and bots.
Expiry: SessionType: HTML
LaunchDarkly
1
Learn more about this provider
_ce.cchStores the user's cookie consent state for the current domain
Expiry: SessionType: HTTP
LinkedIn
1
Learn more about this provider
li_gcStores the user's cookie consent state for the current domain
Expiry: 2 yearsType: HTTP
New Relic
1
Learn more about this provider
JSESSIONIDPreserves users states across page requests.
Expiry: SessionType: HTTP
YouTube
1
Learn more about this provider
CONSENTUsed to detect if the visitor has accepted the marketing category in the
cookie banner. This cookie is necessary for GDPR-compliance of the website.
Expiry: 2 yearsType: HTTP
app-sj31.marketo.com
launchdarkly.com

2
BIGipServer# [x2]Used to distribute traffic to the website on several servers in
order to optimise response times.
Expiry: SessionType: HTTP
app-sj31.marketo.com
launchdarkly.com
vimeo.com

3
__cf_bm [x3]This cookie is used to distinguish between humans and bots. This is
beneficial for the website, in order to make valid reports on the use of their
website.
Expiry: 1 dayType: HTTP
Preferences 7

Preference cookies enable a website to remember information that changes the way
the website behaves or looks, like your preferred language or the region that
you are in.
Bizible
1
Learn more about this provider
_biz_flagsAThis cookie serves multiple purposes; it determines whether the user
has submitted any forms, performed cross-domain migration or has made any
tracking opt-out choices.
Expiry: 1 yearType: HTTP
LaunchDarkly
2
Learn more about this provider
@@scroll#Pending
Expiry: SessionType: HTML
keyval-store#keyvalUsed to maintain visitors' preferences throughout the visit
and sub-pages.
Expiry: PersistentType: IDB
LinkedIn
2
Learn more about this provider
lang [x2]Remembers the user's selected language version of a website
Expiry: SessionType: HTTP
Wistia
2
Learn more about this provider
loglevelMaintains settings and outputs when using the Developer Tools Console on
current session.
Expiry: PersistentType: HTML
wistia-video-progress-#Contains a timestamp for the website’s video-content.
This allows the user to resume watching without having to start over, if the
user leaves the video or website.
Expiry: PersistentType: HTML
Statistics 29

Statistic cookies help website owners to understand how visitors interact with
websites by collecting and reporting information anonymously.
Adobe
1
Learn more about this provider
uCollects data on the user's visits to the website, such as the number of
visits, average time spent on the website and what pages have been loaded with
the purpose of generating reports for optimising the website content.
Expiry: SessionType: Pixel
Bizible
1
Learn more about this provider
m/uCollects data on the user’s navigation and behavior on the website. This is
used to compile statistical reports and heatmaps for the website owner.
Expiry: SessionType: Pixel
Cvent
1
Learn more about this provider
_dd_sRegisters the website's speed and performance. This function can be used in
context with statistics and load-balancing.
Expiry: 1 dayType: HTTP
Google
4
Learn more about this provider
_gaRegisters a unique ID that is used to generate statistical data on how the
visitor uses the website.
Expiry: 2 yearsType: HTTP
_ga_#Used by Google Analytics to collect data on the number of times a user has
visited the website as well as dates for the first and most recent visit.
Expiry: 2 yearsType: HTTP
_gatUsed by Google Analytics to throttle request rate
Expiry: 1 dayType: HTTP
_gidRegisters a unique ID that is used to generate statistical data on how the
visitor uses the website.
Expiry: 1 dayType: HTTP
LaunchDarkly
14
Learn more about this provider
_ce.gtldHolds which URL should be presented to the visitor when visiting the
site.
Expiry: SessionType: HTTP
_clckCollects data on the user’s navigation and behavior on the website. This is
used to compile statistical reports and heatmaps for the website owner.
Expiry: 1 yearType: HTTP
_clskRegisters statistical data on users' behaviour on the website. Used for
internal analytics by the website operator.
Expiry: 1 dayType: HTTP
_hjAbsoluteSessionInProgressThis cookie is used to count how many times a
website has been visited by different visitors - this is done by assigning the
visitor an ID, so the visitor does not get registered twice.
Expiry: 1 dayType: HTTP
_hjFirstSeenThis cookie is used to determine if the visitor has visited the
website before, or if it is a new visitor on the website.
Expiry: 1 dayType: HTTP
_hjIncludedInPageviewSampleUsed to detect whether the user navigation and
interactions are included in the website’s data analytics.
Expiry: 1 dayType: HTTP
_hjIncludedInSessionSampleRegisters data on visitors' website-behaviour. This is
used for internal analysis and website optimization.
Expiry: 1 dayType: HTTP
_hjSession_#Collects statistics on the visitor's visits to the website, such as
the number of visits, average time spent on the website and what pages have been
read.
Expiry: 1 dayType: HTTP
_hjSessionUser_#Collects statistics on the visitor's visits to the website, such
as the number of visits, average time spent on the website and what pages have
been read.
Expiry: 1 yearType: HTTP
ajs_anonymous_idThis cookie is used to count how many times a website has been
visited by different visitors - this is done by assigning the visitor an ID, so
the visitor does not get registered twice.
Expiry: 1 yearType: HTML
amplitude_#Registers statistical data on users' behaviour on the website. Used
for internal analytics by the website operator.
Expiry: SessionType: HTTP
amplitude_unsent_#Used in context with the website’s pop-up questionnaires and
messengering. The data is used for statistical or marketing purposes.
Expiry: PersistentType: HTML
amplitude_unsent_identify_#Used in context with the website’s pop-up
questionnaires and messengering. The data is used for statistical or marketing
purposes.
Expiry: PersistentType: HTML
ubvtCollects data on the user's visits to the website, such as the number of
visits, average time spent on the website and what pages have been loaded with
the purpose of generating reports for optimising the website content.
Expiry: 2 daysType: HTTP
LinkedIn
1
Learn more about this provider
AnalyticsSyncHistoryUsed in connection with data-synchronization with
third-party analysis service.
Expiry: 29 daysType: HTTP
New Relic
2
Learn more about this provider
events/1/#Used to monitor website performance for statistical purposes.
Expiry: SessionType: Pixel
jserrors/1/#Pending
Expiry: SessionType: Pixel
Twitter Inc.
1
Learn more about this provider
personalization_idThis cookie is set by Twitter - The cookie allows the visitor
to share content from the website onto their Twitter profile.
Expiry: 2 yearsType: HTTP
Vimeo
1
Learn more about this provider
vuidCollects data on the user's visits to the website, such as which pages have
been read.
Expiry: 2 yearsType: HTTP
Wistia
2
Learn more about this provider
undefinedCollects data on visitor interaction with the website's video-content.
This data is used to make the website's video-content more relevant towards the
visitor.
Expiry: PersistentType: HTML
wistiaUsed by the website to track the visitor's use of video-content - The
cookie roots from Wistia, which provides video-software to websites.
Expiry: PersistentType: HTML
YouTube
1
Learn more about this provider
yt-player-headers-readableUsed to determine the optimal video quality based on
the visitor's device and network settings.
Expiry: PersistentType: HTML
Marketing 45

Marketing cookies are used to track visitors across websites. The intention is
to display ads that are relevant and engaging for the individual user and
thereby more valuable for publishers and third party advertisers.
Meta Platforms, Inc.
1
Learn more about this provider
_fbpUsed by Facebook to deliver a series of advertisement products such as real
time bidding from third party advertisers.
Expiry: 3 monthsType: HTTP
6sc.co
1
6suuidRegisters user behaviour and navigation on the website, and any
interaction with active campaigns. This is used for optimizing advertisement and
for efficient retargeting.
Expiry: 2 yearsType: HTTP
Adelphic
1
Learn more about this provider
ci_rtcPending
Expiry: 2 monthsType: HTTP
Bizible
5
Learn more about this provider
m/ipvRegisters user behaviour and navigation on the website, and any interaction
with active campaigns. This is used for optimizing advertisement and for
efficient retargeting.
Expiry: SessionType: Pixel
_biz_nACollects data on visitors' preferences and behaviour on the website -
This information is used make content and advertisement more relevant to the
specific visitor.
Expiry: 1 yearType: HTTP
_biz_pendingACollects data on visitors' preferences and behaviour on the website
- This information is used make content and advertisement more relevant to the
specific visitor.
Expiry: 1 yearType: HTTP
_biz_sidCollects data on visitors' preferences and behaviour on the website -
This information is used make content and advertisement more relevant to the
specific visitor.
Expiry: 1 dayType: HTTP
_biz_uidCollects data on visitors' preferences and behaviour on the website -
This information is used make content and advertisement more relevant to the
specific visitor.
Expiry: 1 yearType: HTTP
Claritas
1
Learn more about this provider
barometric[cuid]Collects data on visitors. This information is used to assign
visitors into segments, making website advertisement more efficient.
Expiry: 1 yearType: HTTP
Google
8
Learn more about this provider
IDEUsed by Google DoubleClick to register and report the website user's actions
after viewing or clicking one of the advertiser's ads with the purpose of
measuring the efficacy of an ad and to present targeted ads to the user.
Expiry: 1 yearType: HTTP
pagead/landing [x2]Collects data on visitor behaviour from multiple websites, in
order to present more relevant advertisement - This also allows the website to
limit the number of times that they are shown the same advertisement.
Expiry: SessionType: Pixel
pagead/viewthroughconversion/960335887Pending
Expiry: SessionType: Pixel
ads/ga-audiencesUsed by Google AdWords to re-engage visitors that are likely to
convert to customers based on the visitor's online behaviour across websites.
Expiry: SessionType: Pixel
pagead/1p-conversion/#Pending
Expiry: SessionType: Pixel
pagead/1p-user-list/#Tracks if the user has shown interest in specific products
or events across multiple websites and detects how the user navigates between
sites. This is used for measurement of advertisement efforts and facilitates
payment of referral-fees between websites.
Expiry: SessionType: Pixel
_gcl_auUsed by Google AdSense for experimenting with advertisement efficiency
across websites using their services.
Expiry: 3 monthsType: HTTP
LaunchDarkly
6
Learn more about this provider
__tld__Used to track visitors on multiple websites, in order to present relevant
advertisement based on the visitor's preferences.
Expiry: SessionType: HTTP
_rdt_uuidUsed to track visitors on multiple websites, in order to present
relevant advertisement based on the visitor's preferences.
Expiry: 3 monthsType: HTTP
_uetsidCollects data on visitor behaviour from multiple websites, in order to
present more relevant advertisement - This also allows the website to limit the
number of times that they are shown the same advertisement.
Expiry: 1 dayType: HTTP
_uetvidUsed to track visitors on multiple websites, in order to present relevant
advertisement based on the visitor's preferences.
Expiry: 1 yearType: HTTP
ajs_user_idCollects data on visitors' preferences and behaviour on the website -
This information is used make content and advertisement more relevant to the
specific visitor.
Expiry: PersistentType: HTML
amplitude_cookie_testDetects whether partner data synchronization is functioning
and currently running - This function sends user data between third-party
advertisement companies for the purpose of targeted advertisements.
Expiry: SessionType: HTTP
LinkedIn
4
Learn more about this provider
bcookieUsed by the social networking service, LinkedIn, for tracking the use of
embedded services.
Expiry: 2 yearsType: HTTP
bscookieUsed by the social networking service, LinkedIn, for tracking the use of
embedded services.
Expiry: 2 yearsType: HTTP
lidcUsed by the social networking service, LinkedIn, for tracking the use of
embedded services.
Expiry: 1 dayType: HTTP
UserMatchHistoryEnsures visitor browsing-security by preventing cross-site
request forgery. This cookie is essential for the security of the website and
visitor.
Expiry: 29 daysType: HTTP
Marketo
1
Learn more about this provider
_mkto_trkContains data on visitor behaviour and website interaction. This is
used in context with the email marketing service Marketo.com, which allows the
website to target visitors via email.
Expiry: 2 yearsType: HTTP
Meta Platforms, Inc.
2
Learn more about this provider
frUsed by Facebook to deliver a series of advertisement products such as real
time bidding from third party advertisers.
Expiry: 3 monthsType: HTTP
trUsed by Facebook to deliver a series of advertisement products such as real
time bidding from third party advertisers.
Expiry: SessionType: Pixel
Quora
1
Learn more about this provider
_/ad/75aa344edeef4dbfa3b3dd7cb5f40e6f/pixelCollects data on user behaviour and
interaction in order to optimize the website and make advertisement on the
website more relevant.
Expiry: SessionType: Pixel
Soundcloud
1
Learn more about this provider
WIDGET::local::assignmentsUsed by audio-platform SoundCloud to implement,
measure and improve their embedded content/service on the website - The
collection of data also includes visitors’ interaction with embedded
content/service. This can be used for statistics or marketing purposes.
Expiry: PersistentType: HTML
Twitter Inc.
3
Learn more about this provider
i/adsct [x2]The cookie is used by Twitter.com in order to determine the number
of visitors accessing the website through Twitter advertisement content.
Expiry: SessionType: Pixel
muc_adsCollects data on user behaviour and interaction in order to optimize the
website and make advertisement on the website more relevant.
Expiry: 2 yearsType: HTTP
YouTube
3
Learn more about this provider
VISITOR_INFO1_LIVETries to estimate the users' bandwidth on pages with
integrated YouTube videos.
Expiry: 179 daysType: HTTP
YSCRegisters a unique ID to keep statistics of what videos from YouTube the user
has seen.
Expiry: SessionType: HTTP
ytidb::LAST_RESULT_ENTRY_KEYStores the user's video player preferences using
embedded YouTube video
Expiry: PersistentType: HTML
b.6sc.co
1
v1/beacon/img.gifUsed in context with Account-Based-Marketing (ABM). The cookie
registers data such as IP-addresses, time spent on the website and page requests
for the visit. This is used for retargeting of multiple users rooting from the
same IP-addresses. ABM usually facilitates B2B marketing purposes.
Expiry: SessionType: Pixel
cdn.bizible.com
cdn.bizibly.com

2
_BUID [x2]Collects data on visitors' preferences and behaviour on the website -
This information is used make content and advertisement more relevant to the
specific visitor.
Expiry: 1 yearType: HTTP
j.6sc.co
4
_an_uidPresents the user with relevant content and advertisement. The service is
provided by third-party advertisement hubs, which facilitate real-time bidding
for advertisers.
Expiry: 6 daysType: HTTP
_gd_sessionCollects visitor data related to the user's visits to the website,
such as the number of visits, average time spent on the website and what pages
have been loaded, with the purpose of displaying targeted ads.
Expiry: 1 dayType: HTTP
_gd_svisitorCollects visitor data related to the user's visits to the website,
such as the number of visits, average time spent on the website and what pages
have been loaded, with the purpose of displaying targeted ads.
Expiry: 2 yearsType: HTTP
_gd_visitorCollects visitor data related to the user's visits to the website,
such as the number of visits, average time spent on the website and what pages
have been loaded, with the purpose of displaying targeted ads.
Expiry: 2 yearsType: HTTP
Unclassified 12
Unclassified cookies are cookies that we are in the process of classifying,
together with the providers of individual cookies.
Airtable
1
Learn more about this provider
internal/page_viewPending
Expiry: SessionType: Pixel
Cvent
5
Learn more about this provider
dd_cookie_test_#Pending
Expiry: 1 dayType: HTTP
eventguestside-service-sessionPending
Expiry: SessionType: HTTP
registration-1b38b19d-e697-4c72-bb50-e666089ab6e5Pending
Expiry: PersistentType: HTML
registration-34ba815c-7d88-43d4-9bd8-2f5b679254d0Pending
Expiry: PersistentType: HTML
registration-7968024f-e89a-457f-a705-83506828faafPending
Expiry: PersistentType: HTML
LaunchDarkly
4
Learn more about this provider
amplitude_id_#Pending
Expiry: 10 yearsType: HTTP
ld:#:#Pending
Expiry: PersistentType: HTML
ld:#:$diagnosticsPending
Expiry: PersistentType: HTML
ld:$anonUserIdPending
Expiry: PersistentType: HTML
js.qualified.com
2
__q_domainTestPending
Expiry: SessionType: HTTP
__q_state_BN8NXAwRcuN5KnVdPending
Expiry: 10 yearsType: HTTP
Cross-domain consent[#BULK_CONSENT_DOMAINS_COUNT#] [#BULK_CONSENT_TITLE#]
List of domains your consent applies to: [#BULK_CONSENT_DOMAINS#]
Cookie declaration last updated on 02.07.22 by Cookiebot


[#IABV2_TITLE#]

[#IABV2_BODY_INTRO#]
[#IABV2_BODY_LEGITIMATE_INTEREST_INTRO#]
[#IABV2_BODY_PREFERENCE_INTRO#]
[#IABV2_LABEL_PURPOSES#]
[#IABV2_BODY_PURPOSES_INTRO#]
[#IABV2_BODY_PURPOSES#]
[#IABV2_LABEL_FEATURES#]
[#IABV2_BODY_FEATURES_INTRO#]
[#IABV2_BODY_FEATURES#]
[#IABV2_LABEL_PARTNERS#]
[#IABV2_BODY_PARTNERS_INTRO#]
[#IABV2_BODY_PARTNERS#]

Cookies are small text files that can be used by websites to make a user's
experience more efficient.

The law states that we can store cookies on your device if they are strictly
necessary for the operation of this site. For all other types of cookies we need
your permission.

This site uses different types of cookies. Some cookies are placed by third
party services that appear on our pages.

You can at any time change or withdraw your consent from the Cookie Declaration
on our website.

Learn more about who we are, how you can contact us and how we process personal
data in our Privacy Policy.

Please state your consent ID and date when you contact us regarding your
consent.
[#OOI_PERSONAL_INFORMATION#]
Deny Allow selection Customize

Allow all
Powered by Cookiebot by Usercentrics
For full functionality of this site it is necessary to enable JavaScript. Here
are the instructions how to enable JavaScript in your web browser.
LaunchDarkly

Feature Management

Overview

What is feature management?What is experimentation?Why LaunchDarkly?Build vs.
buyGuide to feature management
Platform

Core Platform

Feature managementExperimentationFeature flagsFeature WorkflowsPlatform
architecture

Connectivity

SDKsAPIsIntegrationsCode References

Data

AnalyticsData Export
Solutions

Team

DevelopersDevOps & SREMobileProduct managers

Use Case

All use casesApp modernizationChange and release managementDigital
transformation

Industry

Financial servicesHealthcareU.S. government
Resources

Explore

DocsGuide & tutorialsWebinarsBlogResource center

Success Stories

Case studiesCustomers
Enterprise
Pricing
Sign InGet a Demo
LaunchDarkly BlogBlog
Best PracticesIndustry InsightsProduct UpdatesTeam & NewsPodcastsMore

Get Demo

Searching...
BEST PRACTICES


HOW TO INTEGRATE CANARY RELEASES INTO A CI/CD PIPELINE


By Tyler Charboneau   •   June 28, 2022
8 min read

Twitter

Facebook

LinkedIn

Copy Link

How to Integrate Canary Releases into a CI/CD Pipeline



Continuous integration and continuous delivery—or deployment—have become
mainstays within the DevOps pipeline. Users expect functional deployment of new
features, and developers expect these changes to keep their applications
competitive against market alternatives. Therefore, it’s critical that these
deployments are bug-free and don’t disrupt existing services.



Canary releases help avoid common problems associated with poor rollouts. These
releases place a subset of users on the version with new features or content,
while the majority of users remain on older production builds. This means that
only a minimal number of users are potentially impacted by bugs and
vulnerabilities, enabling development teams to collect useful feedback and
refine their apps accordingly. 



Keep in mind, though, that this testing environment isn’t a clone of your
production environment. It’s a sliver of your existing infrastructure and has
real-world significance. 



This article explores the ins and outs of canary releases and how to implement
them among your other CI/CD processes. 



Why Are Canary Releases Important? 



Developers and testers surveyed in 2020 found that untested or broken code
accounted for sixty percent of known software bugs. While some launches are
flawless, it can be impossible to know how new features behave until users put
them through their paces. A nightmare scenario for teams is when an outwardly
flawed application version is pushed to everyone simultaneously. Canary releases
may also help developers test revamped infrastructure deployments within which
their applications live—analyzing how user behavior impacts resource usage,
horizontal scalability, and load management. 



Canary releases progressively route more users to the updated software version
as internal confidence in it grows. Eventually, all users are migrated over and
the older version is decommissioned. Teams can rinse and repeat with other
feature updates as required. You might’ve heard this called an “incremental” or
“phased” rollout, as it happens gradually over time. While the old
infrastructure remains unused, it assumes a crucial role during fallback. If
real-world usage uncovers major issues with newer builds, you can then migrate
users backward to previous versions. 



How to Use Canary Releases 



There are numerous ways to approach canary releases, depending on your user
demographics. Large companies like Apple or Google tend to incrementally
introduce new features to users in certain regions, countries, or even cities.
These specific areas can be ideal test beds for new features (for example, 3D
map layouts and street-view capture). Companies might stage their releases based
on priority or overall roadmap. 



Another method involves the use of multiple canary builds over time, resulting
in a canary pipeline of sorts. New builds are first distributed to internal
testers, who employ automated testing, usage patterns, and unique
device-application pairings to assess functionality. Developer-side elements,
like feature toggles, can help technical teams evaluate feature readiness. Once
QA testing returns favorable results, that build is pushed live to select users.
A router and load balancer work in tandem to distribute users. A small portion
is directed to the canary release, while most user activity is centered within
an alternative version. The release package eventually migrates to this primary
build. 



You should note, though, that deploying these builds becomes challenging with
mobile or desktop apps that aren’t updated automatically. The onus is on the
user to update in situations where server-side changes aren’t possible. Static
code changes are tricky to apply reliably via manual updates; therefore, it’s
harder to gather feedback and distribute your canary releases. 



Just like it’s used for applications, canary testing can be used for web pages
and browsers. For Google Chrome and Microsoft Edge updates, developers used
flags to enable new features such as “Force Dark Mode for Web Contents” and
“Dark Mode to New Tab Page,” respectively. Active flags and toggles like these
help internal teams catch glaring issues. 



It’s preferable to push canary builds to highly trusted users, or those who
aren’t as sensitive to deployment snags. New users can be more fickle, but
long-standing users have more loyalty to an application. That’s why those who’ve
used a service for years might be more likely to receive a canary release than
newer adopters. They’re more likely to provide feedback and become involved in
the evolution of useful updates. 



Enhancing the Feedback Loop



Canary releases represent a key portion of the DevOps feedback loop. These
connected processes influence how developers, IT teams, and others within an
organization continuously function by relying on internal and external input. 



For example, let’s say that the QA team has discovered a showstopping bug within
a new feature’s code. They relay that information to their developers, who work
on a fix. A canary release allows developers to capture usage metrics, gather
direct user feedback, and determine how polished their builds (or backends) are
before approving a widespread rollout. This process happens rapidly and is
equally reliant on cultural buy-in and sound processes. That’s in stark contrast
to something like A/B testing, which may take days or even weeks to gather
useful feedback. DevOps teams can successfully monitor canary features over a
few hours—or even minutes. 



Canary releases help you build better software and improve internal operations.
If multiple issues keep sneaking into production builds, it’s clear that better
testing or automation is needed to prevent future problems. The goal of the
feedback loop is to bring software functionality level with customer
expectations. 



This is why canary testing is valuable throughout CI/CD. New code is integrated
into an existing codebase, refined with small changes, and deployed via canary
releases. Since features tend to be smaller and decoupled in the microservices
realm, they’re easier to isolate and test. Canary releases make continuous
delivery easier by facilitating realistic testing via partitioning, as opposed
to something like sandboxing. 



While security is important, it’s not the chief goal of canary testing. The real
prize is ensuring compatibility, functionality, and usability without driving
users away. 



Git Release Management



Git was introduced to streamline the process of version control for
applications. It’s ideal for both small and large deployments, which is why it
pairs well with canary-release strategies. Git helps teams control how new
deployments are pushed or rolled back in response to feature updates or known
issues, respectively. With an intermediary service that integrates with Git, you
can even determine how traffic is distributed between your general availability
(GA) and canary builds. This is a form of GitOps. 



It’s possible to tag your unique releases in Git, then create a deployment
pipeline for each. Patches are pushed automatically or manually as required.
Since canary releases live within the infrastructure networking layer, you can
leverage some sort of gateway that controls how users receive experimental
features. Once new commits are added and builds are updated, a companion service
like GitLab can help deploy those canary versions to your Kubernetes clusters.
Accordingly, Git and its components make it easy to launch canary releases
within a microservices ecosystem. 



Killing Features



Sometimes a feature release may be detrimental and require immediate revocation.
Canary releases can contain built-in feature flags that essentially act as
toggles. If a canary feature is causing problems, it’s easy for developers to
disable that flag. This is handy in a live production environment because the
application doesn’t need to restart. 



Feature flags thus function as convenient kill switches. They help preserve
uptime and reduce friction stemming from broken code. This feeds into the
validation stage of the CI/CD pipeline, in which code quality and compatibility
must be solid prior to canary promotion. 



Canary Releases vs. Blue-Green Deployments



In blue-green deployment, you simultaneously deploy two versions of an
application as user traffic is switched to the new one. Canary releases, as
noted above, are a smaller portion of your current setup provisioned for live
feature experimentation. Each approach is focused on safety and risk management.
However, canary releases can follow a node-based deployment strategy; a portion
of nodes are converted to run the canary build (say fifteen percent), and this
proportion increases in stages until one hundred percent of nodes are swapped.
Canary releases typically require fewer resources to run effectively, making
them cheaper to support. 



Additionally, DevOps teams running blue-green testing—also known as A/B
testing—gather feedback on the active environment while the other environment
remains idle. No users interact with the inactive version. A canary release
dynamically splits all traffic between two active ecosystems. 



Conclusion



Canary releases offer value both within the CI/CD pipeline and to the DevOps
world overall. The results of a canary testing session can impact validation,
testing, delivery, and deployment. Rapid feedback gathered throughout is used to
accelerate software development in a responsible manner—giving users a “preview”
of what’s to come, without making them suffer unnecessarily from bugs. 



Ready to jump-start your own canary release process? LaunchDarkly helps you
deploy experimental features to customers safely and easily. Should problems
arise, you can disable these elements and perform a rollback without needing to
manually restore older software. LaunchDarkly makes it easier to do the
following: 



* Release experimental features and measure their sales or business impacts

* Test new infrastructure without switching all traffic

* Release features for beta testing

* Release new features to VIP users first



LaunchDarkly can streamline your scaling process and make the testing and
monitoring phases of your pipeline more user-friendly. If you want to learn
more, give LaunchDarkly a try today, or explore our free demo.


By Tyler Charboneau

Twitter

Facebook

LinkedIn

Copy Link
You May Like
BEST PRACTICESTesting in Production to Stay Safe and Sensible
BEST PRACTICESWhat Is Continuous Testing? A Straightforward Introduction
JULY 14, 2022   •   BEST PRACTICESHow to Build a Release Management Process

JULY 11, 2022   •   Team & NewsReport: Why Innovative Software Delivery Starts
with Trust and Psychological Safety

JULY 7, 2022   •   BEST PRACTICESHow Experimentation Tooling Can Set You Up For
Failure

JULY 5, 2022   •   INDUSTRY INSIGHTSTech Stack Considerations for Modern
Applications



INBOXES LOVE LAUNCHDARKLY.

Make sure you get all the content, tips, and news you can use.

*










Yes, send me emails


WE EMPOWER ALL TEAMS TO DELIVER AND CONTROL THEIR SOFTWARE.

Support

 * Support Home
 * Request Support
 * Documentation
 * Status

Why Us

 * ROI of feature management
 * Trust & security
 * Implementation
 * LaunchDarkly vs. competitors
 * LaunchDarkly on AWS
 * Economic impact of LaunchDarkly

Learn

 * Case studies
 * Webinars
 * Events
 * Blog
 * Podcast
 * Trajectory
 * Galaxy

Company

 * About us
 * Careers
 * Press & media
 * Partner program
 * Terms & policies
 * Contact us
 * Foundation

©2022 Catamorphic Co.

Twitter



LinkedIn



Meetup



YouTube



LaunchDarkly BlogClose
Best PracticesIndustry InsightsProduct UpdatesTeam & NewsPodcasts