The sildes of my presentation on the Sitecore User Group Jordan meetup on April 24th 2017 and the Sitecore User Group Belarus meetup on April 27th, presenting and demoing the blue green provisioning of Sitecore into Azure using Azure Web Apps. Note that these slides do not contain the demo itself. For the demo, view the recording of the presentation or read my blog post, both accessable via https://www.robhabraken.nl
3. Familiarity of
Windows
Built on .NET, Sitecore uses
the technology that your IT
department already knows.
Infinite scalability
Easily scales up and down as
demand changes.*
Rapidly deploy Sitecore on
Azure without worrying IT.
Speed to market
The only enterprise-
grade cloud
Microsoft Azure ensures that
Sitecore® Experience
Database™ is secure.
Always on
Never miss a beat; always
be there for your customers.
Interoperability
Integrates seamlessly with
your existing back-end
systems and marketing
investments.
Accident protection
Reliable and redundant copies of your
data and automatic failover protection.
Pay-as-you-go
Only pay for the power and
capacity you’re using.*
*Customers will need to ensure the proper number of content delivery
servers from Sitecore to meet scaling requirements.
4. Virtual Machines Cloud Services Web Apps
Azure hosting options
Control Support of legacy apps Ease of management Agility
• Web Apps is the new PaaS
standard with more agility &
easier to manage
• Web Apps were previously
marketed as a SaaS solution,
but is now considered to be
PaaS
• Sitecore is using additional
SaaS services to complete the
installation
Azure Module Sitecore 8.2-1
7. • ARM (Azure Resource Manager) templates are an
Azure standard using JSON
• Delivered by Sitecore as a starting point for your own custom
provisioning
• Enables you to define one or more Azure resources including
dependencies between deployed resources
• Can be used for initial provision or as continuous deployment
• Use Web Deploy and DACPAC packages to setup site &
databases
8. The road to the ultimate Continuous Deployment setup
9. • What do we need more for a good CI/CD setup?
• How to edit and extend the provided ARM templates?
• What are the pitfalls and black holes in blue / green provisioning?
11. • Clean install per deployment, based on vanilla Sitecore install
• Keep database content and only deploy new / changed items
• Don’t disturb live site with deployment process or new content
• Option to rollback deployment upon failure
• Repeatable process, fully automated
12. Sitecore gives you handy ARM templates for the different sizings,
but they’re a head start only; you will run into some issues
• You cannot re-provision an environment, having to deploy over
an existing web app, being unable to remove files
• It doesn’t provision staging slots to deploy while keeping your
current version up & running
• It doesn’t tell you how to re-provision without overwriting your
database with content you want to keep
13. • Roll out your infrastructure first, like resource groups, databases,
hosting plans and slots
• Then, provision a vanilla Sitecore install into your staging slot
(this step includes installing databases and vanilla content)
• Then, create a repeatable re-provisioning step, provisioning a
vanilla Sitecore install into your staging slot, without databases!
(this actually wipes your staging slot each time your provision)
• Deploy your own solution over the staging slot & swap when ready
21. • Split infra and msdeploy parts, so we can re-provision!
• Use output parameters to stitch templates together
• Add staging slots (default provisioning & deployment target)
• Upgrade minimum SKU configuration to support slots
• Add a databaseless SCWDP and provision for re-provisioning
23. • The Sitecore Web Deploy Packages you can download from
Sitecore contain vanilla databases, but you don’t want them to
overwrite your own Sitecore content while re-provisioning
• You have to strip the databases from the different SCWDPs
• You can do that using msdeploy, deploying from one zip archive
(SCWDP) to another, using the skip dbFullSQL & skip dbDacFx
parameters!
24. • Get the parameters.xml file out of the SCWDP; it contains all
the info about the required parameters to deploy that package
• Invoke msdeploy with the -skip:objectName=dbFullSql and
-skip:objectName=dbDacFx parameters
• Add all additional parameters required by the specific SCWDP
25. msdeploy -verb:sync -source:package="D:DataInetpubazurexp0-singleSitecore 8.2 rev. 161221_single.scwdp.zip" -
dest:package="D:DataInetpubazurexp0-singleSitecore 8.2 rev. 161221_single-nodb.scwdp.zip" -declareparamfile="D:DataInetpubazurexp0-
singleparameters.xml" -skip:objectName=dbFullSql -skip:objectName=dbDacFx -setparam:"Sitecore Admin New Password"=“giLvgjMXG0D9CuKYKctA" -
setparam:"Core DB User Name"="single-core-sitecore-msdeploy-user" -setparam:"Core DB Password"="TWsxzkGQ5VrPT@7znJDe9NkFFtG" -setparam:"Master DB User
Name"="single-master-sitecore-msdeploy-user" -setparam:"Master DB Password"="xgMR7p6dmLYdL@7znJDe9NkFFtG" -setparam:"Web DB User Name"="single-web-
sitecore-msdeploy-user" -setparam:"Web DB Password"="B3j0tnNXVBoS6@7znJDe9NkFFtG" -setparam:"Reporting DB User Name"="single-reporting-sitecore-
msdeploy-user" -setparam:"Reporting DB Password"="0dURnXD5T93f@7znJDe9NkFFtG" -setparam:"Core Admin Connection
String"="Encrypt=True;TrustServerCertificate=False;Data Source=azure-rg-sql.database.windows.net,1433;Initial Catalog=azure-rg-core-db;User Id=xp0-
single-sql;Password=a6CmAkgOyY236ctkzsNx;" -setparam:"Core Connection String"="Encrypt=True;TrustServerCertificate=False;Data Source=azure-rg-
sql.database.windows.net,1433;Initial Catalog=azure-rg-core-db;User Id=single-core-sitecore-msdeploy-user;Password=TWsxzkGQ5VrPT@7znJDe9NkFFtG;" -
setparam:"Master Admin Connection String"="Encrypt=True;TrustServerCertificate=False;Data Source=azure-rg-sql.database.windows.net,1433;Initial
Catalog=azure-rg-master-db;User Id=xp0-single-sql;Password=a6CmAkgOyY236ctkzsNx;" -setparam:"Master Connection
String"="Encrypt=True;TrustServerCertificate=False;Data Source=azure-rg-sql.database.windows.net,1433;Initial Catalog=azure-rg-master-db;User
Id=single-master-sitecore-msdeploy-user;Password=xgMR7p6dmLYdL@7znJDe9NkFFtG;" -setparam:"Web Admin Connection
String"="Encrypt=True;TrustServerCertificate=False;Data Source=azure-rg-web-sql.database.windows.net,1433;Initial Catalog=azure-rg-web-db;User Id=xp0-
single-sql;Password=a6CmAkgOyY236ctkzsNx;" -setparam:"Web Connection String"="Encrypt=True;TrustServerCertificate=False;Data Source=azure-rg-web-
sql.database.windows.net,1433;Initial Catalog=azure-rg-web-db;User Id=single-web-sitecore-msdeploy-user;Password=B3j0tnNXVBoS6@7znJDe9NkFFtG;" -
setparam:"Reporting Admin Connection String"="Encrypt=True;TrustServerCertificate=False;Data Source=azure-rg-sql.database.windows.net,1433;Initial
Catalog=azure-rg-reporting-db;User Id=xp0-single-sql;Password=a6CmAkgOyY236ctkzsNx;" -setparam:"Reporting Connection
String"="Encrypt=True;TrustServerCertificate=False;Data Source=azure-rg-sql.database.windows.net,1433;Initial Catalog=azure-rg-reporting-db;User
Id=single-reporting-sitecore-msdeploy-user;Password=0dURnXD5T93f@7znJDe9NkFFtG;" -setparam:"Analytics Connection String"="mongodb://mlab-
azure:mM8kY7jD6JkDUykx6D2y@ds123456.mlab.com:12345/analytics" -setparam:"Tracking Live Connection String"="mongodb://mlab-
azure:mM8kY7jD6JkDUykx6D2y@ds123456.mlab.com:12345/tracking-live" -setparam:"Tracking History Connection String"="mongodb://mlab-
azure:mM8kY7jD6JkDUykx6D2y@ds123456.mlab.com:12345/analytics-history" -setparam:"Tracking Contact Connection String"="mongodb://mlab-
azure:mM8kY7jD6JkDUykx6D2y@ds123456.mlab.com:12345/tracking-contact" -setparam:"Cloud Search Connection String"="serviceUrl=https://azure-rg-
as.search.windows.net;apiVersion=2015-02-28;apiKey=A6836C6EBBA68675D558336C6EBBA686" -setparam:"Application Insights Instrumentation Key"="ecc59b93-
57eb-4c89-1264-945b2ae914f6" -setparam:"Application Insights Role"="Single" -setparam:"License XML"="." -setparam:"IP Security Client IP"="0.0.0.0" -
setparam:"IP Security Client IP Mask"="0.0.0.0"
…and it would be different for each environment & instance role!
PS: these are all fake credentials, of course ;-)
26. • The real config values don’t have to be in the target package
• Actually, you don’t want them in there:
• A package should be re-usable among environment
• For security reasons, it shouldn’t contain the actual credentials
• They would be overwritten by the ARM provisioning anyway
• Use PowerShell to automate the creation and execution of the
command, based on the parameters.xml file
29. • Re-provision using msdeploy ARM and db-less SCWDP
• Deploy to the staging slot using VSTS (for example)
• Test & warm up your new site
• Swap slots
30.
31. • Do you have custom role specific configuration
(CM/CD/REP/PRC)?
• Don’t transform them in your Solution, use cargo payloads!
• For more info on this topic, check out this article by Bas Lijten:
http://blog.baslijten.com/sitecore-on-azure-create-custom-web-
deploy-packages-using-the-sitecore-azure-toolkit/
33. • Use shared access signatures (SAS) to access your SCWDPs
• You are not allowed to publicly expose Sitecore software downloads
• You do not want to share your base install, possibly including configs
• Add IP security to all testing and acceptance environments
• You can copy IP security setup from the XP CM role
• I have added this to the XP0-single templates, using it for test mainly
• Use Azure Key Vault to store your keys and passwords
35. • Add “.scm” to resource URL or access via Portal
• Browse through files, view or edit them (debugging only!)
• Execute PowerShell
• View Processes
• Etc.
36. • EventQueue issue: the staging slot creates an extra CM role,
which could introduce concurrency issues with your production
slot CM
• Indexing: if you do blue green deployments using an extra web
database, please take in mind that your Azure Search already
updates your indexes based on the new master content!
• Content stop: if you want to avoid conflicts, content editors
should not publish during deployments (although than can
continue working on the master database); if you want to
deploy continuously, this can be a huge disturbance for editors
37.
38. • Sitecore will release a new set of ARM templates shortly,
containing a few aspects we’ve seen today, and more:
• Nested templates
• Splitting infra & application
• Module support (add-ons)
• Staging and databaseless re-provisioning? Check my repository
• Always use them as a boilerplate to create your own templates!
39. • Blog on Azure Cloud Services – deprecated!
http://sitecore.robhabraken.nl/index.php/2229/sitecore-azure/
• First blog of my series on Azure Web Apps
http://sitecore.robhabraken.nl/index.php/2407/an-introduction-to-sitecore-on-azure-web-apps/
• An comprehensive introduction to Sitecore on Azure Web Apps
https://www.robhabraken.nl/index.php/2622/sitecore-8-2-1-on-azure-web-apps/
• Automated scaling using PowerShell
https://www.robhabraken.nl/index.php/2658/saving-costs-by-scaling-down/
• One of the issues of staging on a shared master database
https://www.robhabraken.nl/index.php/2683/the-staging-slot-eventqueue-issue/
40. • Download my demo scripts & ARM templates
https://github.com/robhabraken/Sitecore-Azure-Scripts
• A blog post, including recordings of this session, will follow
shortly on my Sitecore blog https://www.robhabraken.nl/