Category Archives: ccnet plugin

How to share CCNET label across multiple projects and get incremented for each success build

There is already one post below where I have implemented this but it also increment for failure build also-

How to share CCNET label across multiple projects and get incremented for each build

Now here’s how you can stop it to increment during failure builds-
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using Exortech.NetReflector;
using ThoughtWorks.CruiseControl.Core;
using ThoughtWorks.CruiseControl.Remote;
namespace ccnet.SharedLabeller.CruiseControl.plugin
{
    [ReflectorType(“sharedLabeller”)]
    public class SharedLabeller : ILabeller
    {
        ///
        /// The path where the file that holds the shared label should be located
        ///
        /// none
        [ReflectorProperty(“sharedLabelFilePath”, Required = true)]
        public string SharedLabelFilePath { get; set; }
        ///
        /// Any string to be put in front of all labels.
        ///
        [ReflectorProperty(“prefix”, Required = false)]
        public string Prefix { get; set; }
        ///
        /// If true, the label will be incremented even if the build fails. Otherwise it will only be incremented if the build succeeds.
        ///
        [ReflectorProperty(“incrementOnFailure”, Required = false)]
        public bool IncrementOnFailure { get; set; }
        ///
        /// Allows you to set the initial build number.
        /// This will only be used when on the first build of a project, meaning that when you change this value,
        /// you’ll have to stop the CCNet service and delete the state file.
        ///
        /// 0
        [ReflectorProperty(“initialBuildLabel”, Required = false)]
        public int InitialBuildLabel { get; set; }
        public SharedLabeller()
        {
            IncrementOnFailure = false;
            InitialBuildLabel = 0;
        }
        #region ILabeller Members
        public string Generate(IIntegrationResult integrationResult)
        {
            if (ShouldIncrementLabel(integrationResult.LastIntegration))
            {
                return Prefix + IncrementLabel();
            }
            else
            {
                return integrationResult.LastIntegration.Label;
            }
        }
        public void Run(IIntegrationResult integrationResult)
        {
            integrationResult.Label = Generate(integrationResult);
        }
        #endregion
        private string IncrementLabel()
        {
            ThoughtWorks.CruiseControl.Core.Util.Log.Debug(“About to read label file. Filename: {0}”, SharedLabelFilePath);
            using (FileStream fileStream = File.Open(this.SharedLabelFilePath,
                     FileMode.OpenOrCreate,
                     FileAccess.ReadWrite,
                     FileShare.None))
            {
                // read last build number from file
                var bytes = new byte[fileStream.Length];
                fileStream.Read(bytes, 0, bytes.Length);
                string rawBuildNumber = Encoding.UTF8.GetString(bytes);
                // parse last build number
                int previousBuildNumber;
                if (!int.TryParse(rawBuildNumber, out previousBuildNumber))
                {
                    previousBuildNumber = InitialBuildLabel – 1;
                }
                int newBuildNumber = previousBuildNumber + 1;
                // increment build number and write back to file
                bytes = Encoding.UTF8.GetBytes(newBuildNumber.ToString());
                fileStream.Seek(0, SeekOrigin.Begin);
                fileStream.Write(bytes, 0, bytes.Length);
                return newBuildNumber.ToString();
            }
        }
        private bool ShouldIncrementLabel(IntegrationSummary integrationSummary)
        {
            return integrationSummary == null || integrationSummary.Status == IntegrationStatus.Success || IncrementOnFailure;
        }
    }
}
This is how you can implement in ccnet.config under project-
         <sharedLabelFilePath>E:\Program Files\CruiseControl.NET\server\buildnumber.txt</sharedLabelFilePath>
Advertisements