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.Collections.Generic;
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
    [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.
    [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();
        return integrationResult.LastIntegration.Label;
    public void Run(IIntegrationResult integrationResult)
      integrationResult.Label = Generate(integrationResult);
    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.txtsharedLabelFilePath>