Sitecore Continuous Integration, part 1

Usually during standard process of development you would have several environments like DEV, QA, UAT/STAGING and so on. The more environments you have – the more cases and differences in deployment you will need to implement. In this post I would try to describe how you could simplify your life implementing CI for Sitecore based projects.

Almost immediately you would face a question of content synchronizations. There are a lot of options that you could use:

  • Content Package – the most obvious variant one could come up with however you cannot automate it out of the box. Automation of content packages deployment is quite complex task as you need invent versioning for them, need to store in them in VCS.
  • Unicorn project – solution based on content serialization. You will need to integrate some event handlers on content changes in order to keep sitecore serialization folder up to date. It will allow you to update content via http call from CI as well.
  • Hedgehog TDS – this is an extension to Visual Studio that does a lot more that just serialization. You could merge content, sync from VS generate code based on templates and so on. With CI it could be integrates quite easily as you just need to build project with specific setting.
  • Database project – more or less standard variant when it came to DB sync, but with Sitecore it would not work as good as expected. You will not have any control of sync of sitecore items and after some period of time it will be extremely long operation especially if you have some media items in DB.
    From my practice TDS – is the most useful tools, but it is not free so you need to decide for yourself.

Moreover, when it comes to users and role synchronization – none of this tools will, except DB project (but I would not recommend it due to reasons above). To solve this issue I’ve come up with several pipelines that could be started on Sitecore init and check roles needed or even create them. The most suitable place for this operation is initialize pipeline.
Processor implementation for this pipeline is quite simple – we just chech and create roles if the do not exist (see gist below).

namespace SampleSite
{
    using System.Linq;
    using System.Web.Security;
 
    using Sitecore.Diagnostics;
    using Sitecore.Pipelines;
    using Sitecore.Security.Accounts;
 
    public class RolesInitializer
    {
        public const string ContentContentEditorRole = @"sitecore\sample_content_editor";
 
        private const string SitecoreAuthorRole = @"sitecore\Author";
 
        private const string SitecoreClientPublishingRole = @"sitecore\Sitecore Client Publishing";
 
        private const string SitecoreDesignerRole = @"sitecore\Designer";
 
        public virtual void Process(PipelineArgs args)
        {
            Assert.ArgumentNotNull(args, "args");
 
            Assert.IsTrue(Role.Exists(SitecoreAuthorRole), SitecoreAuthorRole + " is missing");
            Assert.IsTrue(Role.Exists(SitecoreDesignerRole), SitecoreDesignerRole + " is missing");
            Assert.IsTrue(Role.Exists(SitecoreClientPublishingRole), SitecoreClientPublishingRole + " is missing");
 
            this.CreateRole(ContentContentEditorRole, SitecoreDesignerRole, SitecoreAuthorRole, SitecoreClientPublishingRole);
        }
 
        protected virtual void CreateRole(string name, params string[] args)
        {
            // check & create content_editor role
            if (!Role.Exists(name))
            {
                Roles.CreateRole(name);
            }
 
            if (args != null && args.Length > 0)
            {
                foreach (var s in args.Where(s => !RolesInRolesManager.IsRoleInRole(Role.FromName(name), Role.FromName(s), false)))
                {
                    RolesInRolesManager.AddRoleToRole(Role.FromName(name), Role.FromName(s));
                }
            }
        }
    }
}
<pipelines>
  <initialize>
    ...
    <processor type="SampleSite.RolesInitializer, SampleSite">
    <processor type="SampleSite.UsersInitializer, SampleSite">
    ...
  </initialize>
</pipelines>

Users creation is little bit more complex and require different configurations for each environment. To do this you will need transforms for include configurations. I will describe tools and approach in following articles.

Sitecore Continuous Integration, part 1

One thought on “Sitecore Continuous Integration, part 1

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s